【问题标题】:super() method not giving error when no parent class is definedsuper() 方法在没有定义父类时不给出错误
【发布时间】:2014-06-25 03:16:52
【问题描述】:
class child
{
    child()
    {
        super();
        System.out.println("Hello");
    }
    public static void main(String arg[])
    {
        child obj=new child();
    }
}

在这段代码中,当我创建类 child 的对象时,将调用子构造函数。但是为什么它没有给出错误,因为没有父类。 super() 在这里做什么? super() 关键字调用谁的构造函数?

【问题讨论】:

  • 值得注意的是,如果您省略了子项中的显式super(),它将被静默插入。而且,您正在隐式扩展 java.lang.Object(例如,您可以覆盖 equals()toString())。

标签: java super


【解决方案1】:

在 Java 中,每个对象都隐式扩展 Object。在这里调用 super 只会调用 Object 的构造函数。另一方面,您应该真正遵守命名约定,例如大写类名。

【讨论】:

    【解决方案2】:

    它调用Object class的构造函数,因为java中的所有对象默认扩展为Object类。

    来自documentation

    Class Object is the root of the class hierarchy. Every class has Object as a superclass. 
    All objects, including arrays, implement the methods of this class.
    

    【讨论】:

      【解决方案3】:

      您正在调用 Object 方法,所有其他类最终都来自该方法。

      首先,澄清这种情况下的类层次结构,Java 教程中的the inheritance section 指出:

      除了没有超类的Object,每个类都只有一个直接超类(单一继承)。 在没有任何其他显式超类的情况下,每个类都隐含地是Object 的子类。

      那么,对于tutorial stuff on using super

      注意:如果构造函数没有显式调用超类构造函数,Java 编译器会自动插入对超类的无参数构造函数的调用。

      如果超类没有无参数构造函数,你会得到一个编译时错误。 Object确实有这样的构造函数,所以如果Object是唯一的超类,没有问题。

      【讨论】:

        【解决方案4】:

        我们在 Java 中创建的每个类都是“Object”对象(换句话说,Object 的子类)的隐式后代。因此,当您调用 super() 时,它会隐式调用 Object 类的构造函数。具有此功能的基本原因是概括以下常见功能:

            synchnronizaton - like wati()
            object identity - like hashcode(), equals()
        

        还有更多。

        谢谢, JK

        【讨论】:

          【解决方案5】:

          java.lang package 中的Object 类位于类层次结构树的顶部。每个类都是 Object 类的直接或间接后代。

          所有对象,包括数组,都实现了这个类的方法。这就是为什么 super() 在你的情况下实际上是调用 Object 类的构造函数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-08-28
            • 2021-02-24
            • 2021-07-26
            • 2021-04-15
            • 2020-05-21
            • 2019-05-10
            • 1970-01-01
            相关资源
            最近更新 更多