一:内部类
1.内部类是什么?
内部类是定义在一个类里面的类,里面是类可以理解成(寄生),外部类可以理解成(宿主)。
public class People{
//内部类
public class Heart{
}
}
2.内部类的使用场景、作用
场景
当一个事物的内部,还有一部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构可以选择使用内部类来设计;
- 比如:你定义了一个汽车类,这个汽车类里面可能要有一个发动机类,而系统又要关心发动机类的信息,那就可以将发动机类定义在汽车类内部。这就叫做内部类;
- 比如:你定义了一个人的类,那是不是要关心人的心脏的信息数据,那么这个心脏类就可以定义成内部类。
作用
内部类通过可以方便访问外部类的成员,包括私有的成员;
内部类提供了更好的封装性,内部类本身就可以用proivate protected等修饰,封装性可以做更多控制。
3.内部类的分类
静态内部类[了解即可]
成员内部类(非静态内部类)[了解即可]
局部内部类[了解即可]
匿名内部类[重点了解]
4.静态内部类[了解]
有static修饰,属于外部类本身。
它的特点和使用与普通类完全是一样的,类有的成分它都有,只是位置在别人里面而已。
public class Outer{
//静态成员内部类
public static class Inner{
}
}
静态内部类中可以直接访问外部类的静态成员,外部类的静态成员只有一份可以被共享访问。
静态内部类不可以直接访问外部类的实例成员,外部类的实例成员必须用外部类对象访问,只属于外部类对象本身。
总结:静态内部类的使用场景、特点、访问总结:
场景:如果一个类中包含了一个完整的成分,如汽车类中的发动机类;
5.成员内部类 [了解]
无static修饰,属于外部类的对象;
jdk16之前,成员内部类中不能定义静态成员,jdk16开始也可以定义静态成员了
public class Outer{
//成员内部类
public class Inner{
}
}
6.局部内部类[了解]
局部内部类放在方法、代码块、构造器等执行体中;
局部内部类的类文件名为:外部类$N内部类.class。
7.匿名内部类[重点]
本质上是一个没有名字的局部内部类,定义在方法中、代码块中、等。
作用:方便创建于子类对象,最终目的为了简化代码编写。
格式:
new 类|抽象类名|接口名(){
重写方法;
};
Employee a = new Employee(){
public void work(){
}
};
a.work();
public class Test {
public static void main(String[] args) {
Animal a1 = new Dog(); //之前的形式
a1.run();
}
}
//狗子类
class Dog extends Animal{
@Override
public void run() {
System.out.println("狗怒吃答辩");
}
}
//动物父类
abstract class Animal{
public abstract void run();
}
控制台输出结果:
匿名内部类形式:
public class Test {
public static void main(String[] args) {
Animal a1 = new Animal() {//匿名内部类形式:
@Override
public void run() {
System.out.println("狗吃饱了");
}
}; //之前的形式
a1.run();
}
}
//动物父类
abstract class Animal{
public abstract void run();
}
控制台输出结果:
特点总结:
匿名内部类是一个没有名字的内部类;
匿名内部类写出来就会产生一个匿名内部类的对象;
匿名内部类的对象类型相当于是当前new的那个的类型的子类类型。
匿名内部类的作用是什么?
方便创建子类对象,最终目的为了简化代码编写。