变量之间的类型转换主要包括自动类型转换和强制类型转换。
1、自动类型转换:当容量小的数据类型与容量大的数据类型做运算时,容量小的会自动的转换成容量大的类型。
【知识点】:
a)char,byte,short ---> int ---> long ---> float ---> double ---> String
char c = 'a';
short s = 12;
byte b = 125;
//char、short和byte之间运算全部自动转换成int
int s1 = c + s;
int s2 = b + s;
int s3 = c + b; long l = 1000L;
//int和long之间的运算自动转换成long
long l1 = s1 + l; float f = 12.36f;
//long和float之间的运算自动转换成float
float f1 = l1 + f; double d = 16952;
//float和double之间的运算自动转换成double
double d1 = f1 + d;
b)那是不是有人反思过这样的问题。
short a = 3; //编译正常
a = a + 3; //编译错误
a += 3; //编译正确(原因参照强制类型转换)
3也是默认类型int类型,为什么直接赋值给a没事,而a+3自动转换成也是int类型的,再赋值就编译错误了呢?
问题关键点在3是常量,这种赋值操作只有后面是变量的情况下才会发生编译错误。所以我们的标题叫做变量之间的类型转换。
int a = 1;
int b = 2;
byte b1 = 1 + 2;//编译正确
byte b2 = a + b;//编译错误(cannot convert from int to byte)
那么常量运算也总结一下:
byte b1 = 1 + 126; //编译正确
byte b2 = 1 + 127; //编译错误(cannot convert from int to byte)
int a = 1 + 1.2; //编译错误(cannot convert from double to int)
String s2 = 12 + "";//编译正确
(1)127在byte的范围中,编译正常,而128超过了byte的范围,编译错误。
(2)1 + 1.2 = 2.2,2.2是double类型,超过了int的范围,编译错误。
(3)12 + " " = "12"(int + String = String),谁和String做运算都被自动转换成String。
总结:做常量运算,看结果的数值范围。不能单纯的看类型范围。
c)笔试题:
(1)考核各个数据类型之间的连接操作理解程度
String a = "abc";
char c = 'a';//a的ASCII码是97
int i = 12;
System.out.println(a+c+i);//abca12
System.out.println(c+i+a);//109abc
System.out.println(a+i+c);//abc12a
(2) 考核对计算机变量存储的灵活应用
int a = 200;
int b = 500;
在不申明第三方变量的情况下,如何对a和b的值进行互换?
a = a + b;
b = a - b;
a = a - b;
这样就完成了a和b的值互换,但是我们思考一下,其实是不严谨的。
我们设想一下,如果a和b是一个很大的值,两个相加有可能超过了int的数值范围,那么有什么更好的办法吗?
答案是肯定的,看下一篇文章《运算符》中的异或,那里给出了最完美的答案。
2、强制类型转换:当容量大转换成容量小的,需要使用强制类型转换。用形式:(类型) 来做强制转换。
【知识点】:
a)强制类型转换的问题:导致精度的丢失
int i = 128;
byte by = (byte)i;
System.out.println(by);
输出结果:-128
b)+=,-=,*= 这类的运算符运算是自动被强制类型转换的。
例如上面的案例: a += 3; 其实等价于 short a = (short)(a+3);所以肯定不会编译错误。
c)int类型不能强制类型转换成String
int a = 100;
String str = (String)a;//编译错误(Cannot cast from int to String)
d)null值可以强制转换为任何java类类型
笔试题:String str = (String)null和String str = null的区别
两个是一样的,第一个可不是“null”字符串,它还是null。
e)数值类型转换成字符串(有3种方法)
int a = 33;
String s1 = a + ""; //方法一:用+连接符和“”
String s2 = Integer.toString(a); //方法二:Integer.toString
String s3 = String.valueOf(a); //方法三:String.valueOf(看String源码发现valueOf调用的是方法二)
f)字符串转换成数值类型(有2种方法)
String s = "33";
int a1 = Integer.parseInt(s);//方法一:用该数值类型的包装类的parse方法
int a2 = Integer.valueOf(s); //方法二:用该数值类型的包装类的valueOf方法
跟着刚哥梳理java知识点——变量之间的类型转换(四)的更多相关文章
-
跟着刚哥梳理java知识点——面向对象(八)
面向对象的核心概念:类和对象. 类:对一类事物描述,是抽象的.概念上的定义. 对象:实际存在的该类事物的每个个体,因而也成为实例(Instance). Java类及类的成员:属性(成员变量Field) ...
-
跟着刚哥梳理java知识点——多线程(十六)
创建多线程第一种方式:① 继承:继承Thread.② 重写:重写Thread类的run()方法③ 创建:创建一个子类的对象④ 调用:调用线程的start()方法,启动此线程,调用run()方法 cla ...
-
跟着刚哥梳理java知识点——深入理解String类(九)
一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class String implements java.io.Ser ...
-
跟着刚哥梳理java知识点——泛型(十三)
一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: public class GenericTest { public static void main(String[] a ...
-
跟着刚哥梳理java知识点——运算符(五)
运算符:是一种特殊的符号,用以表示数据的运算.赋值和比较. 1.算数运算符(+.-.*./.%.++.--) a)除: int i = 12; double d1 = i / 5; //2.0 dou ...
-
跟着刚哥梳理java知识点——IO(十五)
凡是与输入.输出相关的类.接口都定义在java.io包下 java.io.File类 1.File是一个类,可以有构造器创建其对象.此对象对应着一个文件或者一个目录. 2.File中的类,仅涉及到如何 ...
-
跟着刚哥梳理java知识点——枚举和注解(十四)
enum Season{ SPRING("spring","春暖花开"), SUMMER("summer","夏日炎炎" ...
-
跟着刚哥梳理java知识点——包装类(十)
Java为8种基本数据类型都提供了对应的包装器类型 装箱和拆箱: public class Main { public static void main(String[] args) { Intege ...
-
跟着刚哥梳理java知识点——数组(七)
数组:数组是多个相同类型数据类型的集合,实现对这些数据的统一管理. 元素:数组中的元素可以是任何数据类型,包括基本数据类型和引用类型. 特点:属于引用类型,数组型数据是对象object,数组中的每个元 ...
随机推荐
-
U盘centos7系统安装http://www.augsky.com/599.html
修改第二步中按TAB键出来的命令 这里注意了:网上很多文章都说这一步改成">vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdbquiet ...
-
java.lang.Long cannot be cast to java.lang.Integer解决办法
情景: mybatis连接oracle 报错: 测试增的时候,报错 Java.lang.Long cannot be cast to java.lang.Integer:删改没有报错. 排查过程: ...
-
wpf button的mouse(leftbutton)down/up,click事件不响应解决办法
按照WPF的帮助说明,某些控件的路由事件被内部处理了,已经被标记为Handled,自行定义的事件处理代码便不再起作用了,有时候会很郁闷! 不过WPF提供了必要的方法. ...
-
Java -- 访问控制
原文:http://www.cnblogs.com/diyingyun/archive/2011/12/21/2295947.html 可见/访问性 在同一类中 同一包中 不同包中 同一包子类中 ...
-
nbIoT基础概念
1. 物理信道(L1与L2之间) 上行:PRACH.PUSCH 下行:PBCH.PDCCH.PDSCH 2.逻辑信道(L2与L3之间) CCCH.DCCH.DTCH 3.信令(L3与NAS层之间) D ...
-
web前端必须掌握的localStorage
先自我介绍一下,本人男,27岁,单身,web前端程序员一枚,长期潜伏在幕后,只学不教(貔貅么?),其实主要是工作太忙了,每天忙到11点左右,没有时间写东西,洗洗就睡了.最近赶巧,后端那边出技术瓶颈了, ...
-
纯JS单页面赛车游戏代码分享
分享一个以前写的小游戏,纯js游戏,代码很简单.欢迎大家来喷呦! 效果图: 代码展示://直接复制到html文件即可 支持IE9+版本 <!DOCTYPE html> <html&g ...
-
理解Java包
本质上,包是一个唯一命名的类的集合,将类集合到包里面的主要原因,是为了当在应用程序中使用预先编写的类时避免与类自身可能引起的明明冲突.用于包中的类名不会妨碍另一个包或程序中的类名,因为此时,包中的类名 ...
-
C++学习笔记24,方法重写与方法隐藏
该博文仅用于交流学习.请慎用于不论什么商业用途.本博主保留对该博文的一切权利. 博主博客:http://blog.csdn.net/qq844352155 转载请注明出处: 方法重写.是指在子类中又一 ...
-
Caused by:org.hibernate.HibernateException:Unable to make JDBC Connection
1.错误描述 Caused by:org.hibernate.HibernateException:Unable to make JDBC Connection[jdbc\:mysql\://loca ...