Java类型转换

Posted ch42e

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java类型转换相关的知识,希望对你有一定的参考价值。

自动类型转换(隐式)

技术图片

上图给出了数值类型之间的合法转换。图中6个实线箭头,表示无信息丢失的转换;3个虚线箭头,表示可能有精度损失的转换。

eg:

public class Test {
    public static void main(String[] args){
        int n = 123456789;
        float f = n;
        System.out.println(f);
    }
}

/* Output;
 * 1.23456792E8
*/

强制类型转换(显示)

基本数据类型

eg:

public class Test {
    public static void main(String[] args){
        float f = 100.12f;
        int n = (int)f;
        short s = (short)f;
        System.out.println("int:"+n+"
short:"+s);
    }
}
/* Output
 * int:100
 * short:100
*/

引用数据类型

在Java中由于继承和向上住转型,子类可以非常自然的转换成父类,但是父类转换成子类则需要强制类型转换。因为子类往往拥有比父类更多的属性和方法。

假设程序中存在Father和Son两个对象,首先构造一个Son对象,然后用一个Father类型变量来引用它:

Son son = new Son();
Father father = new Son();

eg:

class Father{
    Father(){
        String _name = "This is Father";
        System.out.println(_name);
    }
}

class Son extends Father{
    Son(){
        String name = "This is Son";
        System.out.println(name);
    }
}

public class Test {
    public static void main(String[] args){
        Son son = new Son();
        Father father = new Son();
        System.out.println(father);
        System.out.println(son);
    }
}

/* Output
This is Father
This is Son
This is Father
This is Son
Son@4554617c
Son@74a14482
*/

这里Son对象实例被向上转型为father了,但是这个Son对象实例在内存中本质还是Son类型的,不过是它的能力被临时的削弱了而已;我们同样可以将对象类型还原:

Son son = (Son)father;

在这条语句中,father引用仍旧是Father类型的,只不过它的能力加强了,将其加强后转交给送引用了,Son对象实例在son的变量的作用下,恢复原有的全部功能了;

class Father{
    Father(){
        String _name = "This is Father";
        System.out.println(_name);
    }
}

class Son extends Father{
    Son(){
        String name = "This is Son";
        System.out.println(name);
    }
}

public class Test {
    public static void main(String[] args){
        Father father = new Son();
        Son son = (Son) father;
        System.out.println(father);
        System.out.println(son);
    }
}

/* Output
This is Father
This is Son
Son@4554617c
Son@4554617c
*/

But,父类转换成子类并不总是成功

当引用类型的真实身份是父类本身的类型时,强制类型转换就会产生错误

Father father = new Father();
Son son = (Son)father;

执行上面的代码就会抛出ClassCastException异常

如果是子类强制转换成父类:

那么该Son类型对象的引用为Father类型, 由于Son类型是对Father类型的扩展, 所以在调用Father引用的方法在Son对象中都是存在的, 即可行;

如果父类强制转换成子类:

父类引用的对象是Father类型的, 在强转之后, Father类型对象的引用为Son类型, 而被引用的对象仍是Father类型的, 因此, 在调用方法时,Son中扩展的方法在引用的Father类型对象中并不存在, 一个对象不可能调用一个该对象中不存在方法, 所以不可行! 如果父类引用的对象是Son类型的, 那么在强转后是Son类型引用的是Son类型的对象, 是可行的

编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型

eg:

class Father{
    Father(){
        String _name = "This is Father";
        System.out.println(_name);
    }
}

class Son extends Father{
    Son(){
        String name = "This is Son";
        System.out.println(name);
    }
}

public class Test {
    public static void main(String[] args){
        Father father = new Father();
        Son son = (Son)father;
    }
}

/* Output
This is Father
Exception in thread "main" java.lang.ClassCastException: Father cannot be cast to Son
	at Test.main(Test.java:18)
*/

参考

https://blog.csdn.net/qq_38975553/article/details/90485432

《Java核心技术》(卷一)

以上是关于Java类型转换的主要内容,如果未能解决你的问题,请参考以下文章

对象不能从 DBNull 转换为其他类型。

java中把json怎么转换成数组?

(转) Java中的负数及基本类型的转型详解

无法将 java.lang.String 类型的属性值转换为所需的 java.time.LocalDateTime 类型

片段无法转换为 java.util.concurrent.Executor 错误

java 片段分割共享元素转换