标签:它的 向上转型 能力 blog sdn 数据类型 对象 cas 功能
上图给出了数值类型之间的合法转换。图中6个实线箭头,表示无信息丢失的转换;3个虚线箭头,表示可能有精度损失的转换。
eg:
public class Test {
public static void main(String[] args){
int n = 123456789;
float f = n;
System.out.println(f);
}
}
/* Output;
* 1.23456792E8
*/
eg:
public class Test {
public static void main(String[] args){
float f = 100.12f;
int n = (int)f;
short s = (short)f;
System.out.println("int:"+n+"\nshort:"+s);
}
}
/* Output
* int:100
* short:100
*/
在Java中由于继承和向上住转型,子类可以非常自然的转换成父类,但是父类转换成子类则需要强制类型转换。因为子类往往拥有比父类更多的属性和方法。
假设程序中存在Father和Son两个对象,首先构造一个Son对象,然后用一个Father类型变量来引用它:
Son son = new Son();
Father father = new Son();
eg:
class Father{
Father(){
String _name = "This is Father";
System.out.println(_name);
}
}
class Son extends Father{
Son(){
String name = "This is Son";
System.out.println(name);
}
}
public class Test {
public static void main(String[] args){
Son son = new Son();
Father father = new Son();
System.out.println(father);
System.out.println(son);
}
}
/* Output
This is Father
This is Son
This is Father
This is Son
Son@4554617c
Son@74a14482
*/
这里Son对象实例被向上转型为father了,但是这个Son对象实例在内存中本质还是Son类型的,不过是它的能力被临时的削弱了而已;我们同样可以将对象类型还原:
Son son = (Son)father;
在这条语句中,father引用仍旧是Father类型的,只不过它的能力加强了,将其加强后转交给送引用了,Son对象实例在son的变量的作用下,恢复原有的全部功能了;
class Father{
Father(){
String _name = "This is Father";
System.out.println(_name);
}
}
class Son extends Father{
Son(){
String name = "This is Son";
System.out.println(name);
}
}
public class Test {
public static void main(String[] args){
Father father = new Son();
Son son = (Son) father;
System.out.println(father);
System.out.println(son);
}
}
/* Output
This is Father
This is Son
Son@4554617c
Son@4554617c
*/
But,父类转换成子类并不总是成功
当引用类型的真实身份是父类本身的类型时,强制类型转换就会产生错误
Father father = new Father();
Son son = (Son)father;
执行上面的代码就会抛出ClassCastException异常
如果是子类强制转换成父类:
那么该Son类型对象的引用为Father类型, 由于Son类型是对Father类型的扩展, 所以在调用Father引用的方法在Son对象中都是存在的, 即可行;
如果父类强制转换成子类:
父类引用的对象是Father类型的, 在强转之后, Father类型对象的引用为Son类型, 而被引用的对象仍是Father类型的, 因此, 在调用方法时,Son中扩展的方法在引用的Father类型对象中并不存在, 一个对象不可能调用一个该对象中不存在方法, 所以不可行! 如果父类引用的对象是Son类型的, 那么在强转后是Son类型引用的是Son类型的对象, 是可行的
编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型
eg:
class Father{
Father(){
String _name = "This is Father";
System.out.println(_name);
}
}
class Son extends Father{
Son(){
String name = "This is Son";
System.out.println(name);
}
}
public class Test {
public static void main(String[] args){
Father father = new Father();
Son son = (Son)father;
}
}
/* Output
This is Father
Exception in thread "main" java.lang.ClassCastException: Father cannot be cast to Son
at Test.main(Test.java:18)
*/
https://blog.csdn.net/qq_38975553/article/details/90485432
《Java核心技术》(卷一)
标签:它的 向上转型 能力 blog sdn 数据类型 对象 cas 功能
原文地址:https://www.cnblogs.com/CH42e/p/12664881.html