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 或界面执行此操作。这里没有什么新鲜事。
好吧,人们可能会 运行 将其标记为重复,只是通过阅读标题而不是真正阅读问题。所以请知道,我曾尝试查看此平台上的其他问题,但没有找到可以完全消除我疑虑的内容。请允许我伸出手来问我的问题。提前致谢。
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 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
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 或界面执行此操作。这里没有什么新鲜事。