下面代码中,Person24 是一个抽象类,这意味着它不能被直接实例化,只能通过继承它的子类来实现其抽象方法。代码片段中展示了如何使用匿名内部类来实现一个抽象类的实例。
package chapter04;
public class Java24_Object_匿名内部类 {
public static void main(String[] args) {
// TODO 面向对象
// 在某些场合下,类的名字不重要,我们只想要使用类中的方法或功能,那么此时我们可以采用特殊的语法:匿名类
// 所谓匿名类,就是没有名字的类, 创建只使用一次的类的对象
Me me = new Me();
me.sayHello(new Person24() {
@Override
public String name() {
return "zhangsan";
}
});
// 上面匿名类的写法等价于下面的代码
// 创建一个名为 Zhangsan 的类继承自 Person24
class Zhangsan extends Person24 {
@Override
public String name() {
return "zhangsan";
}
}
// 创建 Zhangsan 类的实例并传递给 sayHello 方法
Person24 person = new Zhangsan();
me.sayHello(person);
}
}
abstract class Person24 {
public abstract String name();
}
class Me {
public void sayHello(Person24 person24) {
System.out.println("Hello, " + person24.name());
}
}
下面代码片段中展示了如何使用匿名内部类来实现一个接口的实例。
package chapter04;
public class Java24_Object_匿名内部类 {
public static void main(String[] args) {
// 使用匿名内部类来实现接口 Fly24
new Fly24() {
@Override
public void fly() {
System.out.println("使用飞行器飞翔");
}
}.fly();
// 上面匿名类的写法等价于下面的代码
// 创建一个名为 PersonFly24 的类实现接口 Fly24
class PersonFly24 implements Fly24 {
@Override
public void fly() {
System.out.println("使用飞行器飞翔");
}
}
// 创建 PersonFly24 类的实例并调用 fly 方法
PersonFly24 personFly24 = new PersonFly24();
personFly24.fly();
}
}
// 接口中定义的属性都是常量,不能更改
// 接口中定义的方法都是抽象的
interface Fly24 {
void fly();
}