黑马程序员技术交流社区

标题: 关于父类引用指向子类对象的问题 [打印本页]

作者: 0小菜鸟0    时间: 2014-7-18 18:31
标题: 关于父类引用指向子类对象的问题
本帖最后由 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 19:02
这个是不是子承父业,B b = new B(); 就好了
作者: 7418695lp    时间: 2014-7-18 19:32
我也小白,哈喽沃德级别的,不知对错,按我的想法说一下哈。我的看法是:在NEW类B的对象时,用了父类的引用,起名曰b ,那么在输出语句 System.out.println(b.i);中小b在调用i时首先虚拟机首先扫描的是父类,父类中有int i ,并且有值,虽然子类中有值,但是还是会直接调用父类的。如果是一个函数的话,如果子类有相同的函数那么就会复写,从而调用子类的。。调用函数时,在编译过程中看父类,如果是运行就看子类了,也就是调用子类的了。。
作者: 孤守星空    时间: 2014-7-18 19:50
A b = new B();  b是父类对象的实例,不能访问B的属性和方法。所以就是9了
作者: 安少康    时间: 2014-7-18 20:15
这时B.I相当于super.i
作者: fantacyleo    时间: 2014-7-18 20:42
多态只针对方法,成员变量不参与多态判断。引用变量是什么类,就去那个类中找。
作者: 波风梅西    时间: 2014-7-18 21:04
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
作者: 汉谟拉比    时间: 2014-7-18 21:12
多态中,成员变量编译和运行都看父类,成员方法编译看父类,运行看子类
作者: mayor125    时间: 2014-7-18 21:22
A b = new B();  这句话的意思是用子类对象实例化父类引用。当子父类当中有且出现同名变量的时候,则输出父类中的变量的值;如果父类中没有此变量,则编译时出现报错。
作者: 南柯一梦    时间: 2014-7-18 22:26
这是多态成员变量的特点,无论编译和运行都参考左边--引用类型变量所属的类
作者: 杨冬冬    时间: 2014-7-18 23:30
A b = new B();这里用到了多态的原理,运行的时候,非静态方法声明和成员变量调用的都是父类的,而方法实体调用的才是子类的。
作者: yanyoucheng520    时间: 2014-7-18 23:44
有点看不懂
作者: 0小菜鸟0    时间: 2014-7-19 21:26
孤守星空 发表于 2014-7-18 19:50
A b = new B();  b是父类对象的实例,不能访问B的属性和方法。所以就是9了

你说错了,能访问方法
作者: bfl625    时间: 2014-7-19 21:35
表示代码写的很乱吗?看着别扭!
作者: 止询初衷    时间: 2014-7-20 00:12
分析过程。。。。。。。。。。。
作者: Adjin    时间: 2014-7-20 09:26
在堆内存中,有一个父的num,还有一个子的num,
你拿父的引用去调用,就输出了父的num
作者: 孤守星空    时间: 2014-7-20 12:42
0小菜鸟0 发表于 2014-7-19 21:26
你说错了,能访问方法

访问覆盖父类的方法吧··




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