繁体   English   中英

Java:通过主方法的抽象类调用

[英]Java: Abstract Class Invocation via Main Method

好吧,人们可能只是通过阅读标题并且没有真正阅读问题而将其标记为副本。 所以请知道我已经尝试在这个平台上查看其他问题,但是没有找到能够完全解决我怀疑的问题。 请允许我伸出手来问我的问题。 提前致谢。

接口绝对是抽象的,无法实例化; Java抽象类也无法实例化,但如果存在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();

    }

}

打印出来的

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

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

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

现在你的问题

接口绝对是抽象的,无法实例化; Java抽象类也无法实例化,但如果存在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

如果你想知道在实例化anynomous类时是否调用抽象类构造函数,那么答案也是YES。 当调用子类构造函数时,它通过执行super()调用来调用超类构造函数。 所以抽象类构造函数也会被调用。 http://www.thejavageek.com/2013/07/21/initialization-blocks-constructors-and-their-order-of-execution/

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

在您的示例中,匿名类extend了抽象类(或implement了一个接口,如果指定了一个接口)。 因此, p不会分配给abstract类实例,而是分配给扩展抽象类的类的实例

Java抽象类也无法实例化,但如果存在main(),则可以调用它。

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

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

    }
}

对于Java7, interface也是如此,使用Java8,你可以在interface内部使用静态main方法,因此Java8也是如此。

你的第二个问题,同时创造的一个实例Printer已定义的子类的Printer ,以及,但你不能用这个定义实现Printer再次(因为不存在与实施相关的名称),因此,它的匿名。

Java抽象类也无法实例化,但如果存在main(),则可以调用它。

这是无稽之谈。 可以调用抽象类的任何静态方法。 不只是main().

其次,我看过以下示例......并且被告知匿名类正在运行。

那是对的。

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

它是在这里实例化的匿名类,它扩展了抽象类,并提供了抽象方法的实现。 对该类的引用存储在Person p ,因为Person是匿名类的超类。 您可以为任何其他类或接口执行此操作。 这里没有什么新东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM