具有super()且在Java类中没有super()函数调用的构造函数之间有什么区别

时间:2015-08-27 17:05:59

标签: java inheritance constructor

这两个构造函数之间有什么区别。

public Students(String name, String address) {
    super();
    this.name = name;
    this.address = address;
}

/*Here is constructor without super function call.*/
public Students(String name, String address) {
    this.name = name;
    this.address = address;
}

5 个答案:

答案 0 :(得分:3)

如果没有对超类构造函数的显式调用,编译器将生成对super()的调用。因此,您的示例之间没有区别。

答案 1 :(得分:2)

没有区别,它只是一个明确和隐含的问题。在第二种情况下,如果它继承自父类,它会隐式调用此Students类的超级构造函数。阅读更多相关内容。如果您谷歌搜索,可以找到更多信息。

public class A {
    //there is a hidden constructor. Even if you explicitly write it  
    //public A(){
    //}
}

public class B extends A {
 private int i;


public B(int x){
   this.i = x;
}

}

创建对象表单B时,首先隐式调用A的构造函数。您可以明确指定它。

as

public B(int x){
       super();
       this.i = x;
}

答案 2 :(得分:1)

  

具有超级功能的构造与没有它的构造之间有什么区别。

嗯,它很容易测试。对于这种情况,它们实际上是相同的。 更重要的是,您可能想知道何时以及如何使用super

运行以下代码:

public class Test
{             
    public static void main(String[] args) 
    {       
        new Students("a", "b");
    } 
}

class Parent
{
    public Parent(){
        System.out.println("Parent class constructor invoked");
    }
}       

class Students extends Parent
{
    String name;
    String address;

    public Students(String name, String address) {
        super();
        this.name = name;
        this.address = address;
    }
}

<强>输出: 调用了父类构造函数

现在我们删除super();

class Students extends Parent
{
    String name;
    String address;

    public Students(String name, String address) {
        this.name = name;
        this.address = address;
    }
}

<强>输出: 调用了父类构造函数

就像类隐式扩展到Object一样,即使你没有将它们扩展到某些东西。 “默认情况下”如果您没有给出一个super();,则会在每个构造函数中调用它。

答案 3 :(得分:0)

super()只调用函数的父构造函数,并允许您传递super(someArgument)之类的参数,或者可以用来调用父构造函数的方法,例如super.someMethod()

super()只调用父构造函数而不传递任何参数或引用父项的任何方法。关于何时调用super()的实际决定取决于重写方法的目的以及当覆盖某个方法时基类所期望的行为。

结帐The Java™ TutorialsJavaTPoint了解详情。

答案 4 :(得分:0)

如果你没有明确地调用它,那么Java会隐式调用超类的构造函数(构造函数链接 - 在谷歌上搜索这个术语以获取更多信息)。即使你的类没有显式地从任何类继承,java也会隐式地使它继承Object类(并调用Object类的构造函数)。

所以,他们之间没有区别。