2012-05-27 5 views
1

, если у меня есть класс, который имеет, например, в HashMap, который инициализируется в конструкторе, как так ...Каков правильный способ инициализации члена суперкласса?

public class MySuper{ 
    HashMap<String,String> foo; 

    public MySuper(){ 
     foo = new HashMap<String,String>(); 
    } 
} 

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

public class MySub extends MySuper{ 
     public MySub(){ 
     super.MySuper() 
     } 
    } 

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

ТИА

+3

Кто-то потянуло для смещения (смехотворно), но я вернул его обратно, так что теперь он на ноль. Надеюсь, кто-то напомнит этому человеку, что когда-то он был новичком, как и все мы. –

+0

Как говорили другие, основная проблема, с которой вы столкнулись (кроме отсутствующего ';', заключается в том, что вы должны называть 'super', а не' super.MySuper'. И также, как указано, вам не нужно явно ссылаться 'super', если вам не нужно предоставить список параметров, отличный от списка parm подструктора. –

+0

(И мне всегда нужно помнить, что это просто« супер »для Java - слишком много языков, танцующих в моей голове, и они каждый делает это по-другому.) –

ответ

2

вы можете просто вызвать супер() - также, FYI, в вашем конкретном примере, вы не должны даже написать конструктор в суб-класса, он будет неявно вызвать суперкласс default constructor

+0

Подождите, re say, что даже если я не называю super foo, будет инициализирован в моем подклассе и готов к использованию? –

+0

да, это именно то, что я говорю – hiroprotagonist

+0

хорошо, это потрясающе, но теперь я не совсем понимаю, что point of super() есть, если у вас нет ничего, кроме конструктора по умолчанию. Я часто вижу его в коде людей, но должен быть какой-то другой конструктор, которого они явно избегают, вызывая голый супер без аргументов? –

3

Беспараметрический конструктор суперкласса автоматически вызывается из подкласса.

Но если вы хотите, чтобы подчеркнуть это в вашем коде, вы можете использовать:

public class MySub extends MySuper{ 
     public MySub(){ 
     super(); 
     } 
    } 

супер() должен быть первым оператором вашего конструктора тела.

+0

Собственно, 'super' не обязательно должно быть первым утверждением. Там просто не может быть что-либо «угрожающее» (и, увы, определение «угрозы»). –

1

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

public MySub(){ 
    // super(); is automatically called at first line, so you no need call it 
    // child init 
} 

или вы можете вызвать конструктор суперкласса в первой строке детского конструктора

public MySub(){ 
    super(); 
    // child init 
} 

Если супер класса есть конструктор public MySuper(int i), которого вы хотите позвонить, вы можете написать

public MySub(){ 
    super(100); 
    // child init 
} 
+0

Если вы хотите включить код в дочерний конструктор, вы должны добавить предложение 'super()' в качестве первой строки. –

1

Вам вообще ничего не нужно делать.

Конструктор аргументов super class no argument автоматически вызывается при вызове конструктора подкласса.

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

Вы делаете это так:

super() или

public class MySub extends MySuper{ 
     public MySub(){ 
     super(); 
     } 
    } 

или

public class MySub extends MySuper{ 
     public MySub(int a, int b){ 
     super(a, b); 
     } 
    } 

См using super.

1
You have no need to call super.MySuper() because super classe's default constructor always invoke implicitly because the first line of child class's constructor is super() by default. 

public class MySuper{ 
    HashMap<String,String> foo; 

    public MySuper(){ 
     foo = new HashMap<String,String>(); 
    } 
} 

public class MySub extends MySuper{ 

}