黑马程序员技术交流社区

标题: 这个为什么是输出的10?不是20?以及这些创建对象是怎么.... [打印本页]

作者: 江南雨    时间: 2013-5-23 13:15
标题: 这个为什么是输出的10?不是20?以及这些创建对象是怎么....
  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. }
复制代码

作者: 火之意志    时间: 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