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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘勇强 中级黑马   /  2013-2-23 15:17  /  3236 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘勇强 于 2013-2-23 16:51 编辑

看别人的帖子时发现一个不懂的地方
  1. class A{
  2.         String a = "我是父类成员变量。";
  3.         public void show(){
  4.                 System.out.println(this.a);
  5.         }
  6. }

  7. class B extends A{
  8.         String a = "我是子类成员变量。";
  9.         
  10.         public static void main(String[] srgs){
  11.                 B b = new B();
  12.                 b.show();

  13.         }
  14. }
复制代码
输出是:我是父类成员变量


-------------------------------------------------
b.show(); 执行时show方法是B中的show()方法吧,show中的this.a 的this应该是b的引用吗


为什么输出是父类的a,而不是子类中的变量a啊



对象b中除了自己的  String a = "我是子类成员变量。";


还有继承的A的  String a = "我是父类成员变量。";


程序是怎么确定输出的是 父类中的a  ,而不是子类的a呢?




评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 鼓励个

查看全部评分

11 个回复

倒序浏览
子父类同名成员变量:编译+运行===看左边
子父类成员函数:编译看左边,运行看右边
静态函数:编译/运行都看左边
回复 使用道具 举报
陈圳 发表于 2013-2-23 15:28
子父类同名成员变量:编译+运行===看左边
子父类成员函数:编译看左边,运行看右边
静态函数:编译/运行都看左 ...

你说的是父类或接口引用指向子类对象的情况吧

我以前没什么基础,还是看不懂怎么解释我的问题  能不能稍微详细点
回复 使用道具 举报
这个问题是这样的,你没有覆盖show()方法,调用show()方法实现输出,因为继承是往下的,子类中特有有的东西,父类是没有的.也获取不了.你调用父类的show()方法,所以.你懂的.
回复 使用道具 举报
class A{
        String a = "我是父类成员变量。";
        public void show(){
                System.out.println(new B().a);//把这儿改了就可以了,其余没什么方法.
        }
}

class B extends A{
        String a = "我是子类成员变量。";
        //这儿你没有覆盖父类的方法..然而你调用父类方法假如想要用子类的变量的话.可以这样.看上面
        public static void main(String[] srgs){
                B b = new B();
                b.show();

        }
}
回复 使用道具 举报
罗海云 发表于 2013-2-23 16:23
class A{
        String a = "我是父类成员变量。";
        public void show(){

b.show();这条语句总的show不是B类中的show吗? B虽然没重写A中的show方法,但B不是已经继承了A中的show方法吗  
回复 使用道具 举报
刘勇强 发表于 2013-2-23 16:31
b.show();这条语句总的show不是B类中的show吗? B虽然没重写A中的show方法,但B不是已经继承了A中的show ...

b.show(),只是你new出来的一个子类对象...其实调用的话假如B类中本身没有show方法, 就会去父类找,然后调用...假如你B类复写了show方法.才会直接调用自己类你的show方法.所以///
回复 使用道具 举报
谢谢楼上两位  我重翻了教程懂了  没基础的娃就是悲剧啊  这种比较简单的问题都不懂//{:soso_e127:}   发现光看视频也是不够的...
回复 使用道具 举报
罗海云 发表于 2013-2-23 16:36
b.show(),只是你new出来的一个子类对象...其实调用的话假如B类中本身没有show方法, 就会去父类找,然后调 ...

谢了    我以为B类中即便不复写父类中的方法,B类也会有一个属于自己的show方法呢   汗
回复 使用道具 举报
刘勇强 发表于 2013-2-23 16:39
谢了    我以为B类中即便不复写父类中的方法,B类也会有一个属于自己的show方法呢   汗 ...

额. 没事
回复 使用道具 举报
子类没有show方法,调用父类的 方法,为什么能调用,因为子类持有父类的super引用,super代表父类空间。可以理解内存中的子类对象内有一个父类空间,供持有super引用的对象访问。在内存中子类的成员变量是子类的,父类的成员变量是父类的,子类和父类同名变量相互独立,当进入父类空间调用父类方法时,输出的变量当然也是父类空间中的变量。具体可看毕老师 “JavaSE基础视频08”。
回复 使用道具 举报
王晓楠 发表于 2013-2-23 16:41
子类没有show方法,调用父类的 方法,为什么能调用,因为子类持有父类的super引用,super代表父类空间。可 ...

你讲的详细   多谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马