黑马程序员技术交流社区

标题: Java中继承时子类定义了和父类重名的成员变量的问题(看代码) [打印本页]

作者: evan.zhou    时间: 2016-10-26 11:19
标题: Java中继承时子类定义了和父类重名的成员变量的问题(看代码)
Zi类的对象去调用的show,当前对象应该是子类对象啊,为什么输出的结果是父类的成员变量的默认值?

[Java] 纯文本查看 复制代码
class Demo {
        public static void main(String[] args) {
                Zi z= new Zi();
                z.show();//子类的对象去调用的show,当前对象应该是子类对象啊,为什么输出的结果是父类的成员变量值?
        }
}
class Fu {
        public int a;
        private String s;
       
        public int getA() {
                return a;
        }
        public void setA(int a) {
                this.a = a;
        }
        public String getS() {
                return s;
        }
        public void setS(String s) {
                this.s = s;
        }
       
        public void show(){
                System.out.println(this.a);
                System.out.println(this.s);
        }
}

class Zi extends Fu{
        int a = 123;
        String s = "niao";       
}

作者: zhangpanqin    时间: 2016-10-26 11:57
构造方法不能继承,你要在子类重写构造方法,对父类初始化

作者: 想跳楼    时间: 2016-10-26 12:52
楼上说的很对

作者: 若白衣卿相    时间: 2016-10-26 12:59
楼上你在说什么,虽然没有构造方法,但是也手动赋值了,楼主问的不是构造方法啊

作者: 雪中鱼01    时间: 2016-10-26 13:04
今天学了静态,也很困惑

作者: 若白衣卿相    时间: 2016-10-26 13:12
子类对象在内存中分为两个区域,分别标记为this和super,访问父类中成员默认都会加super.成员,在你这个show方法里,就相当于super.this.a,show方法中的this其实是指向一个父类地址,去掉this变量名就近访问,输出就肯定是子类成员变量

作者: IceLoveInFire丶    时间: 2016-10-26 13:49
这样解释还可以

作者: evan.zhou    时间: 2016-10-26 13:59
若白衣卿相 发表于 2016-10-26 13:12
子类对象在内存中分为两个区域,分别标记为this和super,访问父类中成员默认都会加super.成员,在你这个sho ...

去掉this也是一样的结果哦
作者: evan.zhou    时间: 2016-10-26 14:04
本帖最后由 evan.zhou 于 2016-10-26 14:06 编辑
若白衣卿相 发表于 2016-10-26 13:12
子类对象在内存中分为两个区域,分别标记为this和super,访问父类中成员默认都会加super.成员,在你这个sho ...

这个解释还是有点晕啊
对着运行结果,解释下运行过程呗。谢谢
作者: evan.zhou    时间: 2016-10-26 14:07
zhangpanqin 发表于 2016-10-26 11:57
构造方法不能继承,你要在子类重写构造方法,对父类初始化

我不是问的构造方法的问题啦
看运行结果,解释运行过程
作者: sjpstudy    时间: 2016-10-26 14:18
好的咧

作者: evan.zhou    时间: 2016-10-26 17:14
sjpstudy 发表于 2016-10-26 14:18
好的咧

啥意思???
作者: zhangpanqin    时间: 2016-10-26 17:51
若白衣卿相 发表于 2016-10-26 12:59
楼上你在说什么,虽然没有构造方法,但是也手动赋值了,楼主问的不是构造方法啊
...

创建对象,默认是无惨构造,所以是创建了对象,而没有赋值,你在子类写的没有用

作者: Lee_Hoon_Leong    时间: 2016-10-26 18:06
运行时子类调用父类的无参构造

作者: 若白衣卿相    时间: 2016-10-27 01:45
简单的说吧,子类中调用方法,先在子类中找,子类中没这个方法就调用父类中方法。然后你想父类方法定义的时候都不一定有这个子类,父类方法中访问的成员变量肯定是父类的成员变量,输出就是这个结果了

作者: 若白衣卿相    时间: 2016-10-27 02:06
再加点内容吧。在子类对象调用方法的时候,可以有this访问本对象成员,super访问父类成员。this指向调用方法的对象本身,super呢?用法和this一样,肯定也指向一个对象,而且是父类对象,才能调用父类成员。子类调用方法子类中不存在,调用父类中的方法,其实就是super.成员方法。在这个成员方法中也可以用this指向调用方法的对象,也就是super,这里this.属性访问的就是父类中的属性,父类中属性都是没有手动赋值系统给的默认值,就这样了。

作者: evan.zhou    时间: 2016-10-28 10:15
一句话概括:成员变量不具备多态性,自行补脑。

作者: poi1234bnm    时间: 2016-10-28 13:56
。。看文字有点晕。。能不能说子类没有的就去找父类。。??
作者: hmgmx    时间: 2016-10-28 14:28
子类传承父类,子类调用方法,先在子类找,子类没有的找父类

作者: evan.zhou    时间: 2016-10-29 00:12
poi1234bnm 发表于 2016-10-28 13:56
。。看文字有点晕。。能不能说子类没有的就去找父类。。??

子类有的优先使用子类?





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