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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.xiaoye.test;

  2. class A {
  3.         public int a = 10;

  4.         public void say() {
  5.                 System.out.println("in class a");
  6.         }

  7. }

  8. class B extends A {
  9.         public int a = 20;

  10.         public void say() {
  11.                 System.out.println("in class b");
  12.         }

  13. }

  14. public class test {

  15.         /**
  16.          * @param args
  17.          */
  18.         public static void main(String[] args) {
  19.                 A a = new B();
  20.                 Printa(a);

  21.         }

  22.         public static void Printa(A he) {
  23.                 System.out.println(he.a);
  24.         }

  25. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

6 个回复

倒序浏览
首先明确一点,方法存在重写,成员变量不存在重写,你的代码中用到多态, A a = new B();,利用父类对象调用调用同名成员变量a,输出的就是父类对象中初始化的变量a的值10,多态就是这样,父类对象引用可以调用子父类共有的方法,不可以调用子类特有方法(即父类中没有的方法,访问的局限性);此外作为成员变量它不存在多态,即不会有变量的重新赋值,这一点一定要明确,此外还有用static修饰的静态成员同样没有多态,谁调用就取本身的成员,不会去掉实际指向的对象的成员。希望你能明白

点评

学习了。  发表于 2013-5-23 14:57

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
多态应用时,
回复 使用道具 举报
多态应用时:
A:成员变量:
        编译看左边,执行看左边
B:成员方法:
        编译看左边,执行看右边
C:静态修饰成员:
        编译看左边,执行看左边

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
这个是多态问题,只有成员方法是编译看左边而执行是看右边的,其他都以左边为准。
回复 使用道具 举报
lpflpy 发表于 2013-5-23 13:36
多态应用时:
A:成员变量:
        编译看左边,执行看左边

什么编译看左边,执行看右边,能解释清楚吗?
回复 使用道具 举报
lpflpy 中级黑马 2013-5-23 14:58:34
7#
江南雨 发表于 2013-5-23 14:17
什么编译看左边,执行看右边,能解释清楚吗?

A a = new B();
也就是说:
在编译时期:参阅等号左边引用型变量所属的类(A)中是否有调用变量;如果有,编译通过,如果没有编译失败。
在运行时期:参阅等号左边引用型变量所属的类(A)中的变量的值

其他两个你可以类推一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马