Java中的类型转换

时间:2020-02-23 14:37:28  来源:igfitidea点击:

在本教程中,我们将讨论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&ltInteger> arrayList = new ArrayList<>();
arrayList.add(1);

其中我们通过自动装箱将原始类型添加到引用类型。

拆箱意味着将包装类型的对象转换为其对应的原始值,例如,将Integer转换为int

要显式地取消装箱,我们可以使用诸如intValue(),floatValue()等内置方法:

Integer obj = new Integer("123");
    int i = obj.intValue();
    System.out.println(i); //123