Java中的类型转换
在本教程中,我们将讨论Java中的类型转换及其各种形式。
Java中的类型转换
简而言之,类型转换意味着转换基元/引用变量的类型。
我们将在类型转换中处理三种类型的方案:
- 原始类型
- 对象类型
- 包装器类和基元
因此,本教程将分为三个部分:
- 加宽和缩小 (Widening and Narrowing)
- 上投和下投 (Upcasting and Downcasting)
- 自动装箱和拆箱 (Autoboxing and Unboxing)
扩展和向上转换是等效的。
缩小和向下转换也等效。
为了简单起见,为了区分原始类型和引用类型的示例,我们使用了不同的术语。
1.java扩大和缩小类型转换
加宽意味着可以将小型字体容纳在大型字体中,而不会丢失任何信息。
加宽类型转换是自动的。
这意味着可以将字节值自动转换为short,int,long或者double。
字节->短->诠释->浮动->双
从左到右加宽。
布尔类型不能强制转换为其他任何类型。
它们始终是对还是错。
例:
Jshell宽型铸件
让我们看另一个例子:
Jshell类型转换错误
如您所见,从宽到窄的类型转换会自动导致编译时错误。
为此,我们需要将显式类型强制转换为:
Jshell窄型铸造
这是狭窄的类型转换,必须手动完成。
2. java向上和向下转换
简而言之:向上转换是从子类转换为超类。
向下转换是从超类转换为子类。
向上转换是自动发生的,我们不必明确地做任何事情。
如果隐式完成向下转换,则可能导致编译器错误。
在以下示例中,我们的继承树将如下所示:
theitroad-> Java-> Android
//Base Class class JD { public void printMe() { System.out.println("theitroad print method"); } } //Inherited class class Java extends JD { public void printMe() { System.out.println("Java print method"); } } //Inherited class class Android extends Java { public void printMe() { System.out.println("Android print method"); } } class Main { public static void main(String[] args) { JD jd = new Java(); jd.printMe(); //prints Java print method } }
上面的例子是一个向上转换的例子。
让我们在向下转换中使用相同的概念,看看会发生什么:
Android android = new Java();
这将导致编译时错误。
请改用以下内容:
Java java = new Android(); Android and = (Android) java;
如果实际对象类型不是目标对象类型,则向下转换可能会失败。
在这种情况下,将抛出ClassCastException。
假设我们有一个类似的程序:
class JavaEE extends Java { public void printMe() { System.out.println("JavaEE print method"); } }
现在:
Java java = new Android(); JavaEE javaEE = (JavaEE)java; //classcastexception
为了解决这种情况,在类型转换之前使用instanceof
运算符。
当我们要访问子类型的特定行为时,通常使用向下转换。
3.自动装箱和拆箱
如果要使用原始类型作为引用对象,则可以使用它们的等效包装器类。
例如:int具有Integer等等。
自动装箱是指将原始类型自动转换为引用类型。
例:
ArrayList<Integer> arrayList = new ArrayList<>(); arrayList.add(1);
其中我们通过自动装箱将原始类型添加到引用类型。
拆箱意味着将包装类型的对象转换为其对应的原始值,例如,将Integer转换为int
要显式地取消装箱,我们可以使用诸如intValue(),floatValue()等内置方法:
Integer obj = new Integer("123"); int i = obj.intValue(); System.out.println(i); //123