为什么父类引用可以指向子类对象 子类引用不能指向父类对象 泛型

Posted skyblue123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么父类引用可以指向子类对象 子类引用不能指向父类对象 泛型相关的知识,希望对你有一定的参考价值。

假设有父类Fu ,其子类为Zi ,从对象的内存角度,假设Fu类里面的变量占内存2M, Zi 类里的变量占内存1M:

Fu f = new Fu ();//系统将分配2M内存

Zi z = new Zi ();//系统将分配3M内存(2+1)

因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.所以z可以调用父类的方法.

Zi z1= z; //z1指向那3M的内存.

Fu f1 = (Fu)z;//这时f1会指向那3M内存中的2M内存,即是说,f1只是指向了z中实例的父类实例对象,所以f1只能调用父类的方法(存储在2M内存中),而不能调用子类的方法(存储在1M内存中).

Zi z2= (Zi)f;//这句代码运行时会报ClassCastException.因为f中只有2M内存,而子类的引用都必须要有3M的内存,所以无法转换

Zi z3= (Zi)f1;//这句可以通过运行,这时z3指向那3M的内存.由于f1是由z转换过来的,所以它是有3M的内存的,只是它指向3M中的2M内存,类型转换时,就可以拿到全部3M。

 

泛型类型由于没有Class类,所有无法new。只能用来类型强转

下面是一个类型转换的案例

Object[] ins= {  
                new Integer(0),  
                new Integer(1),  
                new Integer(2),  
                new Integer(3),  
         };  
        Integer[] i = (Integer[]) ins;  

执行时,系统报 
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer; 

如果改成下面的方式就可以了:

  Object[] ins= {     
        new Integer(0),     
         new Integer(1),     
         new Integer(2),     
          new Integer(3),     
  };     
 Integer[] i = new Integer[ins.length];  
 for(int k = 0; k < ins.length; k++){  
    i[k] = Integer.parseInt(ins[k].toString());  
     System.out.println(i[k]);  
 }

为什么Object[]数组不能强转成Integer[]数组呢?

其实Object[]数组和Integer[]数组之前的关系并没有继承之间的关系,Integer[]的是Object的子类,并不是Object[]数组的之类.

Object[]数组是Object的之类.....

强转的话还是要一个个的对单独的元素进行强转.

 

————————————————
原文链接:https://blog.csdn.net/lifewinnerforever/article/details/72801247

以上是关于为什么父类引用可以指向子类对象 子类引用不能指向父类对象 泛型的主要内容,如果未能解决你的问题,请参考以下文章

java中让子类引用指向父类对象的时候怎么进行类型转换?

父类引用指向子类对象

父类引用指向子类对象

父类引用指向子类对象详解

父类引用指向子类对象详解

用父类引用指向子类好处