小弟刚学java的,想问个基础的问题
假如有三个类A,B,C
其中类B继承类A
那么我在C类里A a=new B();
实例化的时候我们是说这是个A类型的指向B的对象还是?
运行时呢?a对象的方法列表又是指向A还是B类?
谢谢解答!

解决方案 »

  1.   

    class A
    {
    public String className = "class A!";

    public void show()//A类中的show()方法
    {
    System.out.println("I'm class A's show()!");
    }
    }class B extends A
    {
    public String className = "class B!";

    public void show()//重写父类A的方法show()
    {
    System.out.println("I'm class B's show()!");
    }

    public void showInB()//B类中新扩展的方法showInB()
    {
    System.out.println("I'm class B's showInB()");
    }
    }public class Go
    {
    public static void main(String[] args)
    {
    A a = new B();
    /*
    用A类类型的引用,保存B类的实例
    (用父类的引用访问子类,动态多态?)
    */

    a.show();
    /*
    即使用A类类型的引用来访问show()方法
    但实际上,上面用new产生的对象实例是
    B类型的,所以访问到是的B类中的show()方法
    (方法的重写)
    */

    //a.showInB();
    /*
    这句是错的,因为用父类的引用来访问子类所以从父类的
    角度来看,父类中并没有showInB()这个方法.showInB()
    是在子类中扩展出来的上面说了,new出来的是B类的实例,
    所以可以用强制转换来访问到showInB(),((B)a).showInB();
    */

    ((B)a).showInB();
    /*
    通过强制转换来实现用父类的引用,访问子类中扩展出来的
    方法.
    */

    /*
    实例化的时候我们是说这是个A类型的指向B的对象还是?
    运行时呢?a对象的方法列表又是指向A还是B类?

    1.A a只是声明了一个对象的引用,不管是什么类型的引用
    它的大小都是32byte,也就是4个字节,是用来存放对象
    的实例的在内存中的地址的.(System.out.println(a);)
    */
    System.out.println(a);
    /*
    2.运行时也一样,具体是指向你声明的类型的本类或者子类
    的对象的实例.
    3."方法列表",,子类会继承父类中所有的非private方法
    所以,可以用父类的引用访问到子类所有从父类继承下来的
    方法,但是不可以访问到子类中扩展出来的方法,除非做强制
    类型转换.如果子类重写了父类中的方法,那么访问到的是
    子类中重写过的方法.
    */
    }
    }-----------------------------------------------
    刚刚学Java不到两个星期,有错的地方,大家帮忙指正:)
      

  2.   

    谢谢foxzj,看了你的解答,明白了许多。看SCJP认证的书刊上是这样讲的
    A a=new B();那么方法列表是指向B对象,而字段是指向A类型的。
    同时也谢谢大家!
      

  3.   

    a对象的方法列表是指向B的,这是多态性的体现.
    当我们用A a=new B()的时候,假如我们要调用B类中的一个方法show(),编译器要检查形式类型也就是类A中是否有这样一个方法show(),解释器要检查实际类型也就是类B中是否有这个方法show(),如果两个类中都有show()方法的话,调用a.show()的时候,则是调用的类B中的show()方法,当类B中没有show()的时候,调用a.show(),则是调用的类A中的show()方法.
    实际类型中也就是类B中可以没有这个show()方法,但是形式类型也就是类A中必须有这个方法,否则编译是通不过的!!!