好吧,人们可能只会通过阅读标题并且没有真正阅读问题而将其标记为重复。所以请知道我已经尝试在这个平台上查看其他问题,但是没有找到能够完全解决我怀疑的问题。请允许我伸出手来问我的问题。提前谢谢。
接口绝对是抽象的,无法实例化; 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'显然被分配给...而且它是一个抽象的类变量!!这怎么可能呢?我认为抽象类不能被实例化或初始化。
任何帮助都将不胜感激。
答案 0 :(得分:2)
final Printer p = new Printer()
{
@override
public void print()
{
...
}
}
这意味着创建了一个匿名类extends Printer
,而变量p
指的是子类实例。
这只是多态。通过在这里创建匿名类,您正在创建一个Printer
和的子类,使用多态,您正在使用超类引用变量p
来引用子类的对象这是匿名的,但是扩展打印机,因为下面的语法
Printer p = new Printer(){...}
这不仅限于抽象类,还可以创建一个实现和接口的匿名类。考虑下面的例子。
package com.test;
public interface SomeInterface {
public void SomeMethod();
}
以及下面的课程 package 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/
答案 1 :(得分:1)
abstract
类就像任何其他类一样 - 除了它不能直接实例化的事实。我认为你知道这种设施的用途。因此它很可能有一个main()
,这是static
方法,而不是实例方法
示例中的匿名类,extend
是抽象类(或implement
是一个接口,如果指定了接口。因此,p
未分配给abstract
类实例,而是分配给扩展抽象类的类的实例
答案 2 :(得分:0)
Java抽象类也无法实例化,但如果存在main(),则可以调用它。
由于main()
方法是静态的,因此无需实例化即可调用。 e.g。
abstract class AbstractClass{
public static void main(String[] args){
}
}
对于Java7,interface
也是如此。对于Java8,你可以在interface
内部使用静态main方法,因此Java8也是如此
您的第二个问题,在创建Printer
的实例时,您已经定义了Printer
的子类,但您不能再次使用此Printer
的定义实现(因为那里)没有与实现相关联的名称),因此,它是匿名的。
答案 3 :(得分:0)
Java抽象类也无法实例化,但如果存在main(),则可以调用它。
这是无稽之谈。可以调用抽象类的任何静态方法。不只是main().
其次,我看过以下示例......并且被告知匿名类正在运行。
这是正确的。
但是,我真的不明白怎么做,因为变量'p'显然被分配给......而且它是一个抽象的类变量!!这怎么可能呢?我认为抽象类不能被实例化或初始化。
这里是实例化的匿名类,扩展抽象类,并提供抽象方法的实现。该类的引用存储在Person p
中,因为Person
是匿名类的超类。您可以为任何其他类或接口执行此操作。这里没有什么新东西。