一、和类有关的匿名类
定义:Java允许直接使用一个类的子类的类体创建一个子类对象
假设People是类,那么下列代码就是用People的一个子类
(匿名类)创建对象:
new People () {
匿名类的类体
};
与类有关的匿名类示例:
// 抽象类:只有方法头
abstract class Vehicles{
public abstract void show();
}
// 定义一个类,隐匿继承抽象类
class Car{
public Car(Vehicles vh) { // 声明抽象类对象
vh.show();
}
public void Show(Vehicles vh) {
vh.show();
}
}
public class mainclass {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Vehicles vh = new Vehicles() { // 利用匿名类,实例化抽象类对象
public void show() {
System.out.println("抽象类利用匿名类实例化对象成功!");
} // 用匿名类创建对象时,要直接使用父类的某个构造方法。
};
vh.show();
// 实例化子类对象,并用匿名类创建抽象类对象
Car c = new Car(new Vehicles(){
public void show() {
System.out.println("通过实例化子类对象创建抽象类对象成功!");
}
});
c.Show(new Vehicles() {
public void show() {
System.out.println("利用普通方法通过匿名类实例化抽象类对象成功!");
}
});
}
}
二、与接口有关的匿名类
定义:Java允许直接用接口名和一个类体创建一个匿名对象,此类体被认为是实现了Computable接口的类去掉类声明后的类体,称作匿名类。
下列代码就是用实现了Computable接口的类(匿名类)创建对象:
new Computable() {
实现接口的匿名类的类体
};
与接口有关的匿名类示例:
// 接口:抽象方法
interface Ship{
public abstract void f();
}
class Boad{
public Boad(Ship s) {
s.f();
}
// 通过调用不同的方法重写接口中的抽象方法
public void g(Ship s) {
s.f();
}
}
public class interface_mainclass {
public static void main(String[] args) {
// TODO 自动生成的方法存根
// 先实例化接口对象
Ship s = new Ship() {
public void f() {
System.out.println("匿名类直接实例化接口对象成功!");
}
};
s.f();
// 实例化子类对象并调用构造方法通过匿名类实例化接口对象
Boad b = new Boad(new Ship() {
public void f() {
System.out.println("实例化子类对象并调用构造方法通过匿名类实例化接口对象");
}
});
// 调用子类对象方法通过匿名类创建接口对象并重写接口中的抽象方法
b.g(new Ship() {
public void f() {
System.out.println("调用子类对象方法通过匿名类创建接口对象并重写其抽象方法");
}
});
}
}
匿名类可以继承父类的方法也可以重写父类的方法。使用匿名类时,必然是在某个类中直接用匿名类创建对象,因此匿名类一定是内部类。用匿名类创建对象时,要直接使用父类的某个构造方法。