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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 关静刚 中级黑马   /  2013-10-14 21:37  /  1327 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 关静刚 于 2013-10-15 08:45 编辑

class A {
        public void func1() {
                System.out.println("A func1 is calling");
        }
        public void func2() {
                func1();
        }
}
class B extends A {
        public void func1() {
                System.out.println("B func1 is calling");
        }
        public void func3() {
                System.out.println("B func3 is calling");
        }
}
class C {
        public static void main(String [] args) {
                B b = new B();
                A a = b;
                callA(a);
                callA(new B());
        }
        public static void callA(A a) {
                a.func1();
                a.func2();
        }
}

打印出来的是四段:B func1 is calling
我的理解:A是父类,B是子类,b赋值给a,b自动提升为父类
callA(a);对方法callA调用了一次,所以打印一段,a是父类,为什么不打印:A func1 is calling呢?
callA(new B());对方法callA调用了一次,所以打印一段,b已经自动提升为父类:也应该打印A func1 is calling啊?
然后是执行类C中的a.func1();和a.func2();各打印一段,a作为父类,照理说也是打印A func1 is calling啊?
第一次发帖,新手一枚,初学JAVA,好多不懂,求指点,非常感谢

评分

参与人数 1技术分 +1 收起 理由
李江 + 1

查看全部评分

3 个回复

倒序浏览
callA(a),为什么不打印:A func1 is calling呢? B b = new B();  A a = b; 等同于 A a = new B();a只是一个引用,new B()才是一个真正B的对象,意思就是a这个引用指向的是B的这个对象实例,调用a.XXX方法时,实际是调用B对象的XXX方法。
callA(new B());对方法callA调用了一次,所以打印一段,b已经自动提升为父类:也应该打印A func1 is calling啊?对于你这句话“b已经自动提升为父类”,我是没听说过的,
public static void callA(A a)对于这个方法,你应该理解java里参数传值传的是引用,这个a和callA(a)括号里的a都是引用,当函数调用的时候 他们指向的是同一个对象,对于这一个问题你应该理解什么是引用,什么是对象,对等号左边的是引用,等号右边new出来的才是对象,等号也就相当于箭头了,引用指向对象实例,引用和对象在内存中存储在不同的位置。
回复 使用道具 举报
首先
  1. class B extends A {
  2.          public void func1() {
  3.                  System.out.println("B func1 is calling");
  4.          }
  5.          public void func3() {
  6.                  System.out.println("B func3 is calling");
  7.          }
  8. }
复制代码
继承后子类B中将会有
  public void func2() {
                 func1();
         }
方法,方法中的fun1()前面是有this的,this代表当前类对象的引用,
如同
  public void func2() {
               this. fun1();
         }
所以到B中就成了B类的fun1(){ System.out.println("B func1 is calling");}
而这   B b = new B();
                 A a = b;
是引用指向,
所以 callA(a);  callA(new B();参数都是new B()

可能你还疑问,传的是父类,调用的就是父类里的方法,但你明白父类是没new的,没父类对象,
  B b = new B();
    A a = b;只是引用。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
调用实例方法只和实例所属的类有关,跟引用变量无关.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马