2017-07-30 1 views
0

私はsuperが直接の親クラスオブジェクトを参照するために使用される参照変数であることを知っています。しかし、私はsuperthisの両方のハッシュコードが同じであることを意味します。つまり、それらは子オブジェクトを参照しています。hashCode()は "super"と "this"で呼び出されたときに同じ結果を返すのはなぜですか?

次に、superは親クラスオブジェクトを呼び出すためにどのように使用されますか?

サンプルコード:

class Animal{ 
    int a; 
    Animal(){ 
     System.out.println("animal constructor "); 
    } 
} 

class Dog extends Animal{ 
    int b; 
    Dog(){ 
     System.out.println("dog constructyor "); 
     System.out.println(this.hashCode()+" "+super.hashCode()); 
     System.out.println(this.getClass()+" "+super.getClass()); 
    } 
} 
public class Super1{ 
    public static void main(String[] args){ 

     Dog d=new Dog(); 
     System.out.println(d); 


    } 
} 

また、スーパーや、この両方のクラスが同じです。どのように「スーパー」 呼び出しの親クラスオブジェクトに

を使用しているよりも、彼らは子オブジェクトを参照すること

答えて

3

私はsuperが直接の親クラスオブジェクトを参照するために使用される参照変数であることを知っています。

いいえ、それはありません。親クラスのメンバーを参照するために使用されます。 「親クラスオブジェクト」のようなものはありません。

しかし、私はスーパーとこれの両方のハッシュコードが同じであることを意味します。つまり、それらは子オブジェクトを参照しています。

いいえ。

これらのクラスのいずれかでhashCode()をオーバーライドしていないので、呼び出すときに参照する参照に関係なく常に同じ結果が得られます。

super.getClass()を呼び出すと、オブジェクトのクラスが魔法のように変わることはありません。

+0

返信ありがとうございます....私はこのサイトのスーパーについて読んでいます。[リンク](https://www.javatpoint.com/super-keyword)@EJP –

+0

そのリンクは通常のグレードAのドリブンです。大規模なOracleサイトがある場合は、サードパーティのサイトを使用しないでください。 – EJP

0

また、スーパーや、この両方のクラスが同じです。

私はあなたが継承がどのように機能するかは分かりません。
サブクラスをインスタンス化するとき、スーパークラスを使用してサブクラスを作成しますが(super())、2つのオブジェクトは作成されません。
サブクラスのインスタンスのみが作成されます。
あなたの出力に結果が得られます。 super.hashCode()hashCode()を呼び出す側の注意点としては


、あなたはサブクラスでオーバーライドhashCode()ていた場合は、親メソッドを呼び出します最初のものとオーバーライドされたものを呼び出します。二つ目として、明確な結果を返すことができます。

関連する問題