web-dev-qa-db-ja.com

コンストラクターのオーバーライドは可能ですか?

私が知っていることは、コンパイラはデフォルトの引数なしコンストラクタをバイトコードに書き込みます。しかし、自分で記述すると、そのコンストラクタは自動的に呼び出されます。この現象はコンストラクターのオーバーライドですか?

27
Gopal

あなたが説明するのは、オーバーライドではありません。デフォルトのコンストラクターを指定しない場合、コンパイラーはデフォルトのコンストラクターを作成します。サブクラスの場合、デフォルトの親コンストラクタを呼び出します( super() )。また、すべてのインスタンス変数を、タイプのデフォルト値(数値型の場合は0、数値型の場合はfalse、ブール値、またはオブジェクトの場合はnull)。

サブクラスの名前、パラメーターの数/タイプ、およびスーパークラスのインスタンスメソッドと同じ戻り値の型がサブクラスにある場合、オーバーライドが発生します。この場合、サブクラスはスーパークラスのメソッドをoverrideします。 ここでのオーバーライドに関する情報

21
Eddie Flores

コンストラクタは通常のメソッドではなく、「オーバーライド」することはできません。コンストラクターをオーバーライドできるということは、スーパークラスコンストラクターが表示され、サブクラスのインスタンスを作成するために呼び出されることを意味します。これは正しくありません...デフォルトではサブクラスにはコンストラクタがありません(引数のないコンストラクタifが拡張するクラスにコンストラクタがない場合を除く)。他のコンストラクターを明示的に宣言する必要があり、それらのコンストラクターは、スーパークラスコンストラクターが使用するパラメーターと同じパラメーターを使用する場合でも、そのスーパークラスに属しません。

あなたがデフォルトの引数なしコンストラクタについて言及するものは、コンストラクタがどのように機能するかの側面に過ぎず、オーバーライドとは何の関係もありません。

22
ColinD

決して不可能です。 Javaでは、コンストラクターのオーバーライドは不可能です。

それの訳は、

コンストラクタはメソッドのように見えますが、名前はクラス名として使用し、戻り値は使用しないでください。

オーバーライドとは、スーパークラスで宣言したものを意味し、サブクラスで宣言する必要があることをオーバーライドと呼びます。スーパークラス名とサブクラス名は異なります。

Subクラスでスーパークラスコンストラクターを記述しようとすると、Subクラスは名前をSubクラス名と一致させるべきではないため、コンストラクターではなくメソッドとして処理します。また、メソッドに戻り値がないというコンパイルエラーが発生します。そのため、voidとして宣言する必要があり、それだけがコンパイルされます。


次のコードをご覧ください。

Class One
        {
         ....
         One() { // Super Class constructor
          .... 
        }

        One(int a) { // Super Class Constructor Overloading
          .... 
        }
 }

Class Two extends One
                   {
                    One() {    // this is a method not constructor 
                    .....      // because name should not match with Class name
                   }

                    Two() { // sub class constructor
                   ....  
                   }

                   Two(int b) { // sub class constructor overloading
                   ....
                  }
 }  
13
sgokhales

コンストラクターをオーバーライドできません。コンストラクターは静的と見なすことができ、サブクラスはそのスーパーコンストラクターをオーバーライドできません。

もちろん、スーパークラスコンストラクターでprotected-methodを呼び出し、サブクラスでオーバーライドしてスーパークラスコンストラクターを変更することもできます。ただし、多くの人は、スーパークラスコンストラクターの動作を保護するために、このトリックを使用しないことを提案しています。たとえば、FindBugsは、コンストラクターが非最終メソッドを呼び出すことを警告します。

異なるパラメーターを受け取る限り、多くのコンストラクターを使用できます。ただし、デフォルトのコンストラクターを配置するコンパイラーは、「コンストラクターのオーバーライド」とは呼ばれません。

3
jzd

いいえ、コンストラクタをオーバーライドすることはできません。これを行おうとすると、コンパイラエラーが発生します。Javaでは不可能です。例を見てみましょう。メソッドの戻り値の型を書いてください。は、オーバーライドされたコンストラクタをコンストラクタとしてではなくメソッドとして扱うことを意味します。

package com.sample.test;

class Animal{

    public static void showMessage()
    {
        System.out.println("we are in Animal class");
    }
}

class Dog extends Animal{

    public void DogShow() 
    {
        System.out.println("we are in Dog show class");
    } 

    public static void showMessage()
    {
        System.out.println("we are in overriddn method of dog class");
    }
}

public class AnimalTest { 

    public static void main(String [] args)
    {
        Animal animal = new Animal();
        animal.showMessage();

        Dog dog = new Dog();
        dog.DogShow();

        Animal animal2 = new Dog();
        animal2.showMessage();
    }

}
2
hitesh141

Javaでコンストラクターを継承することはできず、メソッドのオーバーライドには継承が必要です。したがって、適用できません。

1
oneness

しかし、自分で記述すると、そのコンストラクタは自動的に呼び出されます。

それは正しくありません。引数なしのコンストラクタは、呼び出す場合と呼ばれ、自分で書いたかどうかに関係なく呼び出されます。派生クラスで明示的なsuper(...)呼び出しをコーディングしない場合にも自動的に呼び出されます。

これはコンストラクターのオーバーライドを構成しません。 Javaにはそのようなものはありません。 is constructor overloading、つまり、異なる引数セットを提供します。

1
user207421

Javaでオーバーライドするメソッドは、以前に記述された最近のコードのパフォーマンスを改善するために使用されます。

次のようなコードは、ここで基本クラスの参照を作成し、派生クラスの物理インスタンスを作成していることを示しています。コンストラクターではオーバーロードが可能です。

InputStream fis=new FileInputStream("a.txt");
int size=fis.available();

sizeはa.txtで可能な総バイト数を返すので、

0
user2253295

また、サブクラスのコンストラクターをスーパークラスの名前のコンストラクターでオーバーライドできないことに注意してください。 OOPSのルールは、コンストラクターがクラス名として名前を持つ必要があることを示しています。スーパークラスコンストラクターをオーバーライドしようとすると、戻り型のない未知のメソッドと見なされます。

0
Praveen Pavu

コンストラクタはメソッドのように見えますが、名前はクラス名として使用し、戻り値は使用しないでください。

オーバーライドとは、スーパークラスで宣言したものを意味し、サブクラスで宣言する必要があることをオーバーライドと呼びます。スーパークラス名とサブクラス名は異なります。

Subクラスでスーパークラスコンストラクターを記述しようとすると、Subクラスは名前をSubクラス名と一致させるべきではないため、コンストラクターではなくメソッドとして処理します。また、メソッドに戻り値がないというコンパイルエラーが発生します。そのため、voidとして宣言する必要があり、それだけがコンパイルされます。

0
R.maheswara Rao

次の理由により、コンストラクターのオーバーライドはできません。

コンストラクター名は、クラス名と同じ名前でなければなりません。継承の実践では、名前が異なる2つのクラスを作成する必要があるため、2つのコンストラクターは異なる名前を持っている必要があります。したがって、コンストラクターのオーバーライドは不可能であり、それは意味がありません。

0
Vijay Ranha

あなたの例はオーバーライドではありません。オーバーライドは技術的にはサブクラスで発生しますが、この例では、contructorメソッドは元のクラスで置き換えられます。

0
Corey