2014-12-27 4 views
1
class Top { 
    public Top(String s) { 
     System.out.print("B"); 
    } 
} 

public class Bottom2 extends Top { 
    public Bottom2(String s) { 
     super(); 
     System.out.print("D"); 
    } 

    public static void main(String [] args) { 
     Bottom2 as=new Bottom2("A"); 
     new Bottom2("C"); 
     System.out.println(" "); 
    } 
} 

Я хочу вызвать конструктор суперкласса. Почему это не компилируется?Вызов суперкласса класса из подкласса

+1

Что заставляет вас думать, что это не называется? Он должен печатать 'BDBD' –

+1

Конструктор для Top принимает строку, поэтому вы должны написать супер (ы); –

+1

Я вижу, вы пытаетесь сказать, что он даже не компилируется, потому что вы вызвали 'super()' неправильно ... –

ответ

3

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

Таким образом, для того, чтобы это работало должным образом просто добавить вызов в подклассе, например так:

public Bottom2(String s) 
{ 
    super(s); // call to superclass constructor with parameters. 
    System.out.print("D"); 
} 
2

Вы звоните super(), а не super(s). Когда у вас есть параметризованный конструктор, вы больше не можете использовать конструктор no-arg по умолчанию, поэтому super() не будет компилироваться.

+1

Может быть, он не знает, что когда вы определяете конструктор в классе, java больше не предоставляет значение по умолчанию конструктор, и вы должны сделать это сами. – Iootu

+0

нет конструктора по умолчанию - явный конструктор удалил неявный конструктор по умолчанию – tddmonkey

+0

Да, вот что я имел в виду, позвольте мне изменить его. Спасибо. – Iootu

0

ваш супер конструктор класс содержит параметр 1 строку, и вы не вызывающие ваш супер класс с параметром

в коде super();

должно быть, как это

супер ("любая строка");

0

Эта программа даст ошибку времени компиляции. Нужно включить конструктор по умолчанию Top() в класс Top

0

Прежде всего, он даст ошибку времени компиляции (потому что если у вас есть аргумент-конструктор в дочернем классе, то у вас не должно быть конструктора -арго в базовый класс), а во-вторых, что компилятор будет неявно вызывать конструктор no-arg базового класса (если нет другого вызова конструктора суперкласса или конструктора дочернего класса). так что вы не должны писать

super(); 

поэтому вы должны вызывать явно

super(s);