关于继承方面的问题困扰了我好久,好久,请高手帮助指点指点,谢谢谢谢!
源文件如下:
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()方法,
这到底是为什么?
源文件如下:
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()方法,
这到底是为什么?
第二 因为.new TestExtends().printInfo(); 你调用的这个方法没有在子类重新父类的printInfo方法
第三 因为子类的子类重写父类方法
方法是被覆盖的,而属性是 隐藏 的!
属性在方法中的引用和子类是否覆盖方法无关,调谁的方法就访问谁的属性,因为属性是不能被覆盖的!(因为属性是个实实在在存在的内存地址,依附于实例对象。而方法依附于类对象,多少个实例对象调用的都是同一个方法)
你在子类中增加如下方法覆盖父类方法,引用的仍旧是父类属性。
public void printInfo() {
super.printInfo();
}
所以,子类要想直接引用父类的属性,必须使用super
比如你将子类的showIValue方法改成
public void showIValue() {
System.out.println("子类的showIValue()方法打印i的值是:" + super.i);
}
最后打印的就是父类的属性。解释的可能不够浅显,凑合理解吧。
请注意,super和new 父类()是不同的。super并未创造新的父类对象,它的含义是指定使用父类的方法或数据。
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不对?
当你打印i和name的时候要明确指明打印谁的 要不然就得程序自己查找i和name 他查找的原理是就近原则
即先从自己身来查找 也就是 如果类TestExtends 可以在自身的成员属性中可以找到i和name就不在查找了直接输出
如果找到就去父类中去找
那成员方法也是如此 先从子类自身开始找 找不到就去父类中找
如果要在子类中输入父类中的变量值 就要明确指定 可以创建一个对象 或是用super.i和super.name调用父类中的成员属性
this就是表示当前对象
你虽然没有给TestExtends实例化一个对象 但是系统自动调用默认的午餐构造方法给你创建一个对象 那这个对象就有属性 这里的属性是i = 200; String name="子类中的name"; 还有那几个方法
那你这里的当前对象就表示包含有(i = 200;String name="子类中的name"; 还有那几个方法)的对象
实例化一个对象同时就开辟了内存空间和拥有了一些属性 ,名字(引用)可有可无 像匿名对象就没有引用
http://topic.csdn.net/u/20100928/23/08168827-4163-4bf4-a39c-945d0add45fd.html