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

Java 关于抽象类中方法的快速问题,java,class,oop,abstract,Java,Class,Oop,Abstract,我是一名业余程序员,最近在研究抽象类时偶然发现了这种重写函数的特殊方法: abstract class Test { abstract String message(); } public class Abstract { public static void main(String[] args) { String word = new Test() { String message() { retur

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

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();
从代码的这一特定部分来看,抽象类似乎正在被“实例化”(如果我使用的术语正确的话)。但是,我了解到抽象类不能实例化

我知道这是一个很明显的问题,如果你能向我解释一下,当这部分代码被遵守时,会发生什么事情吗?如果你这样做,我将不胜感激

谢谢,

从代码的这一特定部分来看,抽象类似乎正在“实例化”

不是真的。您看到的是一个匿名类的实例化,它扩展了抽象
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();

    }

}

要完成上述答案,请执行以下操作:

抽象类可以直接在代码中“实例化”。这些被称为“匿名类”。
创建匿名类时,您必须实现该抽象类的每个抽象方法。这也适用于接口。

您可以“实例化”接口类型的对象。您所要做的就是实现这些方法。

您使用的是匿名类(所以这并不意味着您从抽象类创建对象)。 您正在使用类型测试创建对象,该对象由没有名称的类实现,该类具有主体并重写抽象方法
message()
。在body之后键入“.”并从实际对象调用方法,该方法是在匿名类中实现的

它类似于:

abstract class Abs{
  abstract void somemethod();
}

class AbsImpl extends Abs{
@Override
void somemethod(){
  print("hello");
}

Abs abs = new AsbImpl();
abs.somemethod();

// or

new AsbImpl().somemethod();