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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周世阳 中级黑马   /  2012-8-23 16:18  /  1516 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周世阳 于 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值才对,求解释

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
子类当做父类使用时需要注意
当我们在调用某个类的一个方法时,此方法声明需要一个父类对象,这时我们可以将一个子
类对象作为实参传递过去,注意此时方法定义的形参为父类,在方法中使用父类变量调用方
法时,其实是调用子类的方法。

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

在把子类当做父类来用时,使用父类变量访问方法,访问的是子类的方法,因为虚拟机会找
到变量引用的地址,根据这个地址来访问方法,这叫动态分配
这种机制没有被使用到类的成员变量上,如果用父类变量访问属性,那么会直接找到父类的
属性,不会看地址是哪个对象。[/
color]

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
张立江 + 1 很给力!
周世阳 + 10 很给力!

查看全部评分

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


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

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马