class A {
    int item;
    int a_item;    public void h(){
        System.out.println("aaa.h()");
    }
    public void f() {
        System.out.println("aaa.f()");
    }
}class B extends A {
    int item;
    int b_item;    public void f() {
        System.out.println("bbb.f()");
    }
    public void k(){
        System.out.println("bbb.k()");
    }
}public class Test2 {    public static void main(String[] args) {
        A a = new B();
        A b = new A();    }
}程序如上,a和b所能调用的属性和方法都是一样的,
是不是a和b就是一样?
它们有不一样的地方吗?

解决方案 »

  1.   

    在你例子里是一样的都是a的实力
    如果b是implement a那么就不一样
      

  2.   

    不一样
    你可以试以下
    a.f()
    b.f()这两个输出
      

  3.   

    当然不一样1.构造的差异A a = new B();
    这一句的过程是这样的,
    1)创建一个类A的引用a
    2)创建一个类B的实例
    3)把类B的引用赋值给a因为A是B的父类,所以,赋值成功。A b = new A()
    这一句的过程是这样的,仅仅在第二步与第一句不同
    1)创建一个类A的引用b
    2)创建一个类A的实例
    3)把类A的引用赋值给b
    2.使用的差异首先,a和b都可以执行h()、f(),其中二者执行f()是的结果不一样。
    其次,对于a,你可以执行
        ((B)a).k();
    对于b,则抛出异常。
      

  4.   

    当然不一样,能调用相同方法名不一定是调用的方法体是一样的,overload总听说过吧,
    继承里面有override,你的程序根本说没不了问题,光定义两个实例有什么用,也不看看调用方法后的结果有什么不同
      

  5.   

    A a = new B(); 是将子类对象赋值给父类引用。子类的方法可以重写(override)父类的方法以实现多态性。
    譬如:
    a.f();
    b.f();
    会有不同的输出:
    bbb.f()
    aaa.f()
    这就是多态性的体现。A b = new A(); 是实例化一个对象的通常方式。
      

  6.   

    从程序来看的话,应该是在B中重写了A中的f();所以这样A a = new B()与A b = new A()以后,肯定在使用时虽然以a,b中的方法名是一样的,但是输出结果肯定是不一样的。