黑马程序员技术交流社区

标题: 父类子类中同名变量问题 [打印本页]

作者: 刘勇强    时间: 2013-2-23 15:17
标题: 父类子类中同名变量问题
本帖最后由 刘勇强 于 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呢?





作者: 陈圳    时间: 2013-2-23 15:28
子父类同名成员变量:编译+运行===看左边
子父类成员函数:编译看左边,运行看右边
静态函数:编译/运行都看左边

作者: 刘勇强    时间: 2013-2-23 15:33
陈圳 发表于 2013-2-23 15:28
子父类同名成员变量:编译+运行===看左边
子父类成员函数:编译看左边,运行看右边
静态函数:编译/运行都看左 ...

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

我以前没什么基础,还是看不懂怎么解释我的问题  能不能稍微详细点
作者: 陈圳    时间: 2013-2-23 16:04
这个问题是这样的,你没有覆盖show()方法,调用show()方法实现输出,因为继承是往下的,子类中特有有的东西,父类是没有的.也获取不了.你调用父类的show()方法,所以.你懂的.
作者: 罗海云    时间: 2013-2-23 16:23
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:31
罗海云 发表于 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:36
刘勇强 发表于 2013-2-23 16:31
b.show();这条语句总的show不是B类中的show吗? B虽然没重写A中的show方法,但B不是已经继承了A中的show ...

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

谢了    我以为B类中即便不复写父类中的方法,B类也会有一个属于自己的show方法呢   汗
作者: 罗海云    时间: 2013-2-23 16:41
刘勇强 发表于 2013-2-23 16:39
谢了    我以为B类中即便不复写父类中的方法,B类也会有一个属于自己的show方法呢   汗 ...

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

你讲的详细   多谢




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