父类引用指向子类对象。

什么叫父类引用指向子类对象,且听我慢慢道来.

从2个名词开始说起:向上转型(upcasting) 、向下转型(downcasting).

举个例子:有2个类,Father是父类,Son类继承自Father。

Father f1 = new Son();   // 这就叫 upcasting (向上转型)

f1引用指向一个Son对象

Son s1 = (Son)f1;   // 这就叫 downcasting (向下转型)

// 现在f1还是指向Son对象

第2个例子:

Father f2 = new Father();

Son s2 = (Son)f2;       // 出错,子类引用不能指向父类对象

你或许会问,第1个例子中:Son s1 = (Son)f1;问什么 是正确的呢。

很简单因为f1指向一个子类对象,Father f1 = new Son(); 子类s1引用当然可以指向子类对象了。

而f2 被传给了一个Father对象,Father f2 = new Father();子类s1引用不能指向父类对象。

总结:

1。父类引用指向子类对象,而子类引用不能指向父类对象。

2。把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换。

      如:Father f1 = new Son();

3。把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换。

   如:f1 就是一个指向子类对象的父类引用。把f1赋给子类引用s1即 Son s1 = (Son)f1;

           其中f1前面的(Son)必须加上,进行强制转换。


                                                                                    

在百度上遇到一个问题,

java中的强制转换

byte x = (byte)128;

byte y = (byte)-129;

为什么结果是-128和128;

这种问题在刚开始学习的时候确实令我很费解来的,因为如果只是局限在java语言本身中,这个问题是没法得到真正的解的,顶多也是知其然不知其所以然。感谢这一年的知识积累,我现在可以尝试着去解答这个问题了。

首先你要知道,计算机中,数的几种表示方式,原码,反码,补码。

对于第一个数,128,java中默认是int类型的,并且用补码表示,所以它在计算机内部存储的二进制串为:00000000 00000000 00000000 10000000

一共是四字节,32位,其中最高位为符号位0。

这时候对128进行强制类型转换,因为byte只有1字节,即8位,所以这个二进制串就要被截短,只保留低8位:10000000

这个时候的二进制串还表示128吗?

不是了,因为byte的最高位也是符号位!也就是说1被用来作符号位了,即代表是负数, 0000000才是表示数值,而-128的补码值就正是:1 0000000。

所以这就是为什么128强制转换类型后会变成-128的真正原因,知道了这点,其他的类型转换也是可以类似分析的。

再看下-129的情况

-129依然是存储为四字节,它的原码为:10000000 00000000 00000000 10000001

不过计算机中存储的是补码形式,所以它的二进制串为:11111111 11111111 11111111 01111111

还是一样的,强制转换,只保留低低八位:01111111

最高位同样为符号位,即0,表示为正数,1111111表示数值,为128

所以结果出来了128.

上面的论述更多是根据这一年所的知识做出的分析,可能由于知识面受限,导致出现差错,欢迎各位看完后能指点一二,有兴趣的也可以一起探讨。