黑马程序员技术交流社区

标题: 关于子类转成父类问题 [打印本页]

作者: 关静刚    时间: 2013-10-14 21:37
标题: 关于子类转成父类问题
本帖最后由 关静刚 于 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,好多不懂,求指点,非常感谢
作者: loading……99.9    时间: 2013-10-14 22:01
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出来的才是对象,等号也就相当于箭头了,引用指向对象实例,引用和对象在内存中存储在不同的位置。
作者: 赖波    时间: 2013-10-14 22:03
首先
  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;只是引用。
作者: 做只会飞的鱼    时间: 2013-10-15 06:31
调用实例方法只和实例所属的类有关,跟引用变量无关.




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