黑马程序员技术交流社区

标题: 关于覆盖成员问题-已解决 [打印本页]

作者: 周世阳    时间: 2012-8-23 16:18
标题: 关于覆盖成员问题-已解决
本帖最后由 周世阳 于 2012-8-23 19:23 编辑

成员覆盖和方法覆盖应该是同样的道理,可是如下代码
public class Demo
{
        public static void main(String[] args)
        {        
                B b = new B();
                System.out.println(b.a);//输出b对象中a的值
                b.sop();//调用b对象的sop方法
                System.out.println("-------------------------------------------");
                System.out.println(((A)b).a);//将b对象转换为A类型,输出a值
                ((A)b).sop();//将b对象转换为A类型,调用sop方法
        }
}

class A{
        int a=10;
        public void sop(){
                System.out.println("you are print A class");
        }
}

class B extends A{
        int a=20;//覆盖a成员
        public void sop(){//覆盖sop方法
                System.out.println("you are print B class");
        }
}



打印结果为

20
you are print B class
-------------------------------------------
10
you are print B class

同样都是打印B的sop方法是合理的,但是a的值在b对象为A类型的视乎打印的是A的a的值,为什么?
覆盖成员和方法应该原理都是一样的,虽然引用是A类型但实际对象还是B类对象,指向的应该还是B的a值才对,求解释

作者: 唐杨老师    时间: 2012-8-23 16:25
子类当做父类使用时需要注意
当我们在调用某个类的一个方法时,此方法声明需要一个父类对象,这时我们可以将一个子
类对象作为实参传递过去,注意此时方法定义的形参为父类,在方法中使用父类变量调用方
法时,其实是调用子类的方法。

楼主请认真考虑:上述情形下,在方法中用父类变量访问属性,访问的是子类还是父类的属性  ?

在把子类当做父类来用时,使用父类变量访问方法,访问的是子类的方法,因为虚拟机会找
到变量引用的地址,根据这个地址来访问方法,这叫动态分配
这种机制没有被使用到类的成员变量上,如果用父类变量访问属性,那么会直接找到父类的
属性,不会看地址是哪个对象。[/
color]
作者: 邓超军    时间: 2012-8-23 16:31
同样都是打印B的sop方法是合理的,但是a的值在b对象为A类型的视乎打印的是A的a的值,为什么?
覆盖成员和方法应该原理都是一样的,虽然引用是A类型但实际对象还是B类对象,指向的应该还是B的a值才对,求解释


这里要注意的是,你把多态和变量转型弄混了!
第二个打印的结果是10,是因为你把变量b转型为a了,当然打印A中a的值。而你说的“虽然引用是A类型但实际对象还是B类对象”是多态中的现象,但你这不是多态!




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