Java1.1开始引入内部类。
一、为什么引入内部类
相比于C++,java中的内部类和接口,通常可以提供“多重继承”的解决方案。
二、什么是内部类
一个类定义在另一个类内部。
三、内部类的分类
内部类分成员内部类、静态嵌套类、方法内部类、匿名内部类。
四、内部类的特征
(1)、内部类是独立的类。编译后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
(2)、内部类不能以通常访问类的方式访问。内部类是外部类的一个成员,因此,内部类可以自由的访问外部类所有的成员变量。
(3)、内部类被声明成静态的后,就不能随便访问外部类的成员变量,只能访问外部类的静态成员变量。
五、成员内部类
作为外部类的一个成员。
Class Outer{
Class Inner{}
}
访问方式:
(1)、从外部类的非静态方法中实例化内部类对象。
(2)、从外部类的静态方法中实例化内部类对象,必须先创建外部类对象。
(3)、内部类可以使用this引用当前对象。
(4)、内部类可用的修饰符有:final,abstract,public、private、protested、strictfp、static。一旦用static修饰内部类,它就变成静态内部类了。
六、方法内部类
类放在方法内。
Class Outer{
Public void dosomething(){
Class Inner{
}
}
}
访问方式:
(1)、方法内部类智能在定义该内部类的方法内实例化。
(2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。
(3)、方法内部类没有访问修饰符。
(4)、 静态方法里的静态内部类只能访问外部类的静态成员。
七、匿名内部类
没有名字的内部类。
匿名内部类适用的时机:
(1)、只用到类的一个实例。
(2)、 类在定义后马上用到。
(3)、类非常小。
(4)、给类命名并不会导致代码更容易被理解。
匿名内部类使用的原则:
(1)、匿名内部类无构造函数。
(2)、 匿名内部类不能定义任何静态成员、方法和类。
(3)、匿名内部类修饰符不能是public、protected、private、static。
(4)、 智能创建匿名内部类的一个实例。
(5)、一个匿名内部类一定是在new之后,用来隐含实现一个借口或实现一个类。
(6)、方法内部类的所有限制对匿名内部类都有效。
匿名内部类的样式:
(1)、 继承式匿名内部类:
class Car {
public void drive() {}
}
class Test {
public static void main(string[] args){
Car car = new Car(){
public void drive(){
System.out.println("Driving another car !");
}
};
car.drive();
}
}
建立匿名内部类的关键点是重点重写父类的一个或多个方法。
(2)、接口式的匿名内部类。
Interface Vehicle{
Public void drive();
}
class Test{
public static void main(String[] args){
Vehicle v = new Vehicle(){
public void drive(){}
};
v.drive();
}
}
接口式的匿名内部类实现了一个借口的匿名类。
(3)、 参数式的匿名内部类。
class Bar{
void doStuff(Foo f){}
}
Interface Foo{
void foo();
}
class Test{
Static void go(){
Bar b = new Bar();
b.doStuff(new Foo(){
public void foo(){
System.out.println();
}
);
}
}
八、静态嵌套类
静态内部类只是在另一个类的内部。没有外部类对象时,也能够访问它。静态嵌套类不能访问外部类的非静态的成员和方法。
Class Outer{
Static class Inner{}
}