类B是类A的子类,那么下面这么语句中A myclass = new B()myclass到底是那个类的对象呢?

解决方案 »

  1.   

    is - a 关系, 也算是 A 的对象.
      

  2.   

    晕.............B类对象
    父类的引用可以指向字类的对象
    比于:所有的类都是有object类继承而来,所以object类引用可以指向任何对象
    A myclass = new B()
    表示声明了一个A类引用并初始化指向其字类B的一个新建对象.
      

  3.   

    myclass是指向A子类B对象的引用,这样说更好些。
      

  4.   

    A myclass = new B()

    B myclass = new B()
    有什么区别呢?
      

  5.   

    这个问题很经典,我借用严老师(yqj2065)一本java教程里面的一段文字
    他本来是不让我给别人看的,哈,
    千万别怪我,确实写的很好
    1. 多态变量
    从数据类型的角度看,类S和F毕竟是两种不同的数据类型。那么下面的语句就有趣了,父类的句柄可以持有(或填充、容纳)子类的引用(对象替换是多态变量的机制):
    F f = new S();
    多态变量(polymorphic variable)的定义是:可以指向多种数据类型的变量。比如说,句柄f所指向对象的数据类型是类S,S不等同于该变量所声明的数据类型(F)。变量f就是一个多态变量。
    一般而言,对于多态变量f,类F称为其声明类型,f此时此刻指向对象的数据类型(此时为类S)称为该变量的动态类型 。
    事实上,Java中所有变量都是多态变量,不管是基本类型变量还是句柄。(不过多态变量更多地暗指句柄。)
    2. 对象造型机制
    多态变量之所以发挥作用,其背后的支撑是Java的类型转换机制,其中对象替换原理是Java类型转换的一条内在规则。基本数据类型的转换,可分为类型提升和强制转换;句柄的类型转换也一样,不过换了称呼——对象造型机制。对象造型机制可分为向上造型和向下造型。
    基本数据类型转换的例子:
    int a=100;
    long b=a+100; //类型提升,a+100从int提升到了long
    a=(int)b;     //强制转换,强制类型转换在某种情况下会丢失精度。
    基本数据类型的转换规则简要地归纳如下:
    (1)boolean不能转换成任何其他的基本数据类型。
    (2)数值类型如果从小向大(指其占用的内存空间)转换,不需要显式的转换。(类型提升是编译器自动进行的。)
    (3)数值类型如果从大向小转换,必须显式的转换。(强制转换)
    (4)java中的基本数据类型都可以被隐式的转换成String。
    而引用类型(句柄、多态变量)的转换,增加了3条规则:
    (1)类的对象只能转换为有继承关系的子类或父类对象,不能转换为没有继承关系的类的实例。
    (2)一个类的实例也是其所有基类的实例。(这就是对象替换原理)。
    (3)对象转换为一个接口的条件是,其类或某个基类实现了该接口。
    把一个子类引用赋值给基类句柄,称为向上造型(Up casting,即类型提升)。向上造型机制自觉的遵守对象替换原理,而且不需要显式的转换。
    F f =new S();
    把基类对象赋值给派生类对象就需要强制类型转换,这称为向下造型(down casting)。向下造型是强制类型转换。虽然有正就有负,有up就有down,但总觉得把Chinaman赋值给Wuhanman、动物赋值给人不太对劲。
    所以,安全地进行向下造型有一个前题:基类对象必须是从派生类对象中向上造型过来的。就是说,只有在Chinaman是Wuhanman上溯过来的时候,Chinaman才能够向下造型为Wuhanman。
    例5 16 先要up,才能down casting。instanceof关键字
    class B516{ }
    class A516 extends B516{
        public static void main(String[] args){
            B516 base=new A516();//向上造型
            A516 a = (A516) base;//向下造型
            //A516 aaa =(A516) new B();
            //运行时抛出ClassCastException异常
            if(base instanceof A516)
                a = (A516) base;
        }
    }
    注解:为什么编译没有异常而运行时抛出异常?new运算符只在运行时起作用,在编译时不被考虑,所以上面的程序编译成功,但运行时会抛出ClassCastException异常。我们常常使用Java中的instanceof关键字,判断句柄指向的对象到底是不是特定的类型。
    向下造型的典型例子,在编写绘制图形(graphics)的程序时,经常使用的语句:
    Graphics2D g2 = (Graphics2D) g ;
      

  6.   

    对于myclass本身的内容而言是没有任何区别的,但是在后续代码中,由于myclass编译器只认为它是一个A对象(即使它实际上是B对象),后续的调用只能调用A中的方法,如果需要调用B中有A中没有的方法则需要强制类型转换
    这样做的好处主要是隐藏真正的实现类,后续代码只需要见到A就行,并不需要关心到底它真实来说是不是B
      

  7.   

    希望他看到别怪我哦,千万别怪我
    myclass到底是那个类的对象呢?
    这里不是对象是引用哦,别糊涂
      

  8.   

    B的对象new what ,what is objected
      

  9.   

    声明一个A类引用,指向对象B,
    因此是B的对象
      

  10.   

    A myclass = new B()

    B myclass = new B()
    有什么区别呢?*********************************************注意了
    A myclass = new B() !! myclass在编译的时候是A类,在运行的时候是B类这样的好处就是为了多态B myclass = new B() !! myclass在运行的时候和编译的时候都是B类,所以对多态没有支持!你要问为什么,那就是为了多态!java编程思想对这种有很好的介绍你可以参考一下
      

  11.   

    男人 a = new 男人();
    -- 这里 a 代表男人, 是有小jj的男人人 a = new 男人();
    -- 这里 a 代表人, 有没有小jj, 下面的使用着不知道, 也不需要知道. 
      

  12.   

    寒TinyJimmy(Jimmy) 一个,不过说的很多.
    男人 a = new 男人();
    -- 这里 a 代表男人, 是有小jj的男人人 a = new 男人();
    -- 这里 a 代表人, 有没有小jj, 下面的使用着不知道, 也不需要知道. 
    再补充一句,如果以后试图访问a的小jj,就会有编译错误,因为编译器不知道a是一个男人(虽然他是一个男人),编译器只把a当成一个人来看.
    不能使用这样的语句哦,a.xjj.pee,语法错误,哈哈
      

  13.   

    这就是java的一大特性,多态。是B 的对象。
      

  14.   

    这就是java的一大特性,多态。是B 的对象。
      

  15.   

    A myclass = new B();
    有两种可能
    1)A是B的父类
    2)B实现了接口A
      

  16.   

    寒TinyJimmy(Jimmy) 一个,不过说的很多.
    男人 a = new 男人();
    -- 这里 a 代表男人, 是有小jj的男人人 a = new 男人();
    -- 这里 a 代表人, 有没有小jj, 下面的使用着不知道, 也不需要知道. 
    再补充一句,如果以后试图访问a的小jj,就会有编译错误,因为编译器不知道a是一个男人(虽然他是一个男人),编译器只把a当成一个人来看.
    不能使用这样的语句哦,a.xjj.pee,语法错误,哈哈
    ===========================================================
    形象,生动,两位强人,小弟佩服!
      

  17.   

    寒TinyJimmy(Jimmy) 一个,不过说的很多.
    男人 a = new 男人();
    -- 这里 a 代表男人, 是有小jj的男人真的很强啊,哈哈
      

  18.   

    是B对象,但是调用中只能当A类型使用。这样做的好处是将接口的定义和程序的实现分开,即:InterfaceA a = new ImplementA();这样如果你要更换InterfaceA的实现,就可以换成:InterfaceA a = new ImplementB();但是程序的其他部分不用更换。
      

  19.   

    A是B的父类,A是B实例的一个引用,再用A的时候,注意A是谁的实例
      

  20.   

    看java 的上溯造型吧,这是java的精髓
      

  21.   

    A a = new B();
    表示B是A类型的,假如A还有个子类C,那么A c=new C();也是A类型的.但是假如B里头有个自己的方法getB(),C类里头有个自己的方法getC();
    那么a.getB(),c.getC()都是正确的.这么做还有个主要的用途是在反射机制中用到的.