关于继承方面的问题困扰了我好久,好久,请高手帮助指点指点,谢谢谢谢!
源文件如下:
package dongaiqin2005;
 class TestExtends extends SuperClass{
int i=200;

String name="子类中的name";
public void showIValue(){
System.out.println("子类的showIValue()方法打印i的值是:"+i);
} public static void main(String[] args) {
System.out.println("子类中的i值 "+new TestExtends().i);

System.out.println("子类中的name: "+new TestExtends().name);
new TestExtends().printInfo();
}}
class SuperClass{
int i=100;
String name="父类中的name";

public void printInfo(){
System.out.println("父类的printInfo()方法打印name值:"+this.name+"  "+"i的值"+this.i);
System.out.println("父类的printInfo()方法调用 父类的showIValue()方法");
this.showIValue();
}
public void showIValue(){
System.out.println("父类的showIValue()方法");
}

}
*********************************************************
输出结果:
子类中的i值 200
子类中的name: 子类中的name
父类的printInfo()方法打印name值:父类中的name  i的值100
父类的printInfo()方法调用 父类的showIValue()方法
子类的showIValue()方法打印i的值是:200*********************************************************
求助有两点不明白:
1.System.out.println("子类中的i值 "+new TestExtends().i);
        
System.out.println("子类中的name: "+new TestExtends().name);
为什么new TestExtends().i和new TestExtends().name输出的i 和name值是在子类中定义的值 :子类中的name 和 200
2.new TestExtends().printInfo();语句输出的i 和name是在父类中定义的值
100 和 父类中的name ,为什么此处不是输出在子类中定义的200 和子类中的name [color=#993300]
[/color]3.new TestExtends().printInfo()中调用showIValue()方法时,实际上又是调用子类中的showIValue()方法,
这到底是为什么?

解决方案 »

  1.   

    我是这样理解的第一  因为属性是在编译器就初始化的  所以按照顺序是先打印父类的 属性
    第二  因为.new TestExtends().printInfo(); 你调用的这个方法没有在子类重新父类的printInfo方法 
    第三  因为子类的子类重写父类方法   
      

  2.   

    我对楼上几位解释有些疑问。1和3没什么好说的,关键是2。继承理论:
    方法是被覆盖的,而属性是 隐藏 的!
    属性在方法中的引用和子类是否覆盖方法无关,调谁的方法就访问谁的属性,因为属性是不能被覆盖的!(因为属性是个实实在在存在的内存地址,依附于实例对象。而方法依附于类对象,多少个实例对象调用的都是同一个方法)
    你在子类中增加如下方法覆盖父类方法,引用的仍旧是父类属性。
    public void printInfo() {
      super.printInfo();
    }
    所以,子类要想直接引用父类的属性,必须使用super
    比如你将子类的showIValue方法改成
    public void showIValue() {
      System.out.println("子类的showIValue()方法打印i的值是:" + super.i);
    }
    最后打印的就是父类的属性。解释的可能不够浅显,凑合理解吧。
      

  3.   

    子类继承父类后,其成为一个父类和子类的混合体。这个混合体包括,子类的数据,子类的独有方法,子类覆写的父类方法。父类独有的数据,父类的独有方法。请注意:这里没有父类被子类覆写的方法,被覆写方法并不是消失了,而是被隐藏起来,默认情况下不会被调用。而数据不能被覆写,其效果相当与全局变量和局部变量同名的情况。事实上,父类的同名数据依然存在。this.showIValue();显示结果为子类方法就是这个原因,因为父类的同名方法已被隐藏。而如果你调用的是父类特有的方法,其将调用父类的数据,因为数据无法覆写。如果你非要调用父类因被子类覆写而隐藏的方法,就要使用super。
    请注意,super和new 父类()是不同的。super并未创造新的父类对象,它的含义是指定使用父类的方法或数据。
      

  4.   

    子类对象调用下面的方法,方法中this就应该是指子类对象,这样理解对吗?public void printInfo(){
    System.out.println("父类的printInfo()方法打印name值:"+this.name+" "+"i的值"+this.i);
    System.out.println("父类的printInfo()方法调用 父类的showIValue()方法");
    this.showIValue();
    }this.name就应该是子类对象的name-->输出:"子类中的name"
    this.i就应该是子类对象的i -->输出:200但是输出的是 :父类中的name  和 100 ,郁闷,迷惑...我理解的this不对?
      

  5.   

    首先TestExtends类中有他自己的成员属性 i和name 同时也从父类中继承了i和name
    当你打印i和name的时候要明确指明打印谁的 要不然就得程序自己查找i和name 他查找的原理是就近原则
    即先从自己身来查找 也就是 如果类TestExtends 可以在自身的成员属性中可以找到i和name就不在查找了直接输出
    如果找到就去父类中去找 
    那成员方法也是如此 先从子类自身开始找 找不到就去父类中找
    如果要在子类中输入父类中的变量值 就要明确指定 可以创建一个对象 或是用super.i和super.name调用父类中的成员属性
    this就是表示当前对象 
    你虽然没有给TestExtends实例化一个对象 但是系统自动调用默认的午餐构造方法给你创建一个对象 那这个对象就有属性 这里的属性是i = 200; String name="子类中的name"; 还有那几个方法 
    那你这里的当前对象就表示包含有(i = 200;String name="子类中的name"; 还有那几个方法)的对象
    实例化一个对象同时就开辟了内存空间和拥有了一些属性 ,名字(引用)可有可无 像匿名对象就没有引用
      

  6.   


    http://topic.csdn.net/u/20100928/23/08168827-4163-4bf4-a39c-945d0add45fd.html