黑马程序员技术交流社区
标题:
这个为什么是输出的10?不是20?以及这些创建对象是怎么....
[打印本页]
作者:
江南雨
时间:
2013-5-23 13:15
标题:
这个为什么是输出的10?不是20?以及这些创建对象是怎么....
package com.xiaoye.test;
class A {
public int a = 10;
public void say() {
System.out.println("in class a");
}
}
class B extends A {
public int a = 20;
public void say() {
System.out.println("in class b");
}
}
public class test {
/**
* @param args
*/
public static void main(String[] args) {
A a = new B();
Printa(a);
}
public static void Printa(A he) {
System.out.println(he.a);
}
}
复制代码
作者:
火之意志
时间:
2013-5-23 13:29
首先明确一点,方法存在重写,成员变量不存在重写,你的代码中用到多态, A a = new B();,利用父类对象调用调用同名成员变量a,输出的就是父类对象中初始化的变量a的值10,多态就是这样,父类对象引用可以调用子父类共有的方法,不可以调用子类特有方法(即父类中没有的方法,访问的局限性);此外作为成员变量它不存在多态,即不会有变量的重新赋值,这一点一定要明确,此外还有用static修饰的静态成员同样没有多态,谁调用就取本身的成员,不会去掉实际指向的对象的成员。希望你能明白
作者:
lpflpy
时间:
2013-5-23 13:34
多态应用时,
作者:
lpflpy
时间:
2013-5-23 13:36
多态应用时:
A:成员变量:
编译看左边,执行看左边
B:成员方法:
编译看左边,执行看右边
C:静态修饰成员:
编译看左边,执行看左边
作者:
无妄无涯
时间:
2013-5-23 13:42
这个是多态问题,只有成员方法是编译看左边而执行是看右边的,其他都以左边为准。
作者:
江南雨
时间:
2013-5-23 14:17
lpflpy 发表于 2013-5-23 13:36
多态应用时:
A:成员变量:
编译看左边,执行看左边
什么编译看左边,执行看右边,能解释清楚吗?
作者:
lpflpy
时间:
2013-5-23 14:58
江南雨 发表于 2013-5-23 14:17
什么编译看左边,执行看右边,能解释清楚吗?
A a = new B();
也就是说:
在编译时期:参阅等号左边引用型变量所属的类(A)中是否有调用变量;如果有,编译通过,如果没有编译失败。
在运行时期:参阅等号左边引用型变量所属的类(A)中的变量的值
其他两个你可以类推一下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2