-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;
}

这两个属性的类型不一样。为什么“test4.a==test5.a”仍然是真的?请详细解释子类的属性。谢谢!

4

3 回答 3

4

这个练习的诀窍在于它test5被声明为一个Test4类型,尽管实例化为一个Test5. 当您访问时test5.a,您实际上是在获取Test4.a. 没有浮点到整数的比较。您可以通过将浮点数定义为等于来轻松检查这一点5.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 运算符==只是比较内存位置。因此,两个单独的数组,它们都具有相同的对象但内存中的对象不同,不会被判断为相等。另一方面,如果我说

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 回答