一、实例内部类
1.语法
在一个类当中创建的另一个类叫实列内部类
public class OuterClass { class InnerClass{ } }
2.实例内部类的实例化方式
public class Test { OuterClass outerClass = new OuterClass(); OuterClass.InnerClass innerClass = outerClass.new InnerClass(); }
(1)实例化内部类需要先实例化外部类对象
(2)类型是 外部类名.内部类名 实例化名称 = 外部类对象.new 内部类();
3.外部类与内部类的成员属性以及成员方法
public class OuterClass { public int A = 10; public static int B = 20; public void OuterTest(){ System.out.println(A);//10 System.out.println(B);//20 } class InnerClass{ public int C = 30; //public static D = 40; public static final int D = 40; public int A = 50; public void InnerTest(){ System.out.println(C);//30 System.out.println(D);//40 System.out.println(A);//50 System.out.println(OuterClass.this.A);//10 } } }
(1)内部类当中不可以创建静态成员变量和方法,静态成员及方法不依赖于实例化对象,而内部类又不能直接使用,如上文所说需要先实例化外部类对象才能实例化内部类对象,所以内部类当中的静态成员的定义需要加上final
(2)外部类和内部类有重名的成员变量,优先使用当前类中的成员变量。如果在内部类当中想要调用外部类的成员变量需要通过 外部类名.this.变量名
4.注意事项
(1)外部类的成员在实列内部类方法当中可以直接访问
(2)外部类中,不能直接访问内部类成员,如果要访问,先要实例化内部类对象
二、静态内部类
1.语法
public class OuterClass { static class StaticInnerClass{ } }
在内部类前加上一个static
2.静态内部类的实例化方式
public class Test { OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass(); }
静态内部类不同于实例内部类,静态类内部类通过类名直接实例化
注意是通过 new OuterClass.StaticInnerClass();
而不是 new OuterClass().StaticInnerClass();
前者是直接通过类名.静态内部类
后者是外部类对象.静态内部类
静态不依赖于对象
3.外部类与静态内部类的成员属性以及成员方法
public class OuterClass { public int A = 10; public static int B = 20; public void OuterTest(){ System.out.println(A);//10 System.out.println(B);//20 } static class StaticInnerClass{ public int C = 30; public static int D = 40; public void StaticInnerClassTest(){ //System.out.println(A); System.out.println(out.A); System.out.println(B); System.out.println(C); System.out.println(D); } } }
(1)静态内部类当中调用外部类的非静态成员变量时会报错,因为实例化静态内部类时没有创建外部类对象,而非静态成员变量需要外部类对象调用
(2)静态内部中调用外部类成员需要通过 外部类对象.成员变量 来调用
三、匿名内部类
1.语法
这里new Itest() 相当于 一个类实现了Itest接口并且重写了里面的func方法