Java中的类型转换和类型转换
当将一种类型的值分配给另一种数据类型的变量时,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