好的,人们可能会跑去将其标记为重复,只需阅读标题而不真正阅读问题即可。因此,请知道我曾经尝试在该平台上查看其他问题,但还没有找到能完全消除我疑虑的东西。请允许我伸出手问我的问题。提前致谢。


  接口绝对是抽象的,不能实例化; Java抽象类也无法实例化,但是可以在存在main()的情况下调用。


我不完全理解声明的后半部分。这是在说main方法直接在抽象类本身内部吗?它是在谈论通过孩子的main方法调用抽象类吗?或两者 ?

其次,我看到了如下示例。

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()
               {
                    ...
               }
          }
     }
}


并被告知匿名班正在上课。但是,我真的不明白该怎么做,因为变量“ p”显然被分配给了……这是一个抽象类变量!这怎么可能呢?我以为抽象类不能被实例化或初始化。

任何帮助,将不胜感激。

最佳答案

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


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

这只是行动中的多态。通过在此处创建匿名类,您将创建Printer的子类,并使用多态性使用超类引用变量p来引用子类的对象,该对象是匿名的,但由于以下语法而扩展了Printer

Printer p = new Printer(){...}


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

package com.test;

public interface SomeInterface {

    public void SomeMethod();

}


和下面的一个类
打包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();

    }

}


打印出来


  耶!创建一个实现SomeInterface的匿名类


这意味着该语法创建了一个匿名类,该匿名类扩展了抽象类或实现了引用变量用于实例化的接口。它调用子类的方法。

您可以参考jsl。https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.1

现在你的问题


  接口绝对是抽象的,不能实例化; Java抽象类也无法实例化,但是可以在存在main()的情况下调用


我从您的问题中了解到的是,是否要知道是否可以在不实例化主方法的情况下在抽象类中运行main方法,答案是“是”。

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


如果您想知道在实例化匿名类时是否调用了抽象类构造函数,那么答案是“是”。
每当调用子类构造函数时,它都会通过调用super()来调用超类构造函数。因此抽象类构造函数也将被调用。
http://www.thejavageek.com/2013/07/21/initialization-blocks-constructors-and-their-order-of-execution/

关于java - Java:通过Main方法进行抽象类调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30430875/

10-13 06:31
查看更多