2.1 什么是内部类
所谓的内部类就是在一个类A内部定义另外一个类B,此时类B内部类,类A外部类
2.2 成员内部类以及其特点
/**
-
人类,外部类
*/
public class Person {
int age;
String name;
//内部类
//a.成员内部类(心脏类)
class Heart{
int jumpCount; //心跳次数public void jump(){ System.out.println("心脏砰砰跳~~"); //在成员内部类中可以无条件访问外部类的任何成员 System.out.println(age); System.out.println(name); show(); }
}
public void show(){
//b.局部内部类(了解)
class xxx{}
}
}
成员内部类有两个点:
a.在成员内部类中可以无条件访问外部类的任何成员
b.在测试类中创建成员内部类对象,该怎么写呢???
public class TestDemo {
public static void main(String[] args) {
//1.创建外部类对象
Person p1 = new Person();
//2.创建内部类对象
//Java规定,想要创建内部类的对象,必须先创建外部类的对象
//然后通过外部类对象才能创建内部类对象
//格式:
// Person.Heart 对象名 = new Person().new Heart();
Person.Heart h = new Person().new Heart();
//可以写这么写
Person.Heart h1 = p1.new Heart();
}
}
2.3 内部类编译之后的字节码文件
内部类编译之后的字节码文件名:
外部类名$内部类名.class
比如我们案例中的Heart类,编译之后:
Person$Heart.class
2.4 匿名内部类[重点]
//a.定义接口
public interface Flyable {
public abstract void fly();
}
//b.创建实现类 实现 接口
public class Bird implements Flyable{
//c.重写接口的所有抽象方法
@Override
public void fly() {
System.out.println(“我想要飞,却飞不高…”);
}
}
/**
-
需求: 定义接口,要求创建一个该接口的实现类对象,测试该对象
-
a.定义接口
-
b.创建实现类 实现 接口
-
c.重写接口的所有抽象方法
-
d.测试类中创建实现类对象
-
e.调用实现类的对象方法
*/
public class TestDemo {
public static void main(String[] args) {
//d.测试类中创建实现类对象
Bird b = new Bird();
//e.调用实现类的对象方法
b.fly();//匿名内部类 Flyable ff = new Flyable(){ @Override public void fly() { System.out.println("我想要飞,却飞不高..."); } }; ff.fly();
}
}
总结匿名内部类的格式:
父类名/接口名 对象名 = new 父类名/接口名(){
//重写父类或者接口中所有抽象方法
};