成员内部类:一个类的对象依赖于另一个类: 与类的属性和方法平级,依赖外部类存在(只能依赖外部类来创建内部类的对象) 特点: 内调外: 1.成员内部类可以直接访问外部类的所有成员,包括静态和非静态以及私有变量和方法。 持引用: 2.成员内部类可以拥有外部类的引用,去调用外部类的成员属性和方法,也可以直接调用。如:外部类名.this. 外部类的属性或方法 3.成员内部类中不能声明类变量和方法 如何创建对象: 4.在main方法中成员内部类对象的创建要通过外部类的对象来创建,如:new 外部类.new 内部类 在外部类中创建成员内部类的对象可以直接创建。 局部内部类:写在方法体中,只能在方法中使用,每调用一次方法创建一次对象 1.写在方法中,只在当前方法中有效 2.如果写在静态方法中,只能调用外部类中静态的静态变量和方法,且不能持有外部类的引用。 3.如果写在非静态的方法中,那么可以调用所有非私有的外部类成员。 4.只有在非静态方法中的局部内部类才可以持有外部类的引用,静态方法中定义的内部类不能持有外部类的引用。 静态内部类:一个类的对象依赖于另一个类,并且该类可以单独存在。 == 成员内部类 + static ; 独立存在(可独立创建内部类的对象,或者依赖外部类来创建静态内部类的对象) 内调外: 1.静态内部类中不能直接访问外部类的成员变量和方法,静态内部类中不能持有外部类的引用。 只能通过创建外部类的对象来访问外部类的成员变量和方法,以及私有的成员变量和方法。 2.静态内部类可以直接访问外部类中的静态变量和方法。 外调内: 3.外部类访问内部类的成员变量或者方法要通过内部类的对象来调用。 4.外部类可以通过类名调用内部类的所有静态变量或方法。 匿名内部类:在方法参数中使用的,只能使用一次。 语法:new 父类或者父接口(){ 。。。} A。与类有关的匿名内部类 B。与接口有关的匿名内部类 1.匿名内部类可以访问外部类中的成员变量和方法 2.匿名内部类不可以声明静态的变量和方法 ----------------------------------------------------------------------------------------------------------------------------------------------- 面试题:
如果成员内部类中成员变量名和外部类成员变量名相同如何访问? public class Outer { private int number=100;//外部类成员变量 public class Inner{//内部类 private int number=200; public void print(){ System.out.println(number);//内部类成员变量 System.out.println(Outer.this.number);//外部类成员变量 } } }