java基础---内部类和匿名内部类

时间:2020-12-27 15:35:50

内部类

class A{

class B{

}
}

编译后的结果:

java基础---内部类和匿名内部类

内部类编译后都是以这种形式:外部类$内部类

 

如何生成内部类:

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函数的参数。