内部类:就是我是你的一部分,我了解你,我知道你的全部,没有你就没有我。(所以内部类对象是以外部类对象存在为前提的)
以动物园来举例子,动物园(class zoo)里面有猴子(monkey)类,有鱼(fish)类,但鱼和猴子都是zoo类的一部分
public class Zoo {
void say(){
System.out.println("这里是动物园");
}
class fish {
void say() {
System.out.println("我是鱼,我在动物园里面");
}
}
class monkey{
void say(){
System.out.println("我是猴子,我在动物园里面");
}
}
静态内部类:就是我跟你没关系,自己可以完全独立存在,但是我就借你的壳用一下,来隐藏自己。
public class Zoo {
void say(){
System.out.println("这里是动物园");
}
static class fish {
void say() {
System.out.println("我是鱼,不一定要new出动物园才有我");
}
}
class monkey{
void say(){
System.out.println("我是猴子,必须有动物园才能有我");
}
}
public static void main(String[] args) {
Zoo zoo = new Zoo();
Zoo.monkey monkey = zoo.new monkey();
monkey.say();
Zoo.fish fish = new Zoo.fish();
fish.say();
}
}
我是猴子,必须有动物园才能有我
我是鱼,不一定要new出动物园才有我
Process finished with exit code 0
匿名内部类:
匿名内部类比较实用,它比较符合当初设计内部类时的场景。就是在某些场合需要使用类,但这个类只使用一次,以后再也不会使用了。
一个继承了类的子类的匿名对象 或者一个实现了接口的实现类的匿名对象。
开发中,最常用到的内部类就是匿名内部类了。以接口举例,当你使用一个接口时,似乎得做如下几步操作。
1、定义子类
2、重写接口中的方法
3、创建子类对象
4、调用重写后的方法
我们的目的,最终只是为了调用方法,那么能不能简化一下,把以上四步合成一步呢?匿名内部类就是做这样的快捷方式。
以接口为例
public interface Anmial{
String say();
}
public static void main(String[] args) {
Anmial anmial = new Anmial(){
@Override
public String say() {
return "我是接口内部类,没有创建接口的实现类,没有名称,是临时创建的,执行完就被抛弃";
}
};
System.out.println(anmial.say() );
}
我是接口内部类,没有创建接口的实现类,没有名称,是临时创建的,执行完就被抛弃
Process finished with exit code 0