Java: 摘要 Class 通过 Main 方法调用

Java: Abstract Class Invocation via Main Method

好吧,人们可能会 运行 将其标记为重复,只是通过阅读标题而不是真正阅读问题。所以请知道,我曾尝试查看此平台上的其他问题,但没有找到可以完全消除我疑虑的内容。请允许我伸出手来问我的问题。提前致谢。

Interface is absolutely abstract and cannot be instantiated; A Java abstract class also cannot be instantiated, but can be invoked if a main() exists.

后半句我不是很理解。这是在谈论直接在抽象 class 本身中的主要方法吗?它是在谈论通过 child 的主要方法调用抽象 class 吗?或者两者兼而有之?

其次,我看到了像下面这样的例子。

abstract class Printer
{
     public void print() { … };
}

public class TestPrinter
{
     public static void main( String[] args )
     {
          // use of anonymous class
          final Printer p = new Printer()
          {
               @override
               public void print()
               {
                    ...
               }
          }
     }
}

并且被告知匿名 class 在工作。但是,我真的不明白如何,因为变量 'p' 显然被分配给......而且它是一个抽象的 class 变量!这怎么可能呢?我认为抽象 classes 不能实例化或初始化。

如有任何帮助,我们将不胜感激。

 final Printer p = new Printer()
      {
           @override
           public void print()
           {
                ...
           }
      }

这意味着创建了一个匿名 class,其中 extends Printer 和变量 p 引用子 class 实例。

这只是 多态性 的作用。通过在此处创建匿名 class,您正在创建 Printer 的子 class 并且 使用多态性,您正在使用 superclass 引用变量 p 引用 subclass 的对象,它是匿名的,但由于下面的语法

而扩展了 Printer
Printer p = new Printer(){...}

而且这不仅限于抽象class,您还可以创建一个匿名的class实现和接口。考虑下面的例子。

package com.test;

public interface SomeInterface {

    public void SomeMethod();

}

和下面的 class 包裹 com.test;

public class TestAnonymous {

    public static void main(String[] args) {

        SomeInterface obj = new SomeInterface() {

            @Override
            public void SomeMethod() {

                System.out
                        .println("Yaayy!!! Creating an anonymous class which implements SomeInterface ");

            }
        };

        obj.SomeMethod();

    }

}

输出

Yaayy!!! Creating an anonymous class which implements SomeInterface

What is means that the syntax creates an anonymous class 它扩展抽象 class 或实现其引用变量用于实例化的接口。它调用 subclass 的方法。

可以参考jslhttps://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.1

现在你的问题

Interface is absolutely abstract and cannot be instantiated; A Java abstract class also cannot be instantiated, but can be invoked if a main() exists

我从你的问题中了解到,你是否想知道main方法是否可以抽象运行而不实例化它class,答案是

package com.test;

public abstract class AbstractClass {

    public static void main(String[] args) {

        System.out.println("main method in abstract class");

    }

}

使用java AbstractClass编译并调用它,它应该打印

main method in abstract class

如果你想知道抽象class构造函数在实例化任意class时是否被调用,那么答案也是肯定的。 每当调用 subclass 构造函数时,它都会通过调用 super() 来调用 super class 构造函数。所以 abstract class 构造函数也会被调用。 http://www.thejavageek.com/2013/07/21/initialization-blocks-constructors-and-their-order-of-execution/

abstract class 与任何其他 class 一样 - 除了它不能直接实例化这一事实。我想您知道这种设施的用途。因此它很可能有一个 main(),这是一个 static 方法,而不是实例方法

您的示例中的匿名 class,extend 是抽象 class(或者 implement 是接口,如果指定的话)。所以 p 没有分配给 abstract class 实例,而是分配给扩展抽象 class

的 class 的实例

A Java abstract class also cannot be instantiated, but can be invoked if a main() exists.

由于 main() 方法是静态的,因此无需实例化即可调用。例如

abstract class AbstractClass{
    public static void main(String[] args){

    }
}

对于 interface 直到 Java7,情况并非如此,对于 Java8,您可以在 interface 中使用静态 main 方法,因此对于 [=25] 也是如此=]

你的第二个问题,在创建 Printer 的实例时你也定义了 Printer 的子 class 但你不能使用 [=14 的这个定义的实现=] 再次(因为没有与实现关联的名称),因此,它是匿名的。

A Java abstract class also cannot be instantiated, but can be invoked if a main() exists.

胡说八道。可以调用抽象 class 的任何静态方法。不只是 main().

Secondly, I have seen examples like the following ... and have been told that an anonymous class is at work.

没错。

But, I seriously do not understand how, since the variable 'p' is clearly being assigned to... and it's an abstract class variable!! How is that even possible? I thought abstract classes can not be instantiated or initialized.

这里实例化的是匿名class,扩展抽象class,并提供抽象方法的实现。 class 的 reference 被存储到 Person p 中,因为 Person 是匿名 class 的超 class ].您可以为任何其他 class 或界面执行此操作。这里没有什么新鲜事。