【问题标题】:why does the default constructor in MyClass calls super i.e of Object class为什么 MyClass 中的默认构造函数调用超级即 Object 类
【发布时间】:2015-04-20 16:16:10
【问题描述】:

我一直在使用 java 并学习我对类中的默认构造函数有疑问。 Why does it call super (constructor of Object class.I know it does constructor chaining)?. For what reasons it is required ?.如果我这样定义一个类

MyClass 
{

    public MyClass()
       {

       }
}

编译器在构造函数中添加super。

public MyClass()
{
   super();  
}

P.S 我试过谷歌搜索并阅读过 Oracle Doc 但找不到答案。为什么? 感谢您的宝贵时间。

【问题讨论】:

    标签: java super default-constructor


    【解决方案1】:

    每个构造函数都必须调用同一类的不同构造函数或其直接超类的构造函数。如果您不显式调用它,则会隐式添加对超类构造函数的调用。

    由于类的实例继承了其祖先的状态,它必须通过调用其祖先的构造函数来对其进行初始化。

    在您的情况下,您的MyClassObject 的直接子类,因此您的构造函数必须调用Object 的构造函数。

    【讨论】:

      【解决方案2】:

      一个类总是一个类链,并且总是以 Object 结尾(其中 Object 是唯一的例外;它没有超类)。

      如果创建了一个新实例,则必须初始化链中的所有类,否则它们的状态将是未定义的。这也适用于似乎不需要初始化的类(如 Object)。

      初始化部分是隐式完成的(变量获取其默认值),另一部分是通过始终调用类中的构造函数来完成的。

      【讨论】:

        【解决方案3】:

        为什么它调用 super(Object 类的构造函数。我知道它调用 构造函数链接)?出于什么原因需要它?

        考虑这个例子:

        class A {
          protected String s;
          A () {
            this.s = "hello";
          }
        }
        
        class  B extends A {
          public String get() {
            return s;// s is inherited from A
          }
        }
        
        // A's default constructor is invoked here
        System.out.println(new B().get());// prints hello
        

        现在假设 java 的构造函数中不包含 super()

        // A's default constructor is not invoked here
        System.out.println(new B().get());// prints null
        

        它将 null 作为类类型的默认值。由于没有为B 的新实例调用A 的构造函数,所以A 的实例变量没有被初始化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-10
          • 2017-11-26
          • 1970-01-01
          • 2018-07-01
          • 1970-01-01
          相关资源
          最近更新 更多