2016-04-01 24 views
-2

出力はどのようになりますか?どちらのクラスでもクラスが作成されることは疑いの余地があります。私はJavaで新しいので、オブジェクトのインスタンス化のプロセスを簡単に説明してください。 このプログラムでは、出力を150と想定していますが、ans in = s 90となります。 メソッドとデータ変数が違いにアクセスする方法は?以下のコードの違いを説明してください。

プログラム1:

class Bike 
{ 
    int speedlimit=90; 
} 
class Honda3 extends Bike 
{ 
    int speedlimit=150; 
    public static void main(String args[]) 
    { 
     Bike obj=new Honda3(); 
     System.out.println(obj.speedlimit);//90 
    } 
} 

プログラム2:

class Bike 
{ 
    int speedlimit=90; 
    void display() 
    { 
     System.out.println(speedlimit); 
    } 
} 
class Honda3 extends Bike 
{ 
    int speedlimit=150; 
    void display() 
    { 
     System.out.println(speedlimit); 
    } 
    public static void main(String args[]) 
    { 
     Bike obj=new Honda3(); 
     obj.display(); 
    } 
} 

これら2つのコード間の差分を説明します。 プログラム1では、オブジェクトはHonda3に対して作成され、タイプBikeのobjに割り当てられます。私はスーパークラスメソッドがどのように実行されるのか理解していませんでしたか?

+2

フィールドは多型ではありません。 'Bike'への参照で' obj.speedlimit'にアクセスすると、 'Bike'の具象サブクラスに' speedlimit'というフィールドがあるかどうかにかかわらず、 'Bike.speedlimit'を取得します。 –

答えて

1

サブクラスは、基本クラスのメソッドと同じシグネチャ(メソッド名+パラメータ型)を用いてメソッドを宣言する場合、基本クラスのメソッドをオーバーライドあります。

これは、呼び出しに使用された変数が基本クラスとして宣言されていても、サブクラスのメソッドは常にサブクラスのオブジェクトに対して呼び出されることを意味します。


サブクラスは、基本クラス内のフィールドと同じ名前のフィールドを宣言した場合、基底クラスのフィールドはを隠されているが、それらの両方がまだ存在しており、異なる値を持つことができます。

ベースクラスのコードは、ベースクラスのフィールドにアクセスします。

サブクラスのコードは、サブクラスのフィールドにアクセスします。基本クラスのフィールドは非表示になっていますが、super.で修飾するとアクセスできます。

クラス外のコードは、コンパイラが認識できるフィールド、つまりフィールドへのアクセスに使用された変数のクラスのフィールドにアクセスします。だから、


Bike obj = new Honda3()を使用する場合は、あなたが得る:

  • obj.display()Honda3.display()メソッドを呼び出します。
  • obj.speedlimitは、Bike.speedlimitフィールドにアクセスします。これらの理由から

、を隠しフィールドはNO、大きなNOです!
しないでください。コードはあいまいになり、思うように動作しない可能性があります。

良いIDEがあれば警告します。

のメソッドをオーバーライドするメソッドには、常に@Overrideという注釈を付ける必要があります。コンパイラはメソッドが実際に基本クラスのメソッドをオーバーライドしていることを確認し、メソッドのシグネチャを壊さないようにします。

良いIDEは、注釈を付けていないと警告します。そうしないと、誤ってベースクラスのメソッドをオーバーライドしないようにします。

0

スーパークラスメソッドの実行方法がわかりませんでしたか?

オーバーライドされたメソッドのスーパークラスの実装を呼び出すことはできません。これは設計によるものです。異なる目的を持っている場合は、2つのメソッドに同じ名前を付けて、もう一方を上書きしないでください。

class Bike { 
    int speedlimit=90; 
    void display() { 
     System.out.println(speedlimit); 
    } 
} 

class Honda3 extends Bike { 
    int overdriveSpeedlimit=150; 
    void displayOverdrive() { 
      System.out.println(overdriveSpeedlimit); 
    } 
} 

public static void main(String[] args) { 
    Honda3 honda= new Honda3(); 
    honda.displayOverdrive(); 
    Bike obj = honda; 
    obj.display(); 
} 
関連する問題