黑马程序员技术交流社区

标题: 子类继承父类的同名变量问题 [打印本页]

作者: 李阳    时间: 2013-1-8 13:50
标题: 子类继承父类的同名变量问题
本帖最后由 李阳 于 2013-1-8 14:37 编辑

class ExtendsDemo
{
        public static void main (String args[])
        {
                SonClass s = new SonClass();
                s.show();
                System.out.println(s.name);
        }
}
class FatherClass
{
        String name = "china";
        public void show()
        {
                System.out.println(this.name);
        }

}
class SonClass  extends FatherClass
{
        String name = "beijing";
}
/*

子类继承父类,没有对父类的show()方法重写。
为什么子类对象调用show()方法显示的是父类的成员变量?
*/
作者: 黑马王振宇    时间: 2013-1-8 13:59
是啊,就是这么回事啊,没有为什么啊,就那样的,要解释的话那就分析一下,
首先你子类new出来个子类对象s,s调用的show方法,那么JVM会去子类中找show这个方法,
没找到(这里就是你说的没重写父类方法),那么他就要去父类里边找啊,然后调用show方法打印china,
然后主函数,打印s.name,就是子类当中name啊
作者: 杨建聪    时间: 2013-1-8 14:12
System.out.println(this.name);
手头没有编译器,你可以试试去掉这个“this",打印的应该是子类的成员变量
根据this的特点:本类功能内部使用了本类对象,才用this表示。子类虽然集成了父类的方法,但是子父类中的成员变量都可以访问,只是用this和super来区分调用
作者: 李阳    时间: 2013-1-8 14:16
子类继承父类,实际上是确立一种引用关系,子类并没有正真的拥有所继承的内容。子类要用到父类的内容时,会去父类找。所以调用show()方法,显示的是父类的内容。
我这样理解对不对?
作者: 李阳    时间: 2013-1-8 14:19
杨建聪 发表于 2013-1-8 14:12
System.out.println(this.name);
手头没有编译器,你可以试试去掉这个“this",打印的应该是子类的成员变量 ...

试过了,显示的还是父类的
作者: 黑马王振宇    时间: 2013-1-8 14:27
子类继承父类,是继承关系,子类会拥有父类的变量和方法,你的子类当中没有重写父类的show方法,那么调用子类对象的show方法时候会用继承下来的父类中的方法,就是调用了父类中的show了,打印就是china了,即使你去掉this,打印出来的还是china,父类都不知道你子类能不能有同名变量,难道你要他打印子类当中的name?所以打印出来的不是beijing而是父类中的name:china。
作者: 李阳    时间: 2013-1-8 14:39
黑马王振宇 发表于 2013-1-8 14:27
子类继承父类,是继承关系,子类会拥有父类的变量和方法,你的子类当中没有重写父类的show方法,那么调用子 ...

谢谢了:handshake
作者: 罗利华    时间: 2013-1-8 14:49

只要创建一个类的实例对象时,都会有一个默认的引用指向这个类本身,也就是this。
你上面的FatherClass中的this就是它本类的一个引用,
FatherClass中定义的name属性,只是属于本类的一个属性,
因此,本类的引用(this)当然只会调用本类的属性。
所以当你调用时会打印出FatherClass的内容。
super指的是父类的一个引用。以下是实验代码:
class FatherClass {
        public int value;
        public void f() {
                value = 100;
                System.out.println
                ("FatherClass.value:"+this.value);
        }
}

class ChildClass extends FatherClass {
        public int value;
        public void f() {
                super.f();
                value = 200;
                System.out.println
                ("ChildClass.value="+this.value);
                System.out.println(super.value);
        }
}
public class TestInherit {
        public static void main(String[] args) {
                ChildClass cc = new ChildClass();
                cc.f();
        }
}
打印结果:
FatherClass.value:100
ChildClass.value=200
100
可以发现当调用子类中的f()方法时,通过super.f()调用了父类中f()方法.
而this.value打印的是各自类中的属性值。
作者: 陈丽莉    时间: 2013-1-8 14:51
因为父类中的show方法并没有传递参数,继承类执行时,同名变量优先找父类中的调用,而函数优先找子类中的执行,所以输出的是china和beijing。若要输出子类中名字,可以将show方法改为有参数并输出传入的参数的方法。下面为修改后的代码,已测试。
class Demo
{
        public static void main (String args

[])
        {
                SonClass s = new SonClass();
                s.show(s.name);
                System.out.println(s.name);
        }
}
class FatherClass
{
        String name = "china";
        public void show(String name)//改为有参数的方法
        {
                System.out.println(name);//若此处为this.name则输出仍未china;
        }

}
class SonClass  extends FatherClass
{
        String name = "beijing";
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2