Java引用类型的强制类型转换

        正如有时候需要将浮点型的数值转换为整型数值一样,有时候也可能需要将某个类的对象引用转换成两外一个类的对象引用。

进行强制类型转换的唯一原因是:在暂时忽视对象的实际类型之后,使用对象的全部功能。

       编写Java程序时,引用类型只能调用声明该变量的类型的方法,也就是编译时类型的方法,不允许调用运行时类型所定义的方法,即使它实际所引用的对象包含该方法。解释一下就是我们说的,父类对象不能调用子类中新定义的方法,即使new 实例化的是子类类型。如果想要让这个父类类型的变量能够调用子类中新添的方法,就必须对该变量进行强制类型转换,将其转换成自类类型。强制转换类型的方式和基本类型的转换方式之一致的。

结合基本类型的强制转换,我们要注意一下:

      基本类型的强制类型转化是在数值类型之间进行,这里值得是Java中8种基本类型。但是数值类型和布尔类型之间不能转换。

      引用类型之间的转化只能是两个类型具有继承关系,就是说一个类型是另一个类型的子类类型。不具备继承关系的两个引用类型变量是不能进行强制类型转换的。否则程序会引发ClassCastException异常。

public class Cast {

	public static void main(String[] args) {
		double d = 1.23;
		long l = (long) (d);
		System.out.println(l);
		int i = 3;
		//boolean bl = (boolean)i;
		//布尔类型的变量不能和数值类型的变量之间进行转换
		Object obj = "hello";
		//Java中String类继承于Object类
		String objStr = (String)obj;
		System.out.println(objStr);
		Object obj1 = new Integer(20);
		String str = (String)obj1;
		//obj1 的编译时类型是Objext 运行时类型是Integer
		// Object与Integer存在继承关系   
		//可以强制类型转换 而obj1的实际类型是Integer
		//所以下面的代码运行时会引发类型转换的异常 因为String类和integer类不存在继承关系
		System.out.println(str);
	}
	
}

结果:

因此 考虑到强制类型转换可能会引发程序异常,所以在进行引用类型的强制类型转换之前要先使用instanceof关键字进行判断。关键字是用来判断类类型的。

String strr = "";
if(  strr instanceof Object) {
			
    System.out.println("Yes");
}
if(strr instanceof String) {
	System.out.println("Yes");
}

结果都是输出Yes.

       instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类,也可以是接口,可以把接口理解成为一种特殊的类,它用于判断前面的对象是否是后面的类,或者子类,实现类的实例。

       在使用instanceof关键字的时候要注意,instanceof运算符前面的操作数的编译时类型要么与后面的类相同,要么与后面的类具有父子继承关系,否则会引起编译错误。

 

猜你喜欢

转载自blog.csdn.net/ibliplus/article/details/81159710