内部类
class A{
class B{
}
}
编译后的结果:
内部类编译后都是以这种形式:外部类$内部类
如何生成内部类:
class Test{
public static void main(String args []){
A a = new A();
A.B b = new A().new B();
}
}
注意点:
class A{
int i;
class B{
int j;
int funB(){
int result = i + j; //这里可以使用外部类的变量
return result;
}
}
}
B是A的内部类,B可以使用A的成员变量,但不是继承它,仅仅是可以使用。
匿名内部类
正常的程序:
interface A{
public void doSomething();
}
class B{
public void fun(A a){
System.out.println("B类的fun函数");
a.doSomething();
}
}
class AImpl implements A{
public void doSomething(){
System.out.println("doSomething");
}
}
class Test{
public static void main(String args []){
AImpl al = new AImpl();
A a = al;
B b = new B();
b.fun(a);
}
}
使用匿名内部类后的Test类:
class Test{
public static void main(String args []){
//AImpl al = new AImpl();
//A a = al;
B b = new B();
b.fun(new A(){
public void doSomething(){
System.out.println("匿名内部类");
}
});
}
}
因为b.fun() 函数需要一个A类的对象,而A是一个接口,是无法生成一个对象的。
我们在Test中,new A()表示我们要实现一个接口,但没有名字,后面的大括号去复写接口的方法,所以被称为匿名内部类。
new A(){
public void doSomething(){
System.out.println("匿名内部类");
}
}
这段代码就是用来生成匿名内部类对象,用来作为fun函数的参数。