黑马程序员技术交流社区

标题: 继承时,子类有与父类同名的变量时,该如何用? [打印本页]

作者: 郑雪    时间: 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
  1. class Test_4 extends Test_parent
  2. {
  3.         int y;
  4.         Test_4(int a)
  5.         {
  6.                 y = a;//这里的y是本类引用this.y=a,如果要传给父类需要 super.y=a;
  7.         }
  8. }
复制代码

作者: 淡蓝色    时间: 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关键字的,所以只在本类中有效。
  1. class Test_parent
  2. {
  3.          int x = 5;
  4.          int y = 10;
  5.          int get_1()
  6.          {
  7.                  return x + y;
  8.          }
  9. }

  10. class Test_4 extends Test_parent
  11. {
  12.          int y;
  13.          Test_4(int a)
  14.          {
  15.                  y = a;
  16.          }
  17. }
  18. class Test_Demo
  19. {
  20.          public static void main(String[] args)
  21.          {
  22.                  Test_4  a3=new Test_4(5);
  23.                  System.out.println(a3.get_1());//这里调用的子类继承父类的get_(1)方法,因此输出的是15.
  24.          }
  25. }
复制代码

作者: 阿彪    时间: 2013-4-28 21:13
就近访问原则
作者: 黄玉昆    时间: 2013-4-30 23:40
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者: Super_Class    时间: 2013-5-1 00:19
子类有父类的一切属性和方法。对子类的方法进行重写,可以覆盖父类,称为新的超类




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