子类的哪个类型的属性不能被继承?
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”仍然是真的? 请详细说明子类的属性。谢谢!子类的哪个类型的属性不能被继承?
这是我认为令你困惑。看到这个例子:
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);
}
这样做的结果是
真正
真正
假
为什么? 基本类型,也被称为primitive types,按价值进行比较。正如我上面所说的,2千美元和2千美元的报价是相同的报价。它们代表相同的价值。
但是,对象,如数组,应该通过它们的equals()方法进行比较。使用默认的等号运算符==
只是比较内存位置。因此,两个分开的数组,两个都有相同的对象,但内存中的对象不同,并不相同。在另一方面,如果我说
int[] y = x;
然后x == y
将是真实的,因为他们会在内存中指向同一个对象。
注:我意识到数组可能不是最好的例子,因为比较数组应该使用静态的Arrays.equals(int[], int[])
方法进行真正的深度搜索。 x.equals(y)
仍然是假的,但Arrays.equals(x,y)
会给你真正的
哦,非常感谢。这是我的错。我误导了你另一个问题。现在我在Test5.I中更改我的代码。我改变了“float a = 2.0f;”到“String a =”abc“。为什么”test4.a == test5.a“仍然是真的?我想知道的是子类和超类之间的属性。 – Europa 2012-07-27 13:03:59
我没有仔细阅读这个问题,因为我应该。阅读@Flavio的回答 – 2012-07-27 13:05:53
TEST5是TEST5的一个实例(它确实是,即使它declarated为TEST4),其中有一个浮动成员变量,隐藏父类的一个 int成员变量。
test4是Test4的一个实例,因此它有一个int成员变量。 test4.a == test5.a,因为它们的值是相同的。
这个练习的诀窍是test5
被声明为Test4
类型,虽然实例化为Test5
。 当您访问test5.a
时,实际上您的值为Test4.a
。没有浮点数到整数比较。您可以通过将浮点数定义为5.0f
来轻松检查:无论如何,比较结果将为true
,因为您正在比较变量与自身。顺便说一下,这叫hiding。这很混乱,你应该知道它的存在只是为了避免它。
+1很好,我没有仔细阅读代码 – 2012-07-27 13:06:25
谢谢!我已经看到了“隐藏”的页面,它可以帮助我很多。也许我可以这样说。如果超类具有属性,如“int a = 2;”的a,则超类将子类中的“a”隐藏起来,而不管子类中的哪个类型为“a”。 – Europa 2012-07-27 13:31:12
因为'2.0'和'2'是相同的数字,'=='运算符比较它的两个操作数的值。 – 2012-07-27 12:46:41
一个是int,另一个是float.How它们可以是相同的数字吗? – Europa 2012-07-27 12:48:03
'float'和'int'是它们的类型,而不是它们的值。两个变量只需要具有相同的值来满足'=='。 – 2012-07-27 12:49:00