2014-01-30 3 views
1

Я новичок в java, и у меня проблема с моим кодом. Я пытаюсь вызвать конструктор суперкласса из конструктора подкласса. Хотя я могу это сделать super, но я стараюсь другой метод, создав объект суперкласса в конструкторе подкласса, который вызовет Class A constructor.Вызов конструктора из подкласса

class A 
{ 
    private int x; 

    A() 
    { 
     System.out.println("INISDE A"); 
    } 

    A(int h) 
    { 
     System.out.println("a"); 
     x = h; 
    } 
} 

class B extends A 
{ 
    int g, add; 

    B(int j, int h) 
    { 
     A a = new A(h); 
     g = j; 
     add = g + h; 
    } 

    void add() 
    { 
     System.out.println("SUM" + add); 
    } 
} 

public class Ja 
{ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     B v = new B(1, 2); 
     v.add(); 
    } 
} 

Проблема я получаю выход

INISDE A 
a 
SUM3 

Вместо

a 
SUM3 

Это означает, что он также использует A() .Но почему? Я дал ему параметры

+3

Я бы рекомендовал вам использовать IDLE с форматированием кода. – Christian

+1

... и используйте значащие имена. –

+0

Где весело в этом?!? –

ответ

5

Это:

B(int j,int h) { 
    A a=new A (h); 
    g=j; 
    add=g+h;  
} 

создает экземпляр суперкласса через A() и затем создает новый экземпляр A (с помощью конструктора одного аргумента) отдельный к основанию B. Я подозреваю, что вы действительно хотите:

B(int j,int h) { 
    super(h); 
    g=j; 
    add=g+h;  
} 

чтобы правильно создать свой суперкласс.

+0

Да, я использую супер. Но я экспериментировал – Freedom911

3

Чтобы вызвать конструктор суперкласса, вы должны использовать super (...). Так что ваш конструктор класса B должен выглядеть следующим образом

B(int j,int h) { 
    super(h); 
    g=j; 
    add=g+h; 
} 
1

Если я правильно читаю ваш код, это потому, что вы не указали, какой конструктор вы хотите использовать в своем конструкторе B. Поэтому по умолчанию ваш конструктор B вызывается конструктором no-args A. Это как вызов super(), подразумевается как первая строка в вашем конструкторе B.

Я не знаю, что вы пытаетесь сделать с экземпляром A внутри вашего конструктора B, но вы, скорее всего, хотите super (h).

0

Как и другие, упомянутые выше, вам нужно использовать super (h) вместо создания новой переменной. Тем не менее, я добавлю, что вам действительно не следует использовать простые буквы, подобные этому, для обозначения переменных. Попробуйте использовать конструктивные имена, которые дают читателям информацию о том, что происходит. Это также облегчает отслеживание того, что происходит внутри вашего кода. Очень часто для новичков, но если у вас есть класс A и переменная a, он становится запутанным. Пытаясь использовать простые имена, такие как TestClass, и поля, подобные firstField, если вы не думаете о каком-либо другом имени.

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