1、引用数据类型转换:
由java的继承和向上转型,子类可以很自然地转换为父类对象,即父类类型可以直接引用子类对象,但是子类类型不能直接引用父类对象,需要进行强制转换。子类比父类拥有更多的属性和更强的功能,这个时候我们使用功能较弱的类型(父类)引用功能较强的对象(子类),这是可行的。但是将功能较弱的类型(父类)强制转功能较强的对象(子类)时,就不一定可以行了。
当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。如:father被赋予的是Son类的对象,所以father调用的fat()方法是Son对象中的fat()方法,Son对象即使被赋予给了father类型,但其本身还是Son对象,调用的方法还是原对象中的方法。
向上转型,子类对象将引用赋予父类类型, java允许一个对象可以不被其对应的类型所引用,而被其父类类型引用,从而可以使用其父类类型,父类引用无法调用子类对象中父类没有的方法,向上转型会有子类特性丢失。如:father.fat(),father中只能调用fat()方法,而无法调用so()方法。若需要使用其原对象特性,这时就需要向下转型了,用一个它本身类型的变量来引用它。
向下转型是可以成功的,如:(Son)father,①中的向下转型失败是因为father本身的对象是Father,强制转换会使作用域溢出(ClassCastException:当前者的域小于后者的时候出现),而②中father本身就是Son对象,(Son)father只是让其恢复本身特性,所以是可以成功的。但是说到底父类对象还是无法转换为子类所引用。父类引用可以指向子类对象,但是子类引用却不能指向父类对象
public class Father {
public void fat(){
System.out.println("I`m father");
}
}
public class Son extends Father {
public void fat(){
System.out.println("I`m a father of my son");
}
public void so() {
System.out.println("I`m son");
}
}
public class TypeStrong {
public static void main(String[] args) {
Son son = new Son();
Father father = son;//向上转型,父类引用指向了子类对象,此时子类对象的类型为父类引用的类型
father.fat();//只能调用fat()方法,无法调用so()方法,且fat()输出为:I`m a father of my son
father = (Son) father;//依然无法调用so()方法,因为father为Father类型
((Son) father) .so();//终于可以调用了...
// Father father2 = new Father();
// Son son2 = (Son) father2;//①运行出错,ClassCastException,父类对象不能为子类的类型引用
Son son2 = (Son) father;//②运行成功,向下转型,将原本父类引用赋予到子类引用上,当然此时还是子类对象为子类的类型引用
}
}
2、基本数据类型转换:
将一种类型的数据赋给另外一种类型变量时,满足下列两种要求将执行自动类型转换:1.两种类型是兼容的 ;2.目的类型的范围比来源类型大 。
数值类基本数据类型按照范围大小可分为:byte,short,char,int,long,float,double
数值类数据类型和字符类数据类型、布尔类数据类型不兼容,字符类数据类型和布尔类数据类型互相也不兼容。
注意:
- byte、short、char类型进行 + 操作,最后得出的结果为int数据类型
- 字符类数据类型与数值类数据类型进行 + 操作,最后得出的结果为字符类数据类型