【问题标题】:Creating instance of subclass without construstor in Java在Java中创建没有构造函数的子类实例
【发布时间】:2015-06-21 18:23:27
【问题描述】:

我正面临一件奇怪的事情。 Java 理论说 *a 子类不从其超类继承任何构造函数,它必须提供自己的构造函数。 尽管如此,我编写了一个程序,它的主类从子类生成一个没有参数的对象(默认构造函数),而在这个子类中不存在任何构造函数。此外,该对象已初始化其超类的属性。这意味着超类已经将其构造函数继承给了子类……理论上这是错误的。

import java.util.Scanner;

public class Test {    
    public static void main(String[] args){
        Student S = new Student();
        System.out.println(S);       
    }        
}


public class Person {        
    private String name="Scarlett";  
    public String getName(){
        return name;
    }
}      


public class Student extends Person {        
    private String name="Johansson";

    /* THIS IS MISSING BUT STILL WORKING
    Student(){
       super();
    }
    */

    @Override
    public String toString(){
        return "Name is "+getName()+" Surname is "+ this.name;
    }            
}

以及这段代码的输出:

run:
Name is Scarlett Surname is Johansson
BUILD SUCCESSFUL (total time: 1 second)

【问题讨论】:

  • 它没有继承任何东西。您没有为Student 显式声明任何构造函数,因此编译器提供了一个默认的零参数构造函数。

标签: java inheritance constructor subclass


【解决方案1】:

如果您不定义 any 构造函数,Java 默认将创建一个public,无参数构造函数,不会引发异常,这就是您在用例中看到的。一旦你创建了 any 构造函数,无论其可见性、参数列表或throws 子句如何,Java 都将停止创建默认构造函数。

【讨论】:

    【解决方案2】:

    如果你没有在类中定义构造函数,java将不提供参数构造函数,所以在你的学生类中,即使你注释了构造函数,构造函数是由Java提供的,反过来它会在执行子构造函数中的任何语句之前调用它将调用父类默认构造函数。 请查看链接..Java default constructor

    【讨论】:

    • 如果你提供了一个参数化的构造函数 java 将不会提供默认的构造函数
    【解决方案3】:

    已由多个用户正确回答编译器将提供构造函数。如果你想自己验证在 Student 类上使用 javap,应该产生这个输出:

    Compiled from "Test.java"
    class Student extends Person {
      Student();
      public java.lang.String toString();
    }
    

    即使你注释掉了构造函数,它仍然存在。 javap 在你的 JDK 的 bin 目录中。

    【讨论】:

      猜你喜欢
      • 2017-11-24
      • 1970-01-01
      • 2015-09-26
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      相关资源
      最近更新 更多