好的,人们可能会跑去将其标记为重复,只需阅读标题而不真正阅读问题即可。因此,请知道我曾经尝试在该平台上查看其他问题,但还没有找到能完全消除我疑虑的东西。请允许我伸出手问我的问题。提前致谢。
接口绝对是抽象的,不能实例化; 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
来引用子类的对象,该对象是匿名的,但由于以下语法而扩展了PrinterPrinter 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/