2017-03-03 8 views
2

スーパークラスとサブクラスとして2つのクラスが作成された場合。オブジェクトの1つが別の参照で宣言されていた場合、どのように動作するでしょうか?Java、異なる参照からオブジェクトを初期化するときにはどうなるでしょうか?

class SubClass extends SuperClass 

SubClass s1 = new SubClass(); 
SuperClass s2 = new SubClass(); 

はあなただけSuperClassで宣言されたメソッドを呼び出すことができs2

class SubClass extends SuperClass 

SubClass s1 = new SubClass(); 
SubClass s2 = new SubClass(); 
+1

ポリモーフィズム...最初のケースで –

+0

は、あなただけのs2' 'に' SuperClass'上で定義されたメソッドを呼び出すことができます。 –

+0

多形性が何をするのか正確にはわかりません。メソッドに対するオーバーライド機能ですか? –

答えて

2

クラスのサブクラスは

1)サブクラスS1 =新しいサブクラス()スーパークラスを延びています。

2)SuperClass s2 = new SubClass();最初の1の

説明: -

s1は、サブクラスのrefernceで、サブクラスのオブジェクトを保持しているので、私たちは、サブクラスのメソッドでスーパークラスのメソッドを拡張するためには、サブクラスのメソッドと同様にスーパークラスを呼び出します。スーパークラスのメソッドは、自動的にサブクラスに利用できるようになります.S1の助けを借りて、スーパークラスとサブクラスの両方のメソッドを呼び出すことができます。二つ目の

説明: - :-methodオーバーロードは、コンパイル時に処理され

s2はスーパークラスのrefernceで、サブクラスのオブジェクトを保持しているので、ここでは2つの場合、我々は、ⅰ)メソッドのオーバーロード を考慮する必要がありますそれは常にスーパークラスのメソッドを呼び出すでしょう

ii)メソッドのオーバーライド:-methodのオーバーライドは実行時にハンドルであるため、常にサブクラスのメソッドを呼び出します。概念は多型から来た。

SubClass s1 = new SubClass();

SubClass s2 = new SubClass();

s1とs2の両方がサブクラスの参照であり、サブクラスのオブジェクトを保持しているため、どちらの場合もサブクラスオブジェクトが呼び出されます。

-1
SubClass s1 = new SubClass(); 
SuperClass s2 = new SubClass(); 

次のいずれかに比較します。 s1には、SuperClassで宣言されたメソッドと、​​で宣言されたメソッドを呼び出すことができます。

+0

@Downvoter:なぜdownvote? – Chris311

2

多型性の利点は、複数の実装を持つ能力にあります。その機能の下のコードからわかるように、letsHearのいずれかを受け取ります。タイプはAnimalです。だから、この方法は無関係で、あなたが通過している動物の種類は気にしません。

abstract class Animal { 
    abstract String talk(); 
} 

class Cat extends Animal { 
    String talk() { 
     return "Meow!"; 
    } 
} 

class Dog extends Animal { 
    String talk() { 
     return "Woof!"; 
    } 
} 

void letsHear(final Animal a) { 
    println(a.talk()); 
} 

int main() { 
    letsHear(new Cat()); 
    letsHear(new Dog()); 
} 

具体的な実装をその親に割り当てることができます。

Animal cat = new Cat(); 
Animal dog = new Dog(); 

例の方法letsHearは上記受け入れる場合のみCat、あなたはDogを受け入れ、別の方法を有することが必要とされるであろう。

1

可能な限り最高のクラスを使用してください。後でサブクラスを切り替えることができるので、柔軟性が向上します。もしそれをlocalyだけ使っているのであれば、それほど大したことではありませんし、副作用なしに全体の定義を変更することもできますが、SuperClassを使う方が良いでしょう。このコンテキストでは、は、SuperClassで定義された機能を必要とするだけであり、それは重要な部分です。

パラメータ内でははるかに重要です。 Java標準ライブラリの開発者がCollectionsメソッドを定義して、ArrayListのようなSubClassを取得したとします。コレクションインターフェイスのすべてのサブクラスを取得するためにはるかに多くのコードが必要になるだけでなく、新しいサブクラスを作成するとコードが不完全になります。

要約:操作を実際に行うために本当に必要な機能と、そのために必要なスーパークラスを自分に尋ねてください。それはリストですか?コレクション?たぶんIteratable?最も抽象的なものを取る。

1
  1. メソッドを呼び出す方法が異なる場合、サブクラスで宣言されたメソッドがスーパークラスに存在しない場合、スーパークラスの参照変数では表示されません。しかし、あなたはダウンキャスティングでそれらを呼び出すことができます。静的メソッドと静的メソッドを別々に呼び出すと、静的メソッドを呼び出す静的メソッドと動的メソッドの詳細については、
  2. を呼び出すことができます。例を確認してください。

    public class BaseClass { 
    
    public void compileSomeThing(){ 
    System.out.println("Base Method "); 
    } 
    public static void doSomething(){ 
    System.out.println("Base static method"); 
    } 
    } 
    

    基底クラス

    public class SubClass extends BaseClass{ 
    
    public void compileSomeThing(){ 
    System.out.println("Sub Method"); 
    
    } 
    public static void doSomething(){ 
    System.out.println("Sub static method"); 
    } 
    } 
    

    サブクラス。 メインクラス:

    public static void main(String[]args){ 
    BaseClass bs = new SubClass(); 
    SubClass bs1 = new SubClass(); 
    bs.compileSomeThing(); 
    bs.doSomething(); 
    System.out.println(".........."); 
    bs1.compileSomeThing(); 
    bs1.doSomething(); 
    

    }コンパイルの

結果:

Sub Method 
    Base static method 
     .......... 
    Sub Method 
    Sub static method 
  • 約続きを読む:メソッドを、オーバーロード、オーバーライドメソッド隠蔽http://www.javatpoint.com/method-overloading-in-javahttp://beginnersbook.com/2013/04/runtime-compile-time-polymorphism/ http://crunchify.com/java-method-hiding-and-overriding-override-static-method-in-java/
  • 関連する問題