Конструкторы по умолчанию и наследование в Java - PullRequest
51 голосов
/ 08 февраля 2009

У меня есть вопрос о конструкторах по умолчанию и наследовании в Java.

Как правило, если вы пишете класс и не включаете никакого конструктора, Java автоматически предоставляет вам конструктор по умолчанию (один без параметров), который инициализирует все переменные экземпляра класса (если они есть) с некоторыми значениями по умолчанию ( 0, ноль или ложь). Однако если вы пишете конструктор с некоторыми параметрами и не пишете конструктора по умолчанию, то Java не предоставляет конструктор по умолчанию. Мой вопрос: как обстоят дела с классами, которые наследуются от других классов - если я напишу конструктор с некоторыми параметрами в них, но не включу конструктор по умолчанию, они наследуют конструктор по умолчанию суперкласса?

Ответы [ 11 ]

0 голосов
/ 19 мая 2019

Любой конструктор в подклассе будет вызывать конструктор без аргументов (или конструктор по умолчанию) родительского класса. если вы определите параметризованный конструктор в родительском классе, то вам придется явно вызывать конструктор родительского класса с помощью ключевого слова super, иначе это вызовет ошибку компиляции.

class Alpha 
{ 
    Alpha(int s, int p) 
    { 
        System.out.println("base");
    }

} 

public class SubAlpha extends Alpha 
{ 
    SubAlpha() 
    { 
        System.out.println("derived"); 
    } 
    public static void main(String[] args) 
    { 
        new SubAlpha(); 
    } 
}

Приведенный выше код выдаст ошибку компиляции:

prog.java:13: error: constructor Alpha in class Alpha cannot be applied to given types;
    { 
    ^
  required: int,int
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error

Вышеупомянутая ошибка произошла, потому что ни у нас нет никакого конструктора аргумента / конструктора по умолчанию в родительском классе, ни мы вызываем параметризированный конструктор из подкласса.

Теперь, чтобы решить эту проблему, либо вызовите параметризованный конструктор следующим образом:

class Alpha 
{ 
    Alpha(int s, int p) 
    { 
        System.out.println("base");
    }

} 

public class SubAlpha extends Alpha 
{ 
    SubAlpha() 
    { 
        super(4, 5); // calling the parameterized constructor of parent class
        System.out.println("derived"); 
    } 
    public static void main(String[] args) 
    { 
        new SubAlpha(); 
    } 
}

Выход

base
derived

или

определить конструктор без аргументов в родительском классе следующим образом:

class Alpha 
{ 
    Alpha(){

    }
    Alpha(int s, int p) 
    { 
        System.out.println("base");
    }

} 

public class SubAlpha extends Alpha 
{ 
    SubAlpha() 
    { 
        System.out.println("derived"); 
    } 
    public static void main(String[] args) 
    { 
        new SubAlpha(); 
    } 
}

выход

derived 
...