1-1 Java内部类概述
(1)内部类:顾名思义,定义在一个类内部的类就是内部类。InnerClass对应其外部的就是外部类OuterClass。
(2)Java内部类种类:成员内部类,静态内部类,局部内部类(方法内部类),匿名内部类。
(3)内部类的四大特点:
a)提供更好的封装:可以被public,default,protected和private访问修饰符修饰(而外部顶级类即类名和文件名相同的只能使用public或default)。
b)访问外部类数据无限制:内部类的方法可以直接访问外部类的所有数据,包括私有数据。
c)外部类不能直接访问内部类的数据:必须先创建内部类的对象,再通过此对象进行访问。
d)解决一些问题:间接实现多重继承。避免修改接口而实现同一个类中两种同名方法的调用问题。
(4)注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。编译完成后出现Outer.class和Outer$Inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。
1-2 成员内部类(普通内部类)
a)定义在外部类的内部,相当于外部类的一个成员变量,
Inner类可以使用任意的访问控制符修饰。一般用private修饰。
b)Inner 类中定义的方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响。
c)new一个内部类对象必须使用外部类对象来创建内部类对象即:外部类.内部类 内部类对象名 = 外部类对象.new 内部类( );
d)外部类是不能直接使用内部类的成员和方法-可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。
注意:外部内的静态方法里无法对内部类进行实例化。
e)如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字:外部类名.this.属性/方法。
f)成员内部类的一些限制:成员内部类不能与外部类重名。不能在成员内部类中定义static属性,方法和类(static final常量除外)。
g)内部类里面还能嵌套内部类。
h)把接口看成特殊类,故也存在内部接口。
1-3 静态内部类(被static修饰的普通内部类)
a)静态内部类和外部类没有任何关系,只是在生成类名和类定义时有影响。可以把静态内部类看成与外部类平级的类。使用方法与外部类平级的类完全一样。
b)创建静态内部类的实例:外部类.内部类 内部类对象名 = new 外部类名.内部类名( );
c)注意:成员内部类不能与外部类重名,静态内部类不能访问外部类的非静态属性和方法。外部类不能访问内部类的非静态属性和方法。
d)如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,不需使用 this 关键字:外部类名.属性/方法。
e)静态内部类里面还能其他静态内部类:嵌套静态内部类。
f)什么时候用静态内部类?==> 当B为A的辅助类,且只为A所用时,可将B定义为A的静态内部类。
1-4 匿名内部类
(1)匿名内部类的特点:
a)匿名内部类是没有名称的内部类,没有办法引用它:必须在创建时作为new语句的一部分来声明并创建它们的实例。
b)匿名内部类必须继承一个类(抽象的,非抽象的都可以)或者实现一个接口。若父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法。
c)匿名内部类可以定义代码块(代码块优先于构造方法先执行),用于实例初始化。但不能是静态代码块。
(2)匿名内部类语法: new interface /superclass(){//类体};
声明了一个新的匿名类,它对一个给定的类进行了扩展,或者实现了一个给定的接口,并且同时创建了此匿名类的一个新实例。
1-5 方法内部类
(1)方法内部类(局部内部类)的特点:
a)定义在外部类的方法中,故它只有在此方法体内部可见,只能在方法体内部实例化。
b)方法内部类不能使用访问控制符和static修饰符。