java抽象类实例化_Java我们可以实例化一个抽象类吗?

小编典典

在这里,我正在创建我的课程的实例

不,你不是在这里创建抽象类的实例。而是要创建抽象类的匿名子类的实例。然后,你在抽象类引用上调用指向子类对象的方法。

JLS-第15.9.1节中明确列出了此行为:

如果类实例创建表达式以类主体结尾,则实例化的类是匿名类。然后:

如果T表示一个类,则声明由T命名的类的匿名直接子类。如果T表示的类是最终类,则是编译时错误。

如果T表示接口,则声明实现T命名的接口的Object的匿名直接子类。

无论哪种情况,子类的主体都是类实例创建表达式中给出的ClassBody。

被实例化的类是匿名子类。

强调我的。

另外,在JLS-第12.5节中,你可以阅读有关对象创建过程的信息。我将在此引用一个声明:

每当创建新的类实例时,都会为其分配存储空间,并为该类类型中声明的所有实例变量和该类类型的每个超类中声明的所有实例变量(包括所有可能隐藏的实例变量)分配空间。

在返回对新创建对象的引用作为结果之前,使用以下过程处理指示的构造函数以初始化新对象:

你可以在我提供的链接上阅读有关完整过程的信息。

要实际上看到要实例化的类是Anonymous SubClass,你只需要编译两个类。假设你将这些类放在两个不同的文件中:

My.java:

abstract class My {

public void myMethod() {

System.out.print("Abstract");

}

}

Poly.java:

class Poly extends My {

public static void main(String a[]) {

My m = new My() {};

m.myMethod();

}

}

现在,编译两个源文件:

javac My.java Poly.java

现在,在编译源代码的目录中,你将看到以下类文件:

My.class

Poly$1.class // Class file corresponding to anonymous subclass

Poly.class

看到那个课- Poly$1.class。它是由编译器创建的类文件,与你使用以下代码实例化的匿名子类相对应:

new My() {};

因此,很明显,正在实例化另一个类。只是,该类仅在编译器编译后才被命名。

通常,将使用以下方式来命名你的类中的所有匿名子类:

Poly$1.class, Poly$2.class, Poly$3.class, ... so on

这些数字表示这些匿名类在封闭的类中出现的顺序。

2020-03-02

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值