黑马程序员技术交流社区

标题: 我想问一下子父类变量重名的问题 [打印本页]

作者: 练习题    时间: 2014-8-14 10:37
标题: 我想问一下子父类变量重名的问题
class A {
    protected String a = "1";
   
    public String getA(){
        return this.a;
    }
}
class B extends A {
    protected String a = "2";

    public static void main(String[] args) {
        
        B x = new B();
        System.out.println(x.getA());
    }
}


父类和子类当中都有一个同名的变量,那么是不是创建哪个对象调用的就是哪个对象的属性,是独立的吗? 还有一个问题为什么这个代码的结果返回是1,不应该B继承了A的getA()的方法,返回一个this.a不应该返回的是2吗?为什么是1

作者: 练习题    时间: 2014-8-14 11:02
没人帮解惑么
作者: 依然超级赛亚人    时间: 2014-8-14 11:08
本帖最后由 依然超级赛亚人 于 2014-8-14 11:12 编辑

1.子父类中,成员变量和它的值是可以继承但不能重写的。2.你的这个案例中,子类继承了父类的getA()方法,但却没有重写父类的这个方法,而这个方法调用的是父类自己的变量a的值“1”。所以,你在用子类对象调用父类这个方法时其实就是父类自己的这个方法实现了,没有用到子类中变量a。

作者: 练习题    时间: 2014-8-14 11:22
依然超级赛亚人 发表于 2014-8-14 11:08
1.子父类中,成员变量和它的值是可以继承但不能重写的。2.你的这个案例中,子类继承了父类的getA()方法,但 ...

1.如果说是继承下来那么子类当中不是就出现了两个同名变量了吗protected String a = "1"; protected String a = "2";   2.我还是不太明白getA()继承下来之后this.a不就是指向子类的成员变量了吗?
作者: 依然超级赛亚人    时间: 2014-8-14 13:29
本帖最后由 依然超级赛亚人 于 2014-8-14 13:30 编辑
练习题 发表于 2014-8-14 11:22
1.如果说是继承下来那么子类当中不是就出现了两个同名变量了吗protected String a = "1"; protected Stri ...

对于“变量以及它的值可以继承(即使父类与子类有同名变量)”这个问题你应该不会有什么疑问啊?如果真的怀疑,那请看下面这几句代码:
  1. class Fu{
  2.     protected String a = "1";
  3. }
  4. class Zi extends Fu{
  5.   public void show(){
  6.     System.out.println(super.a);
  7.    }
  8. }
  9. class Test{
  10.         public static void main(String[] args){
  11.    Zi z = new Zi();
  12.    z.show();
  13.         }
  14. }
复制代码

子类Zi中没有定义a吧?如果没有继承父类的a,那么编译会报错的,事实上却没有。我想啊,继承过来肯定是没有问题,但你不能把继承单纯的认为复制过来了。你的代码中子父类中都有一个protected String a = "1(或2)";语句,但是我认为子类在把父类的这个语句继承过来(或者是在调用时)以后给这个a加了我们看不到的特殊处理,好像标记了super一样(不过你要是自己加上super会报错,暂时我也没弄好这一点),这样的话两个a就区别开了。
2.子类在初始化之前先初始化父类,我认为你的这个案例,在子类初始化之前父类中的getA()方法已经将它自己的a的值“封在”这个方法中了,而你的子类没有重写这个方法,你在调用它的时候应该相当于帮父类实现了getA方法。我也只能理解到这里了,老师可能都讲过,但是我记性不好,忘记了,一时半会我也没找到,相关的电子资料太多了,只能自己先这样理解。你可以坐等其他人的说法。
作者: 练习题    时间: 2014-8-14 15:52
本帖最后由 练习题 于 2014-8-14 15:54 编辑
依然超级赛亚人 发表于 2014-8-14 13:29
对于“变量以及它的值可以继承(即使父类与子类有同名变量)”这个问题你应该不会有什么疑问啊?如果真的 ...

谢谢你,
1.我自己试了一样,个人认为出现同名之后,子类并没有把父类的同名变量继承下来,因为在子类内部的方法调用子类本身的a值就是"2",而用super调用父类的a,值就是1.
2.这道题我是在网上看到的,他说结果是1所以我不太理解拿过来想跟大家讨论讨论,你说的子类在初始化之前先初始化父类,这仅限于构造函数.如果调用无参的构造函数,并没有做任何初始化动作,getA(),也没有在任何时候被调用过.而你这个说法还需要琢磨,不过谢谢你
作者: 练习题    时间: 2014-8-15 10:33
还有人回答吗




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