关于抽象类方法的快速问题

问题描述 投票:2回答:2

我是一名业余程序员,最近在研究抽象类时偶然发现了一种覆盖函数的特殊方法:

abstract class Test {

    abstract String message();
}

public class Abstract {

    public static void main(String[] args) {

       String word = new Test() {

           String message() {
               return "Hello World";
           }

       }.message();

    }

}

我对代码的这一部分感到困惑:

String word = new Test() {

           String message() {
               return "Hello World";
           }

       }.message();

通过查看代码的这一特定部分,似乎抽象类正在“实例化”(如果我正确使用了该术语)。但是,我了解到不能实例化抽象类。

我知道这是一个很明显的问题,是否可以向我解释在编译那部分代码时发生了什么?如果您这样做,我将不胜感激。

谢谢,

java class oop abstract
2个回答
1
投票

通过查看代码的这一特定部分,似乎抽象类正在“实例化”]

不是。您将看到一个匿名类的实例,该类扩展了抽象Test类,并实现了该类的抽象message()方法。匿名类不是抽象的,因此可以实例化。

等效代码为:

public class SubTest extends Test (
    String message() {
        return "Hello World";
    }
}

public class Abstract {

    public static void main(String[] args) {

        String word = new SubTest().message();

    }

}

0
投票

要完成上述答案:

可以直接在代码中“实例化”抽象类。这些被称为“匿名类”。创建匿名类时,您必须实现该抽象类的每个抽象方法。这也计入接口。您可以“实例化”接口类型的对象。您要做的就是实现方法。

© www.soinside.com 2019 - 2024. All rights reserved.