【问题标题】:What is the difference between a constructor having super() and not having super() function call in a Java Class [duplicate]在Java类中具有super()和没有super()函数调用的构造函数有什么区别[重复]
【发布时间】:2015-08-27 17:05:58
【问题描述】:

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

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;
}

【问题讨论】:

    标签: java inheritance constructor


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      没有区别,只是显式和隐式的问题。在第二种情况下,如果它是从父类继承的,它会隐式调用此 Student 类的超级构造函数。阅读更多关于此的内容。 google 一下就可以找到更多信息。

      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 的构造函数。不过,您可以明确指定它。

      作为

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

      【讨论】:

        【解决方案3】:

        具有超功能的构造与没有超功能的构造有什么区别。

        嗯,它可以很容易地测试。对于这种情况,它们实际上是相同的。 更重要的是,您可能想知道何时以及如何使用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(); 将在每个构造函数中调用,如果你没有给出的话。

        【讨论】:

        • 很好的解释@user3437460
        • @Tarikhelian 很高兴它有帮助 ;)
        【解决方案4】:

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

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

        查看The Java™ TutorialsJavaTPoint 了解更多信息。

        【讨论】:

          【解决方案5】:

          如果您没有显式调用超类的构造函数,Java 会隐式调用它(构造函数链接 - 在 google 上搜索此术语以获取更多信息)。即使您的类没有显式继承自任何类,java 也会隐式使其继承 Object 类(并调用 Object 类的构造函数)。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-18
            • 1970-01-01
            • 2012-05-17
            • 2019-04-26
            • 1970-01-01
            • 2018-05-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多