2017-05-20 9 views
-1

継承をjavaで使用すると、スーパークラスのコンストラクタをサブクラスで継承できますか? tutorialspointjavaでコンストラクタを継承する

それは言う:

サブクラスはスーパークラスからのすべてのメンバー(フィールド、メソッド、およびネストされた クラス)を継承します。コンストラクターはメンバーではないので、 はサブクラスによって継承されませんが、スーパークラス のコンストラクターはサブクラスから呼び出すことができます。クラスが別のクラスのプロパティを継承している場合、サブクラス が自動的にスーパークラスのデフォルトコンストラクタを取得

しかし、どこかで同じチュートリアルでは、と述べました。

スーパークラスのコンストラクタを継承することができますか?

+3

2番目の引用は基本的に無意味ですが、最初のものと矛盾しません。 「獲得」は「継承」を意味するものではありません。 NB [tutorialspoint](https://www.tutorialspoint.com/java/java_inheritance.htm)は規範的な参照ではありません。 Oracle Javaチュートリアルをお試しください。任意のインターネット迷惑メールが何であるかをここに尋ねることは何の意味もない。 – EJP

答えて

6

だから私は、サブクラスがスーパー クラスのコンストラクタを継承することができます知りたいですか?

コンストラクタを継承できません。

私はあなたが関連しているソースをtutorialspointに見つけることができました。

それはそれは言及していますその下部分が明確にスーパークラスのコンストラクタを起動し、それが述べと題されていることに注意することが重要です。

クラスが別のクラスのプロパティを継承している場合、サブクラス を自動的に取得し、スーパークラスのデフォルトのコンストラクタです。しかし、 スーパークラスのパラメータ化されたコンストラクタを呼び出す場合は、 は以下のようにsuperキーワードを使用する必要があります。これが言おうとしているもの、簡単に言えば

super(values); 

は、サブクラスのコンストラクタは、スーパークラスのコンストラクタを呼び出すようにするかを指定しない場合、コンパイラが自動的にスーパークラスにアクセス無引数コンストラクタを呼び出しませんです。

しかし、かつてのスーパークラス内のパラメータ化コンストラクタがありますそうでない場合は、あなたのプログラムがないコンパイルします派生クラスのコンストラクタ内の最初のステートメントとしてそれを呼び出す必要があります。

例えば

public class Super { ... } 
public class Derived extends Super { ... } // good ! compiler puts in a public default constructor for you. 

以下のコードはないコンパイルし、エラーを知らせるを取得する必要があります:スーパー

public class Super { 
    public Super(int id) {...} 
} 
public class Derived extends Super {...} 
で使用可能なデフォルトコンストラクタがありません

を呼び出すと、0を呼び出す必要がありますクラスのコンストラクタを、Derivedクラスのコンストラクタ内の最初の文として明示的に指定します。

public Derived(){ super(12);} 
+0

Aominè説明をいただきありがとうございます。 –

1

superキーワードを使用してスーパークラスコンストラクタにアクセスできます。

サブクラスでコンストラクタを定義し、スーパーコンストラクタを呼び出す必要があります。

public class Animal { 

    private String name; 

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

    public String getName() { 
        return name; 
    } 

    public void setName(String name) { 
        this.name = name; 
    } 

    public void play(){ 
        System.out.println(this.getName() + " is playing "); 
    } 
} 

public class Dog extends Animal{ 
    public Dog(String name) { 
        super(name); 
    } 
} 

public class Test { 

    public static void main(String[] args) { 
        Dog d = new Dog("Winky"); 
        d.play(); 
    } 
} 
-1

すべてのスーパークラスコンストラクタはデフォルトで継承されています。これらのコンストラクタは、すべてサブクラスコンストラクタで呼び出すことができます。

サブクラスオブジェクトをインスタンス化するとき、サブクラスより前のサブクラスコンストラクタはスーパークラスコンストラクタを実行し、サブクラスコンストラクタの実行を継続します。デフォルトのスーパーコンストラクター以外のスーパーコンストラクターを使用する場合は、サブクラスコンストラクターからsuperキーワードを使用して呼び出すことができます。この呼び出しは、サブクラスコンストラクターの最初のステートメントにする必要があります。

例:

public Subclass(String msg) { 
    super(msg); // calling non default super class constructor 
    // any other initialization 
} 
+1

[JLS#8.8: 'コンストラクタの宣言はメンバーではありません。彼らは決して継承されません... '](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.8) – EJP

+0

@EJP:スーパーに電話をかけることができるのであなたがスーパークラスのコンストラクタを継承しているということではありませんか? –

+1

引用したJLSセクションには該当しません。 – EJP

関連する問題