内部类
- 将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类
- 内部类隐藏在外部类之内,更好的实现了信息的隐藏
分类
成员内部类
- 最常见,也称为普通内部类
public class Person{
int age;
public Heart getHeart(){
return new Heart();
}
class Heart {
public String beat(){
return "心跳";
}
}
}
-
内部类在外部使用时,无法直接实例化,需要借由外部类信息才能完成实例化
- 获取内部类对象:
1、外部类.内部类 对象名 = new 外部类().new 内部类();
2、 外部类对象.new 内部类();
3、外部类对象.获取方法;
- 获取内部类对象:
-
内部类可以直接访问外部类的成员;如果出现同名属性,优先访问内类中定义的;
-
可以使用外部类.this.成员的方式,访问同名外部类成员信息
-
外部类访问内部类信息,需要通过内部类实例,无法直接访问
-
内部类编译后.class文件命名:外部类$内部类.class
静态内部类
-
静态内部类中,只能直接访问外部类的静态成员,如果需要调用非静态方法,可以通过对象实例
-
静态内部类对象实例时,可以不依赖于外部类对象
-
可以通过外部类.内部类.静态成员访问类中的静态成员。
获取静态内部类对象
1、new 外部类.内部类();
方法内部类 -
定义在方法内部,作用范围也在方法内
-
和方法内部成员使用规则一样,class前面不可以添加public private protected,static
-
类中不能包含静态成员
-
类中可以包含final、abstract修饰的成员
匿名内部类 -
将类的定义和创建,放到一起完成
-
在实例对象的同时,完成对于对象内容的实现和编写
-
没有类型名称也没有实例名称,只能使用一次
-
.编译后的文件命名:外部类$数字.class
-
无法使用private、public、protected、abstract、static修饰
-
无法编写构造方法,可以添加构造代码块
-
不能出现静态成员
-
匿名内部类可以实现接口也可以继承父类,但是不可兼得
-
匿名内部类不能是抽象的,它必须要实现继承的类或者实现接口的所有抽象方法
-
优点:
对内存损耗,对系统损耗小 -
弊端:
重复调用不方便 -
适用场景:
1、只用到类的一个实例
2、类在定义后马上用到
3、给类命名并不会导致代码更容易被理解
接口中的内部类