2012-09-03 118 views
6

在一个类中,与超类中的字段具有相同名称的字段隐藏了超类的字段。Java中的隐藏字段继承

public class Test { 

    public static void main(String[] args) { 

     Father father = new Son(); 
     System.out.println(father.i); //why 1? 
     System.out.println(father.getI()); //2 
     System.out.println(father.j); //why 10? 
     System.out.println(father.getJ()); //why 10? 

     System.out.println(); 

     Son son = new Son(); 
     System.out.println(son.i); //2 
     System.out.println(son.getI()); //2 
     System.out.println(son.j); //20 
     System.out.println(son.getJ()); //why 10? 
    } 
} 

class Son extends Father { 

    int i = 2; 
    int j = 20; 

    @Override 
    public int getI() { 
     return i; 
    } 
} 

class Father { 

    int i = 1; 
    int j = 10; 

    public int getI() { 
     return i; 
    } 

    public int getJ() { 
     return j; 
    } 
} 

有人可以解释我的结果吗?

+1

根据你的理解隐藏和继承是什么意思;你为什么认为价值观是他们的方式?你应该可以为自己解决这个问题。 –

+0

这是功课吗? –

+0

儿子不是隐藏变量的父类型 – jsj

回答

8

在java中,字段不是多态的。

Father father = new Son(); 
System.out.println(father.i); //why 1? Ans : reference is of type father, so 1 (fields are not polymorphic) 
System.out.println(father.getI()); //2 : overridden method called 
System.out.println(father.j); //why 10? Ans : reference is of type father, so 2 
System.out.println(father.getJ()); //why 10? there is not overridden getJ() method in Son class, so father.getJ() is called 

System.out.println(); 

// same explaination as above for following 
Son son = new Son(); 
System.out.println(son.i); //2 
System.out.println(son.getI()); //2 
System.out.println(son.j); //20 
System.out.println(son.getJ()); //why 10? 
+0

刚刚在java?任何其他语言在字段上提供多态性? – UnKnown

2

Overriding and Hiding Methods

是被调用隐藏方法的版本取决于它是否是从超类或子类调用。

即当调用该子类中经由一个超类引用被调用超类方法覆盖的方法和它访问超类成员。

这就解释了以下作为所使用的参考是超类:

System.out.println(father.i); //why 1? 
System.out.println(father.j); //why 10? 
System.out.println(father.getJ()); //why 10? 

类似地,对于以下内容:

System.out.println(son.getJ()); //why 10? 

因为getJ()Son限定的Father版本被调用它认为构件在Father类中定义。

如果您看过Hiding Fields;他们特别不推荐这样的编码方法:

一般来说,我们不建议隐藏字段,因为它会使代码难以阅读。