子类的哪个类型的属性不能被继承?

问题描述:

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”仍然是真的? 请详细说明子类的属性。谢谢!子类的哪个类型的属性不能被继承?

+3

因为'2.0'和'2'是相同的数字,'=='运算符比较它的两个操作数的值。 – 2012-07-27 12:46:41

+0

一个是int,另一个是float.How它们可以是相同的数字吗? – Europa 2012-07-27 12:48:03

+0

'float'和'int'是它们的类型,而不是它们的值。两个变量只需要具有相同的值来满足'=='。 – 2012-07-27 12:49:00

这是我认为令你困惑。看到这个例子:

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)会给你真正的

+0

哦,非常感谢。这是我的错。我误导了你另一个问题。现在我在Test5.I中更改我的代码。我改变了“float a = 2.0f;”到“String a =”abc“。为什么”test4.a == test5.a“仍然是真的?我想知道的是子类和超类之间的属性。 – Europa 2012-07-27 13:03:59

+0

我没有仔细阅读这个问题,因为我应该。阅读@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

+1很好,我没有仔细阅读代码 – 2012-07-27 13:06:25

+0

谢谢!我已经看到了“隐藏”的页面,它可以帮助我很多。也许我可以这样说。如果超类具有属性,如“int a = 2;”的a,则超类将子类中的“a”隐藏起来,而不管子类中的哪个类型为“a”。 – Europa 2012-07-27 13:31:12