/**
*(:~)super测试
*@author HongGangBai
*@version 1.0 2006-05-05
*/package cctv.java;public class TestSuper
{
    String name = "父类的毛毛!"; 
    public void f()
    {
  System.out.println("父类的方法!");
    }
    
}
//***************************************
class Test1 extends TestSuper
{
    public static void main(String[] args)
    {
Test1 te = new Test1();
te.name = "子类中的毛毛!";
System.out.println(te.name);
te.f();
    }
    public void f()
    {
System.out.println("子类改写的方法!");
System.out.println("super.name: "+super.name);
    }}
//********************************
//上面的程序运行后结果是:
//子类中的毛毛!
//子类改写的方法!
//super.name:子类中的毛毛!
为什么最后一句不是输出:“super.name:父类的毛毛!”呢?
super不是指向父类吗? 在线等回答!谢谢!

解决方案 »

  1.   

    super指向父类没错,打印super.name:子类中的毛毛!也没错,因为子类中继承了父类的name属性
    Test1 te = new Test1();
    te.name = "子类中的毛毛!";
    所以此时父类和子类的name属性是一样的.
      

  2.   

    你的子类中没有定义name属性,换句话说te.name与super.name是同一个东西,因此te.name = "子类中的毛毛!"改变了值(super.name当然被改变了),输出的当然是"子类中的毛毛!".
      

  3.   

    te.name = "子类中的毛毛!";这句话调用时就改变了父类中name的值,super.name就已经改为了"子类中的毛毛!"
      

  4.   

    各位注意了!
    上面的程序中并没有把父类的name属性值改变!这个我测试过!在main()方法中加:
    TestSuper tt = new TestSuper();
    System.out.println(tt.name);
    输出的是父类的毛毛!
    说明并没有把父类的name属性值改变!大家可以自己运行测试!
    当我把上面的程序中的子类Test1中加了一行 String name = "无关的毛毛!";
    也就是改成下面的程序,输出的结果super.name:父类的毛毛!就正确了,不知道做何解释??
    难道是JDK的BUG?大家研究下跟SUN公司联系看看,呵呵~~
    /**
    *(:~)super测试
    *@author HongGangBai
    *@version 1.0 2006-05-05
    */package cctv.java;public class TestSuper11
    {
        String name = "父类的毛毛!"; 
        public void f()
        {
      System.out.println("父类的方法!");
        }
        
    }
    //***************************************class Test1 extends TestSuper11
    {
        String name = "无关的毛毛!";
        public static void main(String[] args)
        {
    Test1 te = new Test1();
    te.name = "子类中的毛毛!";
    System.out.println(te.name);
    te.f();
        }
        public void f()
        {
    System.out.println("子类改写的方法!");
    System.out.println("super.name: "+super.name);
        }}
      

  5.   

    哎,你在main中:
    TestSuper tt = new TestSuper();
    System.out.println(tt.name);这是创建另一个对象了,一个新的对象,两个对象并不共享name变量而你下面所做的测试,因为你在子类中定义了一个name属性,它隐藏了父类的name属性,所以你调用super.name调用的是父类的name属性
      

  6.   

    这并非什么bug,你应该认真读下TIJ对继承的描述
      

  7.   

    还是不明白!楼上的能解释的清楚点吗?为什么最上面的程序super.name没有输出父类的毛毛!
    而下面的就能?
    在线等~谢谢!
      

  8.   

    楼上说的没错,TIJ中对这个有很详细的说明。
      

  9.   

    道理其实很简单,子类继承父类,它就继承了父类中所定义的所有变量,包括私有的.
    当子类定义一个父类中已有的变量,它将隐藏父类的变量,也就是子类中此时包括两个变量,一个是子类自己定义的,一个来自父类
    如你所举的例子,
    String name = "父类的毛毛!";       //这是父类定义的name
    在子类Test1中:
    String name = "无关的毛毛!";   //这是子类定义的name,它将隐藏掉父类的name而方法就不同,如果子类定义了一个与父类一样的方法,它将覆写此方法
      

  10.   

    隐藏了父类的属性这个明白,可是为什么最上面的程序是那样的结果呢?
    还有,TIJ是什么东西?我在哪能看到?谢谢!
      

  11.   

    最上面的程序,你在子类中并没有定义一个新的name属性啊....此时的name在子类和父类中是一样的.TIJ就是<java编程思想>(<Thinking in java>)
      

  12.   

    谢谢killme2008(zane dennis)这么热心帮我!
    还是不明白~
    最上面的程序中~父类中有一个name;
    子类继承父类,那子类中也就有了name属性~
    我再实例一个对象te,修改te.name=“子类中的毛毛”,那父类的name还是‘父类的毛毛’啊~
    super.name应该输出“父类的毛毛”啊~不明白怎么会输出“子类的毛毛”~谢谢~
      

  13.   

    不是说了,父类和子类此时的name对象是同一个。
      

  14.   

    o ~
    问一下~java编程思想中在哪块能查到super?
    谢谢~在线等~