2017-06-21 8 views
1

私は、この抽象クラスがある場合:私は抽象的なものから新しいクラスを拡張ときコンストラクタを定義する必要がありますか?抽象クラスを継承するクラスですか?

package com.abc; 

public abstract class Player { 
    private String name; 

    public Player(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 

を、新しいクラスがデフォルトで継承されたコンストラクタを使用しない、または私は「スーパー呼び出すコンストラクタを作成する必要があります。 "?

+0

私はあなたが 'Super'を呼び出すべきだと思います。 – vm345

+0

抽象クラスがパラメータを持たないコンストラクタを持っているかどうかによって異なります。 – AxelH

+1

@AxelHそれは' public player(String name){' –

答えて

5

デフォルトでは、デフォルトの空のコンストラクタが使用されます。あなたが明示的にコンストラクタを提供するので、あなたはデフォルトコンストラクタを取得しません。したがって、はいあなたはを明示的にと呼ぶ必要があります。super(String)です。その制限が必要ない場合は、空のコンストラクタをPlayerに追加する必要があります。

protected Player() { // <-- only visible to sub-classes. 
    // ... implicit super(); 
} 
+0

良い回避策。 upvoteをしてください。この慣用的なJavaですか? – Bathsheba

+0

@Bathshebaその意味でのイデオロギー?それは抽象クラスなので、とにかくサブクラス化せずにインスタンス化することはできません。しかし、私はそう思う、パッケージ非公開(例えば、アクセス修飾子なし)を考えて...そのパッケージにFactory(またはBuilder)を持ち、そのパッケージ(または同じパッケージ内の他のもの)だけがそのクラスをインスタンス化できる。同じ考え方で、それをサブクラスに限定するだけです。 –

2

あなたのベースクラスPlayerデフォルトコンストラクタを(あなたが他のコンストラクタを供給する場合は、自動的に生成されたものが効果的に削除される)が欠落しているので、派生クラスのすべてのコンストラクタを明示的にStringからコンストラクタを呼び出す必要があります。

nameに合格したsuperを使用します。これは、任意の子クラスのコンストラクタの最初の文でなければなりません。

3

コンストラクタを明示的に追加しなかった場合、デフォルトではJavaコンパイラによってデフォルトのコンストラクタとsuper()が追加されます。あなたのPlayerクラスのコンストラクタをパラメータ化しているので、あなたは私が「スーパー」と呼んでコンストラクタを作成する必要がありますsuper

をコールする必要がありますか?

はい、デフォルトコンストラクタを明示的に追加する必要があります。

public Player() {} 

あるいは、

あなたのサブクラスでパラメータを指定してsuper()を追加することができます。以下のように:

public ChildClass(String name) { 
    super(name); 
} 

また、コンストラクタをオーバーロードすることもできます。 read more about constructor overloadingおよび約super()である。

+0

私は答えの2番目の部分を理解していない、OPはサブクラスからスーパーを呼び出す必要性を述べていた。したがって、同じ問題が発生します。 – AxelH

+0

@AxelHありがとう、彼は 'Player'を継承するクラスを頼んだ。わかった。私は更新するでしょう – Blasanka

+0

@AxelHそれは今です。もう一度言ってくれてありがとう。 – Blasanka

関連する問題