A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 桃华月禅 中级黑马   /  2014-11-26 17:46  /  1600 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 桃华月禅 于 2014-11-26 21:38 编辑

我现在真心不清楚类之间继承到底继承的什么了,代码如下
  1. class Father
  2. {
  3.         int a = 1;
  4.         public Father(){
  5.                 a=2;
  6.         }
  7. }

  8. class Son extends Father
  9. {
  10. int a = 1;
  11.         public Son(){
  12.                 a=4;
  13.         }
  14. }

  15. class Demo extends Father
  16. {
  17.         public static void main(String[] args){
  18.                 Father d = new Son();
  19.                 System.out.println(d.a);
  20.         }
  21. }
复制代码
这个就是很简单的多态中成员变量指向问题,打印结果是2
可是如果单单只是把子类int a =1这行注释后就结果不一样了...代码如下
  1. class Father
  2. {
  3.         int a = 1;
  4.         public Father(){
  5.                 a=2;
  6.         }
  7. }

  8. class Son extends Father
  9. {
  10.         //int a = 1;
  11.         public Son(){
  12.                 a=4;
  13.         }
  14. }

  15. class Demo extends Father
  16. {
  17.         public static void main(String[] args){
  18.                 Father d = new Son();
  19.                 System.out.println(d.a);
  20.         }
  21. }
复制代码

结果却是4,这个我就不是很明白了...这个我可以确定d.a是指向的父类的a,不过父类的a值为4就不大清楚为什么了...
难道子类继承过来的成员a是引用型指向了父类中的a?


评分

参与人数 1技术分 +1 收起 理由
船长 + 1 淡定

查看全部评分

15 个回复

倒序浏览
这个问题好奇怪,留着问题以后回头看
回复 使用道具 举报
1、多态中非静态成员函数的特点:成员函数在多态调用时,编译看左边,运行看右边。
2、多态中成员变量的特点:无论编译和运行,都参考左边(引用变量所属的类)。如:多态中的父类引用调用成员变量时,如果父类和子类有同名的成员变量,那么被调用的是父类中的成员变量。
回复 使用道具 举报
完美是芬 发表于 2014-11-26 20:51
1、多态中非静态成员函数的特点:成员函数在多态调用时,编译看左边,运行看右边。
2、多态中成员变量的特 ...

我知道这个= =结果你自己好好想想就发现我问的不是这个知识点...
回复 使用道具 举报
感觉怪怪的。。。
回复 使用道具 举报

先说第一个程序吧
因为子父类都定义成员变量a,成员变量并不存在复写这类的问题,那么这就是多态中的子父类同名成员变量的问题了 ,输出肯定是父类中的2.
再说第二个程序
第二个程序中子类并没有定义成员变量a,那么子类就继承了父类中的成员变量a,在构造函数中对a进行初始化,创建对象必然对a赋值4,输出后就是4了.
我给你个我调试时候的部分截图你看看:

截图0.png (12.57 KB, 下载次数: 16)

子类中的成员a

子类中的成员a

截图1.png (16.67 KB, 下载次数: 2)

调用时候的a

调用时候的a
回复 使用道具 举报
本帖最后由 桃华月禅 于 2014-11-26 22:36 编辑
Carter 发表于 2014-11-26 22:11
先说第一个程序吧
因为子父类都定义成员变量a,成员变量并不存在复写这类的问题,那么这就是多态中的子父 ...

我知道这个a是Father.a。
我想知道为什么4赋值给了父类中的a?就是你第一张截图中说明的为什么Son构造函数中的a是Father中的a?
回复 使用道具 举报
很简单,给变量补全前缀,第一个程序,子类a的前缀是this.a,因为本类有a,就用本类的。
第二个程序,子类a的前缀是super.a,本类没有,用父类的。
既然用父类的,肯定改变的是父类a的值,在a=2之后又赋了一遍4
回复 使用道具 举报 1 0
进来学习的= =
回复 使用道具 举报
小爷邱烙 发表于 2014-11-27 08:23
很简单,给变量补全前缀,第一个程序,子类a的前缀是this.a,因为本类有a,就用本类的。
第二个程序,子类a ...

其实我一直有误区继承后子类也会有个int a = 1;的成员变量
这样看来继承其实就是子类没有的用父类的,不管变量还是函数。
子类有的用自己的
回复 使用道具 举报
默认前缀是this,如果自己有就用自己的,没有就用super,就是父类的。第一种情况,对象建立的时候,构造函数初始化的是自己的成员变量a,第二种情况,构造函数初始化的是父类的成员变量a(因为自己没有)。顺便提一下,对象初始化时,先参考父类super(),然后进行自己构造函数的初始化。
对于同名函数是不一样的,无论是否是多态,都运行子类的,也就是子类复写了父类的函数。
回复 使用道具 举报
我这样记得 对于成员变量 编译看左边运行看左边
                对于成员函数编译看左边运行看右边
回复 使用道具 举报
顶顶顶顶顶顶
回复 使用道具 举报
对对对多大
回复 使用道具 举报
新手路过,
回复 使用道具 举报
小爷邱烙 发表于 2014-11-27 08:23
很简单,给变量补全前缀,第一个程序,子类a的前缀是this.a,因为本类有a,就用本类的。
第二个程序,子类a ...

这兄弟说到点子上去了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马