首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在类中使用私有构造函数

在类中使用私有构造函数
EN

Stack Overflow用户
提问于 2011-03-19 15:47:39
回答 5查看 4K关注 0票数 5

如果有私有构造函数,JVM会插入对超级构造函数的调用吗?

我指的是那个私有构造函数中的super()调用。

代码语言:javascript
运行
复制
class Alpha {
    static String s="";
    protected Alpha(){
        s+="alpha";
    }
}

class SubAlpha extends Alpha{
    private SubAlpha(){
        s+="sub";
    }
}

class SubSubAlpha extends Alpha{
    private SubSubAlpha(){
        s+="subsubAlpha";
    }

    public static void main(String[] args){
        new SubSubAlpha();
        System.out.print(s);   
    }
}

在这里,我没有得到任何编译错误。在SubSubAlpha类中,有一个私有构造函数。是编译器在其中插入super()调用,如果是,在SubAlpha类中发生了什么。甚至还有私有构造函数。如果没有被访问,继承树如何继续到顶部。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-19 15:50:42

是。如果没有显式的super()this构造函数调用,则私有构造函数具有隐式super调用。在这方面,它与其他构造函数没有什么不同。当然,要进行编译,超类必须有一个从类中可见的无参数构造函数。

但是,如果构造函数为private,则不能从子类中调用它...或者来自除类本身之外的任何其他代码。

票数 4
EN

Stack Overflow用户

发布于 2011-03-19 15:49:34

如果有私有构造函数,

会插入对超级构造函数的调用吗?

超级构造函数将始终被调用。(如果不同时实例化超类,则不能实例化一个类。)

如果您不自己显式地执行此操作,则将为您插入一个隐式调用,而不管构造函数是私有的还是公共的。

挑剔的是:实际上并不是JVM插入了它,而是Java编译器:

代码语言:javascript
运行
复制
public class Test {
    private Test() {
    }
}

被编译成

代码语言:javascript
运行
复制
private Test();
  Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return
票数 8
EN

Stack Overflow用户

发布于 2011-03-19 16:25:08

您没有收到编译时错误的原因是您的类层次结构并不是您认为的那样。我想你是这个意思:

代码语言:javascript
运行
复制
class SubSubAlpha extends Alpha {

要做到这点:

代码语言:javascript
运行
复制
class SubSubAlpha extends SubAlpha {

..。在这一点上,您确实会得到一个编译时错误。

(换句话说,是的,总是有一个对超级构造函数的调用。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5360851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档