这篇写得好啊,写的真的好。
一.内部类
内部类的注意:
1.为什么非静态的内部类中不能出现静态的成员
静态变量是要占用内存的,在编译时只要是定义为静态变量了,系统就会自动分配内存给他,而内部类是在宿主类编译完编译的,也就是说,必须有宿主类存在后才能有内部类,这也就和编译时就为静态变量分配内存产生了冲突,因为系统执行:运行宿主类->静态变量内存分配->内部类,而此时内部类的静态变量先于内部类生成,这显然是不可能的,所以不能定义静态变量!
2.内部类可以使用static修饰,相当于是外部类的一个静态成员类,并且也可以实例化,不需要new使用外部对象就可以直接使用静态内部类,运行时加载时耗费的资源和时长都比较多,静态类在运行前加载,所以在性能上会有提升。
二.匿名内部类
在这里我们看到使用匿名内部类我们必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口。同时它也是没有class关键字,这是因为匿名内部类是直接使用new来生成一个对象的引用。当然这个引用是隐式的。
使用方式1)
interface
Person {
public
void
eat();
}
public
class
Demo {
public
static
void
main(String[] args) {
Person p =
new
Person() {//这样可以使用多次函数,相当于多态
public
void
eat() {
System.out.println(
"eat something"
);
}
};
p.eat();
}
}
使用方式2)
interface
Person {
public
void
eat();
}
public
class
Demo {
public
static
void
main(String[] args) {
new
Person() {
public
void
eat() {
System.out.println(
"eat something"
);
}
}.eat();//这样只能使用一个函数
}
}
注意事项:
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
2、匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
6、匿名内部类使用的形参必须是final的,如果不是编译器会直接报错
7、匿名内部类没有构造函数,一般使用局部代码块进行构造chushh