内部类:更好的实现了信息隐藏;在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类,这样的类称为内部类;与之对应,包含内部类的类被称为外部类。
内部类:
- 成员内部类
- 静态内部类
- 方法内部类
- 匿名内部类
成员内部类:也称为普通内部类
class Outter{
private Inner inner = null;
public Inner getInnerInstance(){
if(inner == null)
inner = new Inner();
return inner;
}
class Inner{//成员内部类
public Inner(){
}
}
}
获取成员内部类的方法:
- new 外部类.new 内部类
- 外部类对象.new 内部类
- 外部类对象.获取方法
成员内部类:1.内部类在外部使用时,不能直接实例化,需要借助由外部类信息才能完成实例化;2.内部类可以通过访问外部类的成员;3.如果出现同名属性,优先访问内部类中定义的;4.外部类访问内部类信息,需要通过内部类实例,无法直接访问;5.内部类的访问修饰符,可以任意,但是访问范围是受到影响;6.可以使用外部类.this.成员的方式,访问外部类中同名的信息;6.内部类编译后.class文件命名:外部类$内部类.class;7.内部类中是可以包含与外部类相同方法签名的方法,内部类如何调用外部类:外部类名称.this.方法。
静态内部类:static修饰内部类
class Outter{
public Outter(){
}
static class Inner{//静态内部类
public Inner(){
}
}
}
1.静态内部类对象可以不依赖于外部类对象,直接创建;2.静态内部类,只能直接访问外部类的静态成员,如果需要调用非静态成员,可以通过对象实例调用;3.创建静态内部类对象实例时,可以不依赖于外部类对象;3.可以通过外部类.内部类.静态成员的方式,访问内部类中的静态成员。4.如果内部类属性与外部类属性同名时,默认直接调用内部类中的成员。5.需要访问外部类的静态属性,可通过外部类.属性的方式。5.需要访问外部类的非静态属性,可以通过new 外部类().属性的方法。
方法内部类:定义在外部类方法中的内部类,也成为局部内部类。
class People(){
public People(){
}
}
class Man{
public Man(){
}
public Peopele getWoman(){
class Woman extends People{//局部内部类
int age = 0;
}
return new Woman();
}
}
方法内定义的局部变量只能在方法里使用,方法内不能定义静态成员。
方法内部类:1.定义在方法内部,作用范围也在方法内;2.和方法内部成员使用规则一样,class前面不可以添加public,private,protected,static;3.类中不能包含静态成员;4.类中可以包含final,abstract修饰的成员。
匿名内部类;没有名字的内部类(只有使用一次),所以将类的定义与类的创建,放到一起完成。
public class Demo {
public static void main(String []args) {
Thread t = new Thread() {//Thread类匿名内部类
public void run() {
for(int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
t.start();
}
}
使用场景:
- 只用到类的一个实例
- 类在定义后马上用到
- 给类命名并不导致代码更容易被理解
注意事项:
- 编译后的文件命名:外部类$数字.class
- 无法使用public,private,abstract,static修饰,匿名内部类不能出现抽象方法
- 无法编写构造方法,可以添加构造代码块
- 不能出现静态成员
- 匿名内部类可以实现接口也可以继承父类,但是不可兼得