什么是内部类?将一个类 A 定义在另一个类 B 里面,里面的那个类 A 就称为内部类,B 则称为外部类。
引入: 在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,汽车类Car
中包含发动机类Engine
,这时,Engine
就可以使用内部类来描述,定义在成员位置。
成员内部类: 定义在类中方法外的类,叫做成员内部类。
定义格式:
class 外部类{ class 内部类{...} ... }
创建内部类对象格式:外部类.内部类 对象名 = new 外部类().new 内部类();
访问演示,代码如下:
【定义类】 public class Person { private boolean live = true; private int rate = 60 public void show(){ // 外部类获取内部类变量 Heart h = new Heart(); h.rate; } class Heart { private int rate = 75; public void jump() { int rate = 100; // 直接访问外部类成员 if (live) { System.out.println(rate); // 方法中变量访问 System.out.println(this.rate); // 内部类中变量访问 System.out.println(Person.rate); // 外部类中变量访问 System.out.println("心脏在跳动"); } else { System.out.println("心脏不跳了"); } } } public boolean isLive() { return live; } public void setLive(boolean live) { this.live = live; } } 【定义测试类】 public class InnerDemo { public static void main(String[] args) { // 创建外部类对象 Person p = new Person(); // 创建内部类对象 Person.Heart heart = p.new Heart(); // 调用内部类方法 heart.jump(); // 调用外部类方法 p.setLive(false); // 调用内部类方法 heart.jump(); } } /* 输出结果: 心脏在跳动 心脏不跳了 */
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的 .class 文件,但是前面冠以外部类的类名和$符号。 比如:Person$Heart.class
访问特点:
new 类名/接口(){ //如果父类型有抽象方法,需要全部重写 }
特点分析:
接口:
interface Flyable{ void fly(); }
① 直接调用方法
new Flyable(){ @Override public void fly(){ System.out.println("不知道什么在飞111111"); } }.fly();
② 当做方法的参数传递
public static void showFlyable(Flyable flyable){ flyable.fly(); }
showFlyable(new Flyable(){ @Override public void fly(){ System.out.println("不知道什么在飞22222222"); } })
③ 当做方法的返回值使用
public static Flyable getFlyable(){ return new Flyable(){ @Override public void fly(){ System.out.println("不知道什么在飞333333"); } } }