-3
class Test4{
    int a=2;
    public static void main(String[] args){
    Test4 test4=new Test4();
    Test4 test5=new Test5();
    System.out.println("test4_a="+test4.a);
    System.out.println("test5_a="+test5.a);
    System.out.println(test4.a==test5.a);
    }
}
class Test5 extends Test4{
    float a=2.0f;
}

2 つの属性の型が同じではありません。なぜ「test4.a==test5.a」が真なのですか? サブクラスの属性を詳しく説明してください。ありがとうございます。

4

3 に答える 3

4

この演習の秘訣は、が としてインスタンス化されているにもかかわらずtest5、型として宣言されていることです。にアクセスすると、実際には の値が取得されます。float と integer の比較はありません。float を と等しいように定義することで、これを簡単に確認できます。変数をそれ自体と比較しているため、とにかく比較は行われます。Test4Test5test5.aTest4.a5.0ftrue

ちなみに、これは非表示と呼ばれます。非常に紛らわしいので、回避するためだけに存在することを知っておく必要があります。

于 2012-07-27T13:00:20.717 に答える
2

これがあなたを混乱させていると私が思うものです。次の例を参照してください。

public static void main(String[] args)
{
    int a = 5;
    double b = 5.0;
    short c = 5;
    
    System.out.println(a == b);
    System.out.println(b == c);
    
    int[] x = {1,2,3};
    int[] y = {1,2,3};
    
    System.out.println(x == y);
    
}

この結果は次のとおりです。

真実

真実

間違い

なんで?プリミティブ型とも呼ばれる基本型は、値によって比較されます。上で述べたように、$2k のオファーと $2.0k のオファーは同じオファーです。それらは同じ値を表します。

ただし、配列などのオブジェクトは equals() メソッドで比較する必要があります。デフォルトの equals 演算子を使用すると、==メモリ位置が比較されます。したがって、2 つの別個の配列は、どちらも同じオブジェクトを持ちますが、メモリ内のオブジェクトが異なる場合、等しいとは判断されません。逆に言えば

int[] y = x;

それらx == yはメモリ内の同じオブジェクトを指しているためです。

Arrays.equals(int[], int[])注:真のディープ検索を行うには、静的メソッドを使用して配列を比較する必要があるため、配列が最良の例ではない可能性があることは認識しています。x.equals(y)それでも偽になりますがArrays.equals(x,y)、あなたに真を与えるでしょう

于 2012-07-27T12:55:34.540 に答える
1

test5 は Test5 のインスタンスであり (Test4 として宣言されていますが、実際にはそうです)、float メンバー変数を持ち、スーパークラスint メンバー変数を隠しています。

test4 は Test4 のインスタンスであるため、int メンバー変数があります。test4.a == test5.a、これらの値は同じであるためです。

于 2012-07-27T12:56:15.523 に答える