匿名对象我们经常会用到,但是类呢? 类还能匿名?
类匿名了还能创建对象,并且能创建有名对象和匿名对象。
开发中很少用到,但是在源码中经常会看到以上情形...
现在给定一个抽象类Order
abstract class Order{
public abstract void show();
}
因为Order是抽象的,我们无法通过 Order o = new Order(); 创建Order类的对象 : Cannot instantiate the type Order
我们将该语句添加点内容:
Order o = new Order(){ }; {} 中 提供 抽象类 Order 需要重写的方法
Order o = new Order(){
@Override
public void show() {
System.out.println("this is book order.");
}
};
System.out.println(o.getClass());
System.out.println(o.getClass().getSuperclass());
结果输出为
class com.ylaihui.oop11.OrderTest$1
class com.ylaihui.oop11.Order
分析:对象o的父类是Order,但是没有提供实例化该对象的类的名称,也就是实例化该对象的类是匿名的,但是该对象是有名的,所以现在演示的是抽象类的匿名子类的有名对象
假设有以下方法
public static void method(Order o){
o.show();
}
我们这样调用该方法
method(o);
很明显这是多态的形式, 形参是 Order类型,实参是 Order类的子类对象, Order类的子类是匿名的,对象名是 o
假如我们想给method方法传一个匿名对象,
method(new Order()); 但是这样会报错,Cannot instantiate the type Order
根据上面的写法我们这样补充代码:{} 中提供需要重写的方法
method(new Order(){
@Override
public void show() {
System.out.println("this is computer order.");
}
});
分析:
创建匿名子类的匿名对象,类是没名字的,对象也是没名字的。
以上开发中是少见的,但是在Java的源码中经常会看到这样的用法,见到了这样的源码,能看懂就够了...
实例代码 OrderTest.java
//OrderTest.java
package com.ylaihui.oop11;
abstract class Order{
public abstract void show();
}
public class OrderTest {
public static void method(Order o){
o.show();
}
public static void main(String[] args) {
// Cannot instantiate the type Order
// Order o = new Order();
// Order o = new Order(){}; -- {} 中 提供 抽象类 Order 需要重写的方法
//创建了一匿名子类的对象:p
Order o = new Order(){
@Override
public void show() {
System.out.println("this is book order.");
}
};
System.out.println(o.getClass());
System.out.println(o.getClass().getSuperclass());
// 多态, 形参是 Order类型,实参是 Order类的子类对象, Order类的子类是匿名的,对象名是 o
method(o);
//-----------------------------------------
//创建匿名子类的匿名对象
//method(new Order()); // Cannot instantiate the type Order
//method(new Order(){}); // {} 中提供需要重写的方法
method(new Order(){
@Override
public void show() {
System.out.println("this is computer order.");
}
});
}
}
代码输出
class com.ylaihui.oop11.OrderTest$1
class com.ylaihui.oop11.Order
this is book order.
this is computer order.
关键代码: