当前位置:首页 » 编程语言 » java的强制类型转换

java的强制类型转换

发布时间: 2022-06-24 14:36:41

java中的强制类型转换

在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换。

在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。那么,是不是只要是父类转换为子类就会成功呢?其实不然,他们之间的强制类型转换是有条件的。

当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。但是将功能较弱的类型强制转功能较强的对象时,就不一定可以行了。

举个例子来说明。比如系统中存在Father、Son两个对象。首先我们先构造一个Son对象,然后用一个Father类型变量引用它:

Father father = new Son();

在这里Son 对象实例被向上转型为father了,但是请注意这个Son对象实例在内存中的本质还是Son类型的,只不过它的能力临时被消弱了而已,如果我们想变强怎么办?将其对象类型还原!

Son son = (Son)father;

这条语句是可行的,其实father引用仍然是Father类型的,只不过是将它的能力加强了,将其加强后转交给son引用了,Son对象实例在son的变量的引用下,恢复真身,可以使用全部功能了。

前面提到父类强制转换成子类并不是总是成功,那么在什么情况下它会失效呢?当引用类型的真实身份是父类本身的类型时,强制类型转换就会产生错误。例如:

Father father = new Father();

Son son = (Son) father;

这个系统会抛出ClassCastException异常信息。

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

所以在继承中,子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败。

(1)java的强制类型转换扩展阅读:

public class TestCastClassException

{

public static void main(String[] args)

{

Father father = new Son();

//这两句话是不对的,因为一个father类型的引用(指针)是看不见、看不到son中新定义的数据成员或者成员函数的

//虽然这个对象的本质是Son类型的,它也确实有这样的数据成员和成员函数,但是指针的作用范围不够,它看不到。

//代码后面附上模型分析

//father.son = 2;

//father.show_son();

father.show_father();

father.show();

Father father1 = (Father)father;//一个对象在内存中被new出来后,只能选择访问它的方式,不能修改它的布局(包含的成员的个数等)

father1.show();

} //main

}

class Father

{

public int father = 2;

Father(){}

void show()

{

System.out.println("This is father");

}

void show_father()

{

System.out.println("father!!");

}

}

class Son extends Father

{

public int son = 1;

Son(){}

void show()

{

System.out.println("This is son");

}

void show_son()

{

System.out.println("son!!");

}

}

⑵ Java强制数据类型转换

规则可不少,挺乱的其实:
强制数据类型转换: int nowC = (int)c;
还可以这样,使用intValue方法,返回一个int值:
Double d = 5 / 9.0 * (f - 32);
int nowC = d.intValue();
Double类是基本数据类型double所对应的包装类。

基本数据类型转换的规则:
Java中基本数据类型共有8种,其中boolean类型不能转换为其它类型,其它类型也不能转换为boolean型
除了boolean类型,还有7种,按照它们的容量(也就是表数范围,就是能表示的数的大小范围,比如char是0——65535)的大小,从小到大,排序依次为:
byte short char int long float double
1.容量小的向容量大的转换,可以自动转换,比如可以直接将一个int类型赋值给double:
double d = 34;
2.容量大的向容量小的转换,必须强制类型转换,就是你上面的那种形式,比如:
double c = 5/9.0 *(f - 32);
int nowC = (int)c;
3.整数类型常量默认为int类型,比如17
4.浮点类型常量默认为double类型,比如3.14
5.在多种数据类型混合运算时,容量小的自动转换为整个表达式中容量最大的,然后再进行计算,比如:
int i = 9; float f = 4f; double d = 3.14; double dd = i+f+d;
此时,i和f都各自先转换成double,在进行+运算。
6.在多种数据类型混合运算时,byte short char 3者不会互相转换,他们各自转换为int再进行计算
7.在有些时候,容量小的会自动提升为容量大的,比如方法重载传参数时候,
但是byte 和 short 不会自动提升为char,其它类型按照我上面所述的顺序提升。

差不多就这些,不明白补充,另外需要注意的是强转虽然编译没问题,但是运行时,有可能会数据溢出,损失精度

⑶ Java的强制类型转换的格式,急

强制转换格式为(int)a将变量a强制转换为int型,但是转换是有条件的。数值类型只能转换为数值类型,逻辑类型boolean不能转换为数值型。如(int)true就是不对的。详细的可以参考一些网上的资料。我就不一一列举了

⑷ JAVA如何进行强制类型转换

如果这2种类型是兼容的,那么Java 将自动地进行转换。

⑸ java 强制类型转换的规则是什么

1、执行算术运算时,低类型(短字节)可以转换为高类型(长字节);例如: int型转换成double型,char型转换成int型等等;

2、赋值表达式中,等号右边表达式的值的类型自动隐式地转换为左边变量的类型,并赋值给它;

3、函数调用时,将实参的值传递给形参,系统首先会自动隐式地把实参的值的类型转换为形参的类型,然后再赋值给形参;

4、函数有返回值时,系统首先会自动隐式地将返回表达式的值的类型转换为函数的返回类型,然后再赋值给调用函数返回。

(5)java的强制类型转换扩展阅读

C++中强制类型转换函数有4个:

1、const_cast(用于去除const属性)。

2、static_cast(用于基本类型的强制转换)。

3、dynamic_cast(用于多态类型之间的类型转换)。

4、reinterpreter_cast(用于不同类型之间的指针之间的转换,最常用的就是不同类型之间函数指针的转换)。

隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。

在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。

在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回。

参考资料

网络-强制类型转换

⑹ java怎么自动判断类型并且强制转换

并不能直接解决你的问题,但可供参考:
Object something = "something";
String theType = "java.lang.String";
Class<?> theClass = Class.forName(theType);
Object obj = theClass.cast(something);
泛型:
Object something = new Integer(123);
String theType = "java.lang.Number";
Class<? extends Number> theClass = Class.forName(theType).asSubclass(Number.class);
Number obj = theClass.cast(something);

⑺ JAVA如何进行强制类型转换

1.
转型有两种:
向上转型和向下转型(强制转型)
2.
两种分别如下:
1.
一种是向上转型
1.
对于基础数据类型
,
可以自动转型
,比如:
int
a
=
10;
long
b
=
a;
这里就是把int型转成了long型
,
因为
long范围比int大
,
这样的转型不会有任何影响
,
所以可以自动转型
2.
又比如
A
a
=
new
B();
其中
A
是B
的父类
,
这也是多态
,
就是父类的对象指向子类的引用
,
你调用a对象
,
实际上是B的类
,
但是B继承A
,
拥有A的一切属性和方法
(不谈复写)
3.
第二种是向下转型
,
也就是强制
这种需要强转
,
比如
long
a
=
10
;
int
b
=
(int)
a;
通过
(int)可以强制转型
,
但是这样会丢失精度
,
比如a如果超过了b的范围
,
那么强转成int型,
只会等于int的最大值
又比如
:
B
b
=
new
A();
这样是不行的
,
需要有中间途径
,
比如
A
a
=
new
A();

Object
obj
=
a;

B
b
=
(A)
a;
而这种强转
,
又有要求
,
必须是同类型
,
也就是说
A
就是B
,
不然会报错.
4.
不同类型之间如果要转型
,
需要通过中间途径
,
比如JSON
,
将A转成JSON串
,
然后再转换为B

热点内容
自动鬼使黑脚本 发布:2024-05-05 03:10:49 浏览:878
游戏脚本编程书籍推荐 发布:2024-05-05 02:59:13 浏览:71
编译器书籍推荐 发布:2024-05-05 02:57:02 浏览:55
电池存储温度 发布:2024-05-05 02:53:07 浏览:206
安卓在美国怎么下载 发布:2024-05-05 02:31:06 浏览:924
黑莓存储空间 发布:2024-05-05 02:19:50 浏览:274
我的世界矿石岛服务器宣传片 发布:2024-05-05 02:17:19 浏览:613
如何区分安卓原装充电器 发布:2024-05-05 01:41:23 浏览:72
怎么从苹果转移到安卓 发布:2024-05-05 01:41:20 浏览:721
支付宝付款码怎么设置密码 发布:2024-05-05 01:27:36 浏览:878