抽象的实例化类
Instantiation of abstract classes
我一直在阅读 this guide 内部 classes 并且发现了这个有趣的匿名示例 class。
因此,默认情况下我们无法实例化抽象 class,例如
abstract class AnonymousInner {
public abstract void mymethod();
}
public class Outer_class {
public static void main(String args[]) {
AnonymousInner inner = new AnonymousInner();
inner.mymethod();
}
}
给出一个错误,指出我们无法实例化一个抽象 class。
但是这样做很好-
abstract class AnonymousInner {
public abstract void mymethod();
}
public class Outer_class {
public static void main(String args[]) {
AnonymousInner inner = new AnonymousInner() {
public void mymethod() {
System.out.println("This is an example of anonymous inner class");
}
};
inner.mymethod();
}
}
所以我有点不知道第二个例子是如何工作的。
这是因为你正在创建一个匿名的 class - 你正在就地定义你的抽象 class 的实现,没有名字,只能在这里使用,然后实例化它(具体)class。更多信息 here.
其他示例是在任何需要功能接口的地方使用 lambda,例如在流中:
stream.filter(a -> a.isTrue)...
// or
stream.filter(ClassA::isTrue)...
此处 lambda 和方法引用被视为 Predicate
.
的实现
在这里,您正在创建 inner class 的对象,它扩展了 abstract class。你可以反编译生成的class文件,自己看看。
这是代码编译后生成的class。 (我反编译了 class,它看起来像这样:
final class Outer_class
extends AnonymousInner
{
public void mymethod()
{
System.out.println("This is an example of anonymous inner class");
}
}
您可以清楚地看到 inner class 正在为 abstract class 提供实现。
我一直在阅读 this guide 内部 classes 并且发现了这个有趣的匿名示例 class。
因此,默认情况下我们无法实例化抽象 class,例如
abstract class AnonymousInner {
public abstract void mymethod();
}
public class Outer_class {
public static void main(String args[]) {
AnonymousInner inner = new AnonymousInner();
inner.mymethod();
}
}
给出一个错误,指出我们无法实例化一个抽象 class。 但是这样做很好-
abstract class AnonymousInner {
public abstract void mymethod();
}
public class Outer_class {
public static void main(String args[]) {
AnonymousInner inner = new AnonymousInner() {
public void mymethod() {
System.out.println("This is an example of anonymous inner class");
}
};
inner.mymethod();
}
}
所以我有点不知道第二个例子是如何工作的。
这是因为你正在创建一个匿名的 class - 你正在就地定义你的抽象 class 的实现,没有名字,只能在这里使用,然后实例化它(具体)class。更多信息 here.
其他示例是在任何需要功能接口的地方使用 lambda,例如在流中:
stream.filter(a -> a.isTrue)...
// or
stream.filter(ClassA::isTrue)...
此处 lambda 和方法引用被视为 Predicate
.
在这里,您正在创建 inner class 的对象,它扩展了 abstract class。你可以反编译生成的class文件,自己看看。
这是代码编译后生成的class。 (我反编译了 class,它看起来像这样:
final class Outer_class
extends AnonymousInner
{
public void mymethod()
{
System.out.println("This is an example of anonymous inner class");
}
}
您可以清楚地看到 inner class 正在为 abstract class 提供实现。