布尔类型变量:
在Java中,使用boolean定义布尔类型变量,布尔类型变量只有true和false两个值,定义布尔类型变量
举例:
boolean flag=false;//定义一个boolean类型的变量flag,初始值为false flag=true;//改变变量flag的值为true
变量的类型转换:
自动转换类型:
自动类型转换也叫隐式类型转换
,指的是两种数据类型在转换的过程中不需要显示地进行声明,由编译器自动完成
自动类型转换必须同时满足两个条件:
一是两种数据类型彼此兼容 二是目标类型的取值范围大于源类型的取值范围
举例:
byte b=3; int x=b;
上述代码中,使用byte类型变量b为int类型的变量x赋值,由于int类型的取值范围大于byte类型的取值范围,编译器在赋值过程中不会造成数据的丢失,所以编译器能够自动完成这种转换,在编译时,不报任何错误
总的来说就是取值范围小的转换为取值范围大的实现的是自动转换
比如:
byte转化为short,int,long等
short,char转化为int,long
反过来则不能自动进行转化,需要强制类型转化!
强制类型转化:
强制类型转化也叫做显式类型转化
,意为两种数据类型之间的转化需要进行显式的说明,当两种类型彼此不兼容,或者是将取值范围大的转化为取值范围小的,自动类型转化无法进行,必须进行强制类型转化
举例:
public class HelloWorld{ public static void main(String[]args){ int num=4; byte b=num; System.out.println(b); } }
编译并没有通过,而是报出以下错误:
解决办法:
进行强制类型转化,即强制将int类型的值赋给byte类型的变量
强制类型转化格式:目标类型 变量=(目标类型)值
因此对于上述类型转换,我们可以修改为:
byte b=(byte)num;
此时便可以正常运行!
在对变量进行类型转化的时候,如果将取值范围较大的数据类型强制转化为取值范围较小的数据,例如将int–>byte这种,则极容易造成数据精度的丢失
举例:
public class HelloWorld{ public static void main(String[]args){ byte a; int b=298; a=(byte)b; System.out.println("b="+b); System.out.println("a="+a); } }
输出:
b=298 a=42
通过输出结果,我们会发现,即使进行了强制类型转化,但a和b的值仍然不同,这就是因为取值范围大的变量类型int转化为取值范围小的变量类型byte的过程中,发生了数据精度的丢失
具体原因如下:
变量的作用域:
无论C语言还是Java,变量都需要先定义才能使用,但这并不代表定义了的变量在下面的程序代码中都可以使用,变量只能在其作用范围内才可以被使用,这个作用范围称为变量的作用域
变量一定会被定义在某一对大括号中,该大括号所包含的代码区域便是这个变量的作用域
举例:
基本了解了变量的定义域后,下面我们通过一个程序熟悉一下:
举例:
public class HelloWorld{ public static void main(String[]args){ int a=90; { int b=2; System.out.println("a is"+a); System.out.println("b is"+b); } a=b; System.out.println("a is"+a); } }
编译未通过,报错如下:
原因即为:变量y在作用域范围之外被使用,出错代码为:a=b;这一句,由于变量b的作用域为内括号,因此出了这个内括号的范围,变量b便无法使用。
Java中的运算符:
在绝大多数的程序中都出现过以下的特殊符号,例如+,-,*,=,>等等,这些特殊符号叫做运算符,运算符通常用于对数据进行算术运算,赋值运算和比较运算
算数运算符:
算术运算符在使用的过程中需要注意以下几点:
1:在进行自增(++)和自减(–)运算时,如果运算符++或–放在操作数的前面,则先进行自增或自减运算,再进行其他运算。反之,如果运算符放在操作数的后面,则先进行其他运算再进行自增或自减运算
举例:
public class HelloWorld{ public static void main(String[]args){ int a=1; int b=2; int x=a+b++; System.out.println("b="+b); System.out.println("x="+x); } }
输出:
b=3 x=3
对于如下所示,这行代码,因为自增(++),放在了操作数的后面,因此先执行a+b运算,再执行b++操作
此时的b还是2,但当程序运行到下一步时,b就变成3了
int x=a+b++;
2:在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数,如果除法运算有小数参与,得到的结果会是一个小数
举例:
2510/1000 属于整数之间相除,会忽略小数部分,得到的结果是2
而2.5/10的结果是0.25
//这种规则和C语言是完全相同的,要想结果为浮点数,那么除数,被除数中,至少包含一个浮点数
3:在进行取模(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关
举例:
(-5)%3=-2
5%(-3)=2
赋值运算符:
赋值运算符在使用的过程中需要注意以下几点:
1:在Java中可以通过一条赋值语句对多个变量进行赋值
举例:
int x,y,z; x=y=z=-4;//同时为多个变量赋初始值为4
但是不能在定义变量的时候,进行多个变量赋多个初始值
举例:
int x=y=z=3;
2:在众多赋值运算符中,除了“=”,其他都是特殊的赋值运算符,以“+=”为例,x+=3所表示的含义即为x=x+3,表达式首先会进行x+3运算,再将其结果赋值给x,其他运算符以此类推
比较运算符:
注:一定不要将比较运算符“==”误写成赋值运算符"="
逻辑运算符:
逻辑运算符在使用的过程中需要注意以下几点:
1:逻辑运算符可以针对结果为布尔值的表达式进行运算
例如:
x>3&&y!=0
2:运算符“&”和“&&”都表示与操作,当且仅当运算符两边的操作数都为true时,其结果才为true,否则结果为false
虽然运算符“&”和“&&”都表示与操作,但二者在使用上还是有一定的区别:
在使用“&”进行运算时,不论“&”左边的表达式结果为true还是false,“&”右边的表达式都会进行运算,但在使用“&&”进行运算时,当“&&”左边的表达式结果为false时,“&&”右边的表达式就不再进行运算,因此“&&”被称作短路与
举例:
public class HelloWorld{ public static void main(String[]args){ int x=0; int y=0; int z=0; boolean a,b;//a,b是布尔型变量,因此输出结果只能为true或者false a=x>0&y++>1;//即使x>0为false,y++>1还是会执行,因此才有下面的y输出结果为1 System.out.println(a); System.out.println("y="+y); b=x>0&&z++>1;//挡x>0的结果为false,z++>1便不会被执行,因此z的值依然是0 System.out.println(b); System.out.println("z="+z); } }
输出:
false y=1 false z=0
3:运算符“|”和“||”都表示或操作,当运算符两边的任一表达式的值为true时,其结果为true,只有两边表达式的结果都为false时,其结果才为false,和逻辑与操作相类似,“||”为短路或,当运算符“||”左边的表达式结果为true时,右边的表达式便不再进行
4:运算符“^”表示异或操作,当运算符两边的布尔值相同(都为true或者false),其结果为false,否则为true
运算符优先级:
上表中所列举的这些运算符,优先级的数字越小代表优先级越高
举例:
public class HelloWorld{ public static void main(String[]args){ int a=2; int b=a+3*a;//*的优先级高于+,因此先执行3*a,在执行+a运算 System.out.println("b="+b); int c=(a+3)*a;//()的优先级高于*,因此先执行(a+3),再执行*a运算 System.out.println("c="+c); } }
输出如下:
b=8 c=10