内部类:
1、内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成 员,但外部类不能访问内部类的实现细节,例如内部类的属性。 2、匿名内部类适合于创建那些仅需要一次使用的类。3、当调用非静态内部类的实例方法时,必须有一个非静态内部类实例,而非静态内部类实例必须寄存在外部类实例里。
非静态内部类演示:
- package bin;
- public class Cow
- {
- private double weight;
- public Cow(){}
- public Cow(double weight)
- {
- this.weight = weight;
- }
- //定义一个非静态内部类
- private class CowLeg
- {
- private double length;
- private String color;
- public CowLeg(){}
- public CowLeg(double length,String color)
- {
- this.length = length;
- this.color = color;
- }
- public void setLength(double length)
- {
- this.length = length;
- }
- public double getLength()
- {
- return length;
- }
- public void setColor(String color)
- {
- this.color = color;
- }
- public String getColor()
- {
- return color;
- }
- public void info()
- {
- System.out.println("当前牛腿颜色是:"+ color + ",高: "+ length);
- //直接访问外部类的private属性:weight
- System.out.println("本牛腿所在奶牛重:"+ weight);
- }
- }
- public void test()
- {
- CowLeg cl = new CowLeg(1.12,"黑白相间");
- cl.info();
- }
- public static void main(String[] args)
- {
- Cow cow = new Cow(378.9);
- cow.test();
- }
- }
4、如果外部类成员变量、内部类成员变量与内部类里的方法的局部变量同名,则可以使用this、外部类类名.this作为限定来区分。例:
- package bin;
- public class DiscernVariable
- {
- private String prop = "外部类的实例变量";
- public class InClass
- {
- private String prop = "内部类的实例变量";
- public void info()
- {
- String prop = "局部变量";
- //通过 外部类类名.this.varName 访问外部类实例 Field
- System.out.println("外部类实例的Field值:"+ DiscernVariable.this.prop);
- //通过 this.varName 访问内部类的实例 Field
- System.out.println("内部类实例的Field值:"+ this.prop);
- //直接访问局部变量
- System.out.println("局部变量的值:"+ prop);
- }
- }
- public void test()
- {
- InClass in = new InClass(); //*创建内部类对象*
- in.info();
- }
- public static void main(String[] args)
- {
- new DiscernVariable().test();
- }
- }
- /*
- 结果: 外部类实例的Field值:外部类的实例变量
- 内部类实例的Field值:内部类的实例变量
- 局部变量的值:局部变量
- */
5、非静态内部类的成员只在非静态内部类范围内是可知的,并不能被外部类直接使用。
6、*非静态内部类对象必须寄存在外部类对象里,而外部类对象则不必一定有非静态内部类对象寄存其中。*
7、不允许在在外部类的静态成员中直接使用非静态内部类。例:
- class StaticTest
- {
- //定义一个非静态内部类的空类
- private class In{}
- //外部类的静态方法
- public static void main(String[] args)
- {
- new In();//代码引发异常,因为静态成员(main方法)无法访问非静态成员(In类)
- }
- }
8、Java不允许在非静态内部类的定义静态成员。例: