匿名类

匿名类(只有类体,没有类声明)分为两种,和类有关的匿名类和与接口有关的匿名类。


和类有关的匿名类:利用类名和类体创建一个匿名对象。此类体被认为是该类的一个子类去掉类声明后的类体,称为匿名类.

  • 匿名类就是一个子类,不能用匿名类声明对象,但可以直接创建对象。
  • 匿名类可以继承父类的方法也可以重写父类的方法。
  • 使用匿名类时必然是在某个类中直接用匿名类创建对象,因此匿名类是一个内部类。可以访问外嵌类中的成员变量和方法,不可以声明static成员变量和方法。
  • 匿名类的主要用途是向方法参数传值。

匿名类创建对象:

class A{
void f(){}
}

public class Examle{
public static void main(String arg[]){
A a=new A(){
void f(){print("C");}
}
a.f();//此时输出的结果是C。new A(){void f(){print("C");}就是匿名类,由类名和类体组成。类名和父类名相同,类体是对父类方法的重写。该匿名类相当于A的子类,省略了声明对象的功能。等价于声明一个继承了类A的子类B,然后用B创建的对象作为a的上转型对象,匿名类将这些过程简化了。
}
}
}

匿名类作为方法参数:

class A{
void getval(int n){print ("0");}
}
class B{
void f(A a){a.getval(3);}
}

main(){
B b=new B();
b.f(new A(){void getval(int n){print(n*n);}})//匿名类创建的对象作为参数,将该对象的引用船队给方法f的参数a。
}

new A(){void getval(int n){print(n*n);}} (匿名类)等价于创建了一个A的子类,重写了f()方法,然后将该对象作为参数传递给对象a,使其转为上转型对象,这样可以调用匿名类重写的方法。


和接口有关的匿名类:
使用接口和类体创建一个匿名对象。此类体被认为是实现了接口的类去掉类声明的类体,称为匿名类。
如果某个方法的参数是接口类型,那么可以使用接口名和类体组合的方式创建一个匿名对象,传递给方法的参数,类体必须要实现接口中的所有方法。

interface Com{
getval(int n);
}

void f(Com x){
x.getval(2);
}

f(new Com(){getval(int n)print(n*n);})//使用匿名类创建对象,将该对象传递给方法f的参数Com

当然也可以使用匿名类创建对象,接口变量存放该对象的引用,可回调实现该接口类中的方法。
Com com=new Com(){getval(int n)print(n*n);}
com.getval(4);
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页