package test;
class A 
{
    int x = 5;
} 
class B extends A 
{
    int x = 6;
} 
public class CovariantTest 
{
    public A getObject() 
    {
       return new A();
    } 
    public static void main(String[]args) 
    {
       CovariantTest c1 = new SubCovariantTest();
       System.out.println(c1.getObject().x);
    }
}
class SubCovariantTest extends CovariantTest 
{
    public B getObject() 
    {
       return new B();
    }
}版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
提到了隐藏域,子类的域会隐藏父类同名域,和重写是不一样的。我不太明白这个与答案有什么联系
这就是说两个变量都叫x,但是是两个我完全不同的变量,既然不同的变量,干脆我们就用不同的名字。
看下面的代码,我把派生类的x修改为y,使得派生类的x叫做y
 /* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class A 
{
    int x = 5;
} 
class B extends A 
{
    int y = 6;
} 
class SubCovariantTest extends CovariantTest 
{
    public B getObject() 
    {
        System.out.println("sub getobj");
       return new B();
    }
}
/* Name of the class has to be "Main" only if the class is public. */
class CovariantTest 
{
    public A getObject() 
    {
        System.out.println("ct getobj");
       return new A();
    } 
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        CovariantTest c1 = new SubCovariantTest();
        System.out.println(c1.getObject().y);
    }
}现在这代码没办法编译了。
System.out.println(c1.getObject().x);
可以编译。
说明派生类定义的那个变量,编译器根本就不承认它的存在。为什么如此?因为
public B getObject() 
{
    System.out.println("sub getobj");
   return new B();
}你一厢情愿把返回值写成B,但是它仍然只能返回A
这个叫做协变式覆盖