2015-06-21 2 views
0

Мне грозит странная вещь. Теория Java говорит, что * подкласс не наследует каких-либо конструкторов из своего суперкласса и должен предоставлять свои собственные. Несмотря на это, я написал программу, что ее основной класс генерирует объект без параметров (конструктор по умолчанию) из подкласса, тогда как в этом подклассе не существует каких-либо конструкторов. Кроме того, этот объект инициализировал атрибуты из своего суперкласса. Это означает, что суперкласс унаследовал свой конструктор к подклассу ... который по теории ошибочен.Создание экземпляра подкласса без construstor в Java

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) 
+1

Он ничего не унаследовал. Вы явно не объявляли никаких конструкторов для 'Student', поэтому компилятор предоставляет конструктор нуля-arg по умолчанию. –

ответ

2

Если вы не определяете любой конструктор, Java, по умолчанию, создаст public, конструктор без аргументов, который не выбрасывает никаких исключений, это то, что вы видите в своем usecase. Создав любой конструктор, независимо от его видимости, списка аргументов или предложения throws, Java перестанет создавать конструктор по умолчанию.

1

Если вы не определяете конструктор в классе, java не будет предоставлять конструктор аргументов. Поэтому в вашем классе ученика даже u прокомментировал конструктор, предоставленный конструктором Java, в свою очередь он вызывается перед выполнением любого оператора в дочернем конструкторе он будет вызывать конструктор по умолчанию родительского класса. Пожалуйста, посмотрите ссылку .. Java default constructor

+0

Если вы предоставляете даже один параметризованный конструктор, java не будет предоставлять конструктор по умолчанию –

1

Уже правильно ответил несколькими пользователями, что компилятор предоставит конструктор. Если вы хотите, чтобы убедиться, что сами использовать javap на классе Student, должны производить этот вывод:

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

Даже если вы закомментирована конструктор именно там. javap находится в каталоге bin вашего JDK.

Смежные вопросы