父类引用指向子类对象。
什么叫父类引用指向子类对象,且听我慢慢道来.
从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.
上面的论述更多是根据这一年所的知识做出的分析,可能由于知识面受限,导致出现差错,欢迎各位看完后能指点一二,有兴趣的也可以一起探讨。