有关于继承的问题。如程序。。
class Test1 
{
    public String str = "test1";
    public String getStr()
   {
          return str;
    }
}
class Test2 extends Test1
{
    public String str = "test2";
    public String getStr()
   {
          return str;
    }
public static void main(String[] args){
  
    Test1 t1 = new Test2();
System.out.println(t1.str);
System.out.println(t1.getStr());
}}
为什么结果会是test1
test2难道只有方法能被重写,字段不能被重写吗?麻烦高手解释得详细点。

解决方案 »

  1.   

    是这样的。覆盖是针对方法。你的代码中的 str 涉及的概念叫做隐藏,子类的属性隐藏了基类的属性。
      

  2.   

    System.out.println(t1.str);属性隐藏了基类的属性中,显示的是test1而System.out.println(t1.getStr());就是直接使用
       public String getStr()
       {
              return str;
        }
    显示的就是test2
      

  3.   

    System.out.println(t1.str);//从对象中获取字段,根据t1声明类型(Test1)取得相应字段值
    System.out.println(t1.getStr());//多态, 运行时根据t1实际类型(Test2),调用相应函数