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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 0小菜鸟0 中级黑马   /  2014-7-18 18:31  /  1634 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 0小菜鸟0 于 2014-7-21 10:07 编辑

class A
{
        int i = 9;
}
public class B extends A
{
        int i = 8;
        public static void main(String[] args)
        {
                A b = new B();
                System.out.println(b.i);

        }
}
求问 为什么输出结果是9;求分析过程;
为什么不是在当前类找

点评

多态只针对方法,成员变量不参与多态判断。引用变量是什么类,就去那个类中找。  发表于 2014-7-18 20:44

17 个回复

倒序浏览
这个是不是子承父业,B b = new B(); 就好了
回复 使用道具 举报
我也小白,哈喽沃德级别的,不知对错,按我的想法说一下哈。我的看法是:在NEW类B的对象时,用了父类的引用,起名曰b ,那么在输出语句 System.out.println(b.i);中小b在调用i时首先虚拟机首先扫描的是父类,父类中有int i ,并且有值,虽然子类中有值,但是还是会直接调用父类的。如果是一个函数的话,如果子类有相同的函数那么就会复写,从而调用子类的。。调用函数时,在编译过程中看父类,如果是运行就看子类了,也就是调用子类的了。。
回复 使用道具 举报
A b = new B();  b是父类对象的实例,不能访问B的属性和方法。所以就是9了
回复 使用道具 举报
安少康 来自手机 中级黑马 2014-7-18 20:15:25
报纸
这时B.I相当于super.i
回复 使用道具 举报
多态只针对方法,成员变量不参与多态判断。引用变量是什么类,就去那个类中找。
回复 使用道具 举报
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
回复 使用道具 举报
多态中,成员变量编译和运行都看父类,成员方法编译看父类,运行看子类
回复 使用道具 举报
A b = new B();  这句话的意思是用子类对象实例化父类引用。当子父类当中有且出现同名变量的时候,则输出父类中的变量的值;如果父类中没有此变量,则编译时出现报错。
回复 使用道具 举报
这是多态成员变量的特点,无论编译和运行都参考左边--引用类型变量所属的类
回复 使用道具 举报
A b = new B();这里用到了多态的原理,运行的时候,非静态方法声明和成员变量调用的都是父类的,而方法实体调用的才是子类的。
回复 使用道具 举报
有点看不懂
回复 使用道具 举报
孤守星空 发表于 2014-7-18 19:50
A b = new B();  b是父类对象的实例,不能访问B的属性和方法。所以就是9了

你说错了,能访问方法
回复 使用道具 举报
表示代码写的很乱吗?看着别扭!
回复 使用道具 举报
分析过程。。。。。。。。。。。
回复 使用道具 举报
Adjin 中级黑马 2014-7-20 09:26:22
16#
在堆内存中,有一个父的num,还有一个子的num,
你拿父的引用去调用,就输出了父的num
回复 使用道具 举报
0小菜鸟0 发表于 2014-7-19 21:26
你说错了,能访问方法

访问覆盖父类的方法吧··
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马