Java中的类型转换和类型转换

时间:2020-01-09 10:34:50  来源:igfitidea点击:

当将一种类型的值分配给另一种数据类型的变量时,Java会执行类型转换以将值容纳为另一种类型。这种类型转换可能自动发生,或者我们可能需要显式的类型转换才能执行类型转换。

因此,这两个术语"类型转换"和"类型转换"都与Java中一种数据类型到另一种数据类型的转换有关。

  • 类型转换(Type Conversion)–当两种类型相互兼容时,编译器会自动将一种类型转换为另一种类型。例如,将一个int值分配给float变量。
  • 类型转换(Type Casting)–如果类型不兼容,则无法进行自动类型转换。如果要在不兼容类型之间进行转换,则必须进行显式类型转换。

类型转换Java语法

Java中类型转换的语法如下:

(type)value;

例如,如果我们要为int变量分配一个double值,则不会自动发生从double到int的转换。我们需要为此类型将double转换为int。

double d = 16.78;
int a = (int)d;

Java中类型转换的类型

Java中的类型转换可以分为两种类型

1Wilding转换–如果类型兼容并且目标类型大于源类型,则发生扩展类型转换。
例如,在原始数字数据类型的情况下,类型的扩展可以显示如下:

字节–短–整数–长–浮点–双精度

扩大转换可以进一步分为

  • 扩展原始类型转换

  • 加宽参考类型转换

扩展原始类型转换

对于原始数据类型,自动进行类型转换。

int i = 34;
double d = i;
System.out.println("value of d = " + d);

输出:

value of d = 34.0

加宽参考类型转换

在父子类关系中,父类型的引用可以保存子类型引用,而无需任何显式的类型转换。

例如

如果有一个名为Parent的类,并由称为Child的类扩展了。然后,可以将Child类型的实例存储在Parent类型引用中,而无需进行类型转换,因为它是Widening引用类型转换。

class Parent {
  public void method1() {
    System.out.println("In Parent method");
  }
}

class Child extends Parent {
  public void method1() {
    System.out.println("In Child method");
  }
}

public class Test {
  public static void main(String[] args) {
    Parent p;
    Child c = new Child();
    // Parent reference holding the reference of child object
    p = c;
  }
}

2缩小转换–如果目标类型比源类型窄,则发生缩小类型转换。缩小类型转换不会自动发生,我们需要使用类型转换显式缩小类型。

缩小转换可以进一步分为

  • 缩小原始类型转换

  • 缩小参考类型转换

缩小原始类型转换

对于原始数据类型,如果目标类型小于源类型,则为缩小类型转换,并且这种类型转换不会自动进行。

例如,以下代码行会导致编译时错误"类型不匹配:无法从double转换为int",因为int(源类型)比double(目标类型)窄。

double d = 16.78;
int i = d; // Compile time error

在缩小类型转换的情况下,我们需要类型转换来进行转换。

double d = 16.78;
int i = (int)d;
System.out.println("value of i = " + i);

输出:

value of i = 16

如我们所见,当从double转换为int时,值也被截断了,因为int没有小数部分。

缩小参考类型转换

如果我们希望子类型(子类)引用保留父(超级类)引用,那么该引用不会自动发生。

以下Java程序引发编译时错误"类型不匹配:无法从父级转换为子级",因为Parent是超类,并且已分配给子类实例。

public class Test {
  public static void main(String[] args) {
    Parent p = new Parent();
    Child c;
    c = p;// compile time error
  }
}

class Parent {
  public void method1() {
    System.out.println("In Parent method");
  }
}

class Child extends Parent {
  public void method1() {
    System.out.println("In Child method");
  }
}

为了进行这种缩小类型转换,我们将需要键入强制引用。

Parent p = new Parent();
Child c;
c = (Child)p;

如果子类拥有自己的方法(除了它覆盖的超类的方法之外),则需要用Java中的类型转换来缩小引用的范围。考虑以下情形:

class Parent {
	public void method1() {
		System.out.println("In Parent method");
	}
}

class Child extends Parent {
	public void method1() {
		System.out.println("In Child method");
	}
	
	public void display() {
		System.out.println("in display method of Child class");
	}
}

这里,Child类重写了超类的method1()方法,并且它也具有自己的方法display()。

public class Test {
	public static void main(String[] args) {
		Parent p = new Child();
		p.display(); // compile time error
	}
}

尝试使用超类引用调用显示方法将不起作用,并且会出现编译器错误"显示无法解析或者不是字段"。

要调用display()方法,我们需要进行类型转换。

public class Test {
	public static void main(String[] args) {
		Parent p = new Child();
		((Child)p).display();
	}
}

输出:

in display method of Child class