规则:数据范围从小到大
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.如果遇到其他的类型转换,也采用类似的处理方法。
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及1、2等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。
必须记住:
ASCII值控制字符48057965A90Z97a122z 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;//正确,编译器会进行优化