内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(寄主)。
//外部类
public class people{
//内部类
public class heart{
}
}
内部类的使用场景、作用
1.当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构可以选择使用内部类来设计。内部类通常
2.可以方便访问外部类的成员,包括私有的成员。
3.内部类提供了更好的封装性,内部类本身就可以用private protectecd等修饰,封装性可以做更多控制。
1.静态内部类
有static修饰,属于外部类本身。
他的特点和使用与普通类完全一样,类有的成分它都有,只是位置在别人里面而已
public class Outer{
//静态成员内部类
public static class Inner{
}
}
静态内部类中是否可以直接访问外部类中的静态成员变量(static修饰)?
可以,外部类的静态成员只有一份 可以被共享访问
静态内部类中是否可以直接访问外部类中的实例成员变量?
不可以,因为外部类的实例成员必须用外部类对象访问
静态内部类的使用场景、特点、访问总结。
如果一个类中包含了一个完整的成分,如汽车类中的发动机类。
特点、使用与普通类是一样的,类有的成分它都有,只是位置在别人里面而已。
可以直接访问外部类的静态成员,不能直接访问外部类的实例成员。
注意:开发中实际上用的还是比较少。
2.成员内部类
无static修饰,属于外部类的对象
成员内部类中可以直接访问外部类的静态成员,因为外部类的静态成员只有一份,可以被共享访问;成员内部类的实例方法中可以直接访问外部类的实例成员,因为必须先有外部类对象,才能用成员的内部类对象,所以可以直接访问外部类对象的实例成员。
成员内部类中访问所在外部类对象的格式:外部类名.this.外部类对象
答案分别是 heartbeat this.heartbeat people.this.heartbeat
3.局部内部类
局部内部类放在方法、代码块、构造器等执行体中。
局部内部类的类文件名为: 外部类$N内部类.class。
4.匿名内部类
本质上是一个没有名字的局部内部类,定义在方法中、代码块中等
作用:方便创建子类对象,最终目的是为了简化代码编写。
特点:匿名内部类是一个没有名字的内部类
匿名内部类写出来就会直接产生一个匿名内部类的对象
匿名内部类的对象类型相当于是当前new的那个类型的子类类型(相当于多态)
public class Test {
public static void main(String[] args) {
Anmial a = new Tiger();//多态
//匿名内部类
Anmial b = new Anmial() {
@Override
public void run() {
System.out.println("匿名内部类");
}
};
}
}
abstract class Anmial{
public abstract void run();
}
class Tiger extends Anmial{
@Override
public void run() {
System.out.println("老虎跑得快");
}
}