1.和类有关的匿名类
当使用类创建对象时,程序允许把类体和与对象的创建组合在一起,也就是说,类创建对象时,除了构造方法还有类体,此类体被认为是该类的一个子类去掉类的声明后的类体,称为匿名类。
匿名类就是一个子类,由于没有名字,所以不可能用匿名类声明对象,但却可以用匿名类直接创建一个对象。
例:假设People是类,下面就是用People的一个子类(匿名类)创建对象:
new People(){
匿名类的类体
}
因此,匿名类可以继承和重写父类的方法。
使用匿名类时,必然是在某个类中直接用匿名类创建对象,因此,匿名类一定是内部类。
尽管匿名类创建的对象没有经过类声明步骤,但匿名对象的引用必须传递给一个匹配的参数,匿名类的主要用途就是向方法的参数传值。
例:假设f(B x)是一个方法:
void f(B x){
x调用B类中的方法
}
其中参数是B类对象,那么在调用方法f时可以向其参数x传递一个匿名对象,例如:
f(new B(){
匿名对象的类体
}
)
如果匿名类继承了父类的方法,x就调用继承的方法,如果匿名类重写了父类的方法,x就调用重写的方法。
例:
class Cubic {
double getCubic(int n){
return 0;
}
}
abstract class Sqrt{
public abstract double getSqrt(int x);
}
class AB{
void f(Cubic cubic){
double result = cubic.getCubic(3);// cubic执行匿名类体中重写的getCubic方法
System.out.println(result);
}
}
public class NimingExample{
public static void main(String args[]){
AB ab = new AB();
ab.f(new Cubic()// 使用匿名类创建对象,将对象传递给方法f的参数cubic
{
double getCubic(int n){
return n * n * n;
}
}
);
Sqrt ss = new Sqrt()// 使用匿名类创建对象,ss是该对象的上转型对象
{
public double getSqrt(int x){// 匿名类是abstract类Sqrt的一个子类,所以必须要实现getSqrt方法
return Math.sqrt(x);
}
};
double m = ss.getSqrt(5);// 上转型对象调用子类重写的方法
System.out.println(m);
}
}
2.和接口有关的匿名类 (类似 和类有关的匿名类 )
假设Computable是一个接口,那么,Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了Computable接口的类去掉声明后的类体,称为匿名类。
例:接口类创建对象
new Computable(){
实现接口的匿名类的类体
}
如果某个方法的参数是接口类型,那么可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须要实现接口中的全部方法。例:
void f(Computable x){
…
}
其中参数x是接口,那么在调用方法f时,可以向方法f的参数x传递一个匿名对象,例如:
f(new Computable(){
实现接口的匿名类的类体
}
)
例:
interface Cubic {
double getCubic(int n);
}
interface Sqrt{
public double getSqrt(int x);
}
class ABC{
void f(Cubic cubic){
double result = cubic.getCubic(3);// cubic执行匿名类体中实现的getCubic方法
System.out.println(result);
}
}
public class NimingExample2{
public static void main(String args[]){
ABC abc = new ABC();
abc.f(new Cubic(){// 使用匿名类创建对象,将对象传递给方法f的参数cubic
public double getCubic(int n){
return n * n * n;
}
}
);
Sqrt ss = new Sqrt(){// 使用匿名类创建对象,接口ss存放该对象的引用
public double getSqrt(int x){// 匿名类是实现Sqrt接口的类,所以必须要实现getSqrt方法
return Math.sqrt(x);
}
};
double m = ss.getSqrt(5);// 接口回调类实现的方法
System.out.println(m);
}
}