黑马程序员技术交流社区
标题:
继承时,子类有与父类同名的变量时,该如何用?
[打印本页]
作者:
郑雪
时间:
2013-4-28 18:33
标题:
继承时,子类有与父类同名的变量时,该如何用?
本帖最后由 郑雪 于 2013-5-1 10:26 编辑
class Test_parent
{
int x = 5;
int y = 10;
int get_1()
{
return x + y;
}
}
class Test_4 extends Test_parent
{
int y;
Test_4(int a)
{
y = a;
}
}
class Test_Demo
{
public static void main(String[] args)
{
Test_4 a3=new Test_4(1);
System.out.println(a3.get_1());
}
}
为什么打印结果是15,而不是6?
作者:
李尧
时间:
2013-4-28 18:40
因为子类没有自己特有的get_1()方法 是从父类继承的. 你如果复写了父类的get_1() 结果就是6.
作者:
金辉
时间:
2013-4-28 18:51
子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法
子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承
子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。
jvm的执行过程
(1)子类Test_4 的构造方法被调用,实例化一个Test_4对象,Test_4对象的成员被初始化
(2)jvm隐含的调用父类的构造方法,实例化一个Test_parent对象,Test_parent对象的成员被初始化。
(3)由于Test_parent对象的get_1()未被屏蔽,所以调用的Test_parent对象的get_1()函数。
那么,在这里Test_parent的成员函数当然是访问自己的成员变量了。
作者:
李道福
时间:
2013-4-28 18:52
父类与子类有相同的变量时,可以用super来调用父的变量,用this来调用本类的变量
作者:
董波
时间:
2013-4-28 18:52
我对这个问题也很感兴趣,帮楼主顶一下
作者:
芦玉明
时间:
2013-4-28 19:08
class Test_4 extends Test_parent
{
int y;
Test_4(int a)
{
y = a;//这里的y是本类引用this.y=a,如果要传给父类需要 super.y=a;
}
}
复制代码
作者:
淡蓝色
时间:
2013-4-28 19:15
解决方法:
把Test_4中的 int y;去掉,结果为6,
测试已成功,不知道这符不符合你的原意
作者:
cowthan
时间:
2013-4-28 20:22
楼主,你是调用父类的get_1()方法,你可以从两个角度来考虑这个问题:
——父类写这么个方法的时候,return x + y; 其实是return this.x + this.y,对于父类来说,this就是他自己,所以取出的是父类的y,结果是15
——父类写这么个方法的时候,他怎么会知道子类中有什么成员?他哪儿知道你也有个y?所以面向对象怎么会提供这么一种机制让父类
的方法去调用一个父类没有,而子类不知道有没有的成员呢?
结论是:
——成员属性名字重复这种事不要做
——如果做了,为了保证子类能够访问子类特有的成员,就必须在子类中实现或者重写访问函数
作者:
任江峰
时间:
2013-4-28 20:54
get_1()是父类的方法,它和父类的x,y变量在同一片内存区域,只可以取到父类的x,y。
而取不到他的子类的y。所以运行结果是15.
作者:
赵崇友
时间:
2013-4-28 20:55
本帖最后由 赵崇友 于 2013-4-28 21:00 编辑
很简单的,当主函数执行到Test_4 a3=new Test_4(1);时,Test_4类会利用有参构造函数创建对象,而在Test_4类的构造函数函数的第一行有隐含的super();语句,即父类的空参数构造函数,所以是先加载父类,然后再是子类,所以才有了子类继承了父类的方法(如果子类没有复写的话)。因此,当你调用get_1()方法时,会先在本类(也就是子类Test_4类)中查找是否会有此方法,如果有的话,会调用其自己的方法,如果没有,则会再向父类查找。这个程序就是属于后面的这种情况。其实,无论你在创建对象时传递什么值,结果都会是15的(证实过了)。
另外,楼主可能会疑问,父类和子类当中同名的变量怎么区分,是这样的:父类当中定义的变量自在父类中有效,子类定义的变量只在子类中有效,这是属于成员变量的作用范围的内容。楼主应该看过了吧,可以回去复习下。提醒下,这些变量在使用时前面都默认有this关键字的,所以只在本类中有效。
class Test_parent
{
int x = 5;
int y = 10;
int get_1()
{
return x + y;
}
}
class Test_4 extends Test_parent
{
int y;
Test_4(int a)
{
y = a;
}
}
class Test_Demo
{
public static void main(String[] args)
{
Test_4 a3=new Test_4(5);
System.out.println(a3.get_1());//这里调用的子类继承父类的get_(1)方法,因此输出的是15.
}
}
复制代码
作者:
阿彪
时间:
2013-4-28 21:13
就近访问原则
作者:
黄玉昆
时间:
2013-4-30 23:40
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者:
Super_Class
时间:
2013-5-1 00:19
子类有父类的一切属性和方法。对子类的方法进行重写,可以覆盖父类,称为新的超类
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2