数据类型转换
自动类型转换
规则:数据范围从小到大
byte<short(char)<int<long<float<double
关于基本数据类型转换规则:
-
8种基本数据类型除boolean类型之外都可以相互转换.
-
小容量向大容量转换叫做自动类型转换:
byte<short(char)<int<long<float<double -
byte,short,char做混合运算的时候,各自都先转换成int在做运算(自动提升为int)
short b,c;
short a = b + c;//右边short+short->结果自动转为int
short a =(short)(b+c);//右边为short,不会自动提升 -
大容量向小容量转换是强制类型转换,需要加强制转换符,
编译虽然通过,运行期可能损失精度。谨慎使用。 -
如果整数没有超出byte,short,char的取值范围,可以直接将这个整数赋值给byte,short,char(编译器的常量优化)
-
多种数据类型做混合运算,先转换成容量最大的那种再做运算。
数据溢出:
byte的存储范围是-128-127的整数范围,那么如果有如下语句:
byte a = (byte)130;
结果会是多少呢?java是如何处理强制类型转换的溢出处理呢?
在计算机中,所有的数据都是存储的补码形式,那么130首先被当成int型存储,四个字节32位,它的补码如下:0000 0000 0000 0000 0000 0000 1000 0010,转换为byte类型,进行截取,高字节部分去除,保留低字节部分,得到转换为byte类型的补码为:1000 0010,我们将其转换为源码:补码(1000 0010)->反码(1000 0001)->原码(1111 1110)为-126,所以最后的答案是-126.如果遇到其他的类型转换,也采用类似的处理方法。
基本数据类型之char
ASCII码
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及1、2等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
必须记住:
ASCII值 | 控制字符 |
---|---|
48 | 0 |
57 | 9 |
65 | A |
90 | Z |
97 | a |
122 | z |
public class test{
public static void main(String[] args){
char a = ',';
System.out.println(a);//运行结果:,;如果只打印不运算就是字符
System.out.println(a+0);//运行结果:44;如果发生运算则为对应的ASCll值
}
}
转义字符
如果想要把一个特殊字符赋值给char类型该怎么办?比如我想将单引号’赋值给一个char类型
char c1 = ‘’’;
上面写法在编译时会报错,正确的方法应该使用转义字符,斜线在java语言中有转义功能,正确的写法如下:
char c1 = ‘’’;
除此之外,通过转义字符可以输出很多字符。
// 斜线在java语言中有转义功能,可以将普通t字符,转换成“制表符”
char c1 = '\t';
System.out.print(c1);
//这是一个普通的“单引号”字符
char c2 = '\'';
System.out.println(c2);
//这是一个普通的“斜线”字符
char c3 = '\\';
System.out.println(c3);
//这是一个普通的“双引号”字符
char c4 = '\"';
System.out.println(c4);
//这是一个普通的换行符。
char c5 = '\n';
运算符
算数运算符
通过算数运算符可以完成基本的加减乘除取余的运算操作
+ 求和
- 相减
* 乘积
/ 相除
++ 自加1
- - 自减1
% 取余、求模
a++(先用后自增)
++a(先自增后用)
public class test{
public static void main(String[] args){
int i = 0;
i = i++;
System.out.println(i);//0
}
}
这里面涉及到内部的运行步骤:先用一个临时的变量temp保存变量自增前的值,然后变量自增,最后自增表达式会把temp的值作为整个表达式的值返回,也就是把temp的值返回给了i,由于temp保存的是i自增前的值,所以i的值不会变。
赋值运算符
赋值运算符有哪些(有隐式的强制类型转换,不会报错)
=
+= 把左边和右边做加法,然后赋值给左边
-= 把左边和右边做减法,然后赋值给左边
*= 把左边和右边做乘法,然后赋值给左边
/= 把左边和右边做除法,然后赋值给左边
%= 把左边和右边做取余,然后赋值给左边
布尔运算符
布尔运算符有哪些
& 逻辑与 两边都是true,结果是true
| 逻辑或 一边是true,结果就是true
! 逻辑非 取反 !true –> false
^ 逻辑异或 两边只要是不一致就是true
&& 短路与 用法和 & 一样。
|| 短路或 用法和 | 一样
&&和&的区别?
- &&具有短路效果。如果左边结果是false,则右边不执行。
- &是无论左边是false还是true,右边都会执行。
|(逻辑或)和||(短路或)的区别类似
开发中常用&&和||,如果当需求要求无论左边的表达式是true还是false,右边的表达式必须执行,此时必须使用逻辑与,短路与做不到。
三目运算符
有的地方也叫三元运算符
语法:
boolean表达式 ? 表达式1 : 表达式2
解释:
boolean表达式的结果是true,则整个表达式的结果就是表达式1,相反则是表达式2。
方法入门
概述
我们在学习运算符的时候,都为每个运算符单独的创建一个新的类和main方法,我们会发现这样编写代码非常的繁琐,而且重复的代码过多。能否避免这些重复的代码呢,就需要使用方法来实现。
方法:就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。
当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。
方法定义与调用
定义格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
方法体语句;
//如果方法没有返回值的话就不需要return了。
return 返回值;
}
- 修饰符:暂时先写 public static。后面再详细的讲解其他的修饰符和作用。
- 返回值类型:可以是java语言中的任何一种数据类型(基本数据类型和引用数据类型)。如果方法执行结束后,没有任何返回值,返回值类型填写void,即表示没有返回值。
- 方法名:自己定义,只要符合命名规则即可,使用驼峰方式命名,即第一个单词首字母小写,后面单词的首字母大写,例如sumInt。
- 参数:
- 没有参数:如果没有参数,参数类型和参数名可以不写,()里面空着就行
- 有参数:可以有一个,或多个参数,多个参数用”,”隔开
- 参数类型:就是参数的数据类型,基本数据类型和引用数据类型都可以
- 参数名:就是变量名,符合命名规则即可
- 方法体语句:就是完成功能的代码。
- return:如果方法的返回值类型不是void,那么在方法体中必须使用return 语句来返回数据。return语句一旦执行,则方法结束,因此在方法中return后面的代码是不会执行的。
- 返回值:方法执行的结果,将结果返回给调用者。
调用格式:
public static void main(String[] args) {
//调用定义的方法
method method();
}
//定义方法,被main方法调用
public static void method() {
System.out.println("自己定义的方法,需要被main调用运行");
}
- public static是修饰符
- -void表示main方法结束之后不返回任何值
- main是方法的名字,是sun公司规定好的
- (String[] args)是形式参数列表,该参数表示是一个String类型的数组,形参的名字是随意的,下面这种写法也是可以的,只不过通常都会将参数名字写成args。
编译器的常量优化
short result = 13;
byte,short,char右侧的常量结果数值,没有超过左侧范围,所以正确。
注意:一旦表达式中有变量参与,就不能进行这种优化了。
int a = 6;
int b = 8;
short result = a + b;//错误
short result = a + 8;//错误
short result = 6 + 8;//正确,编译器会进行优化