JavaDay3
1.局部变量和实例变量的异同
局部变量:
- 定义在方法中的变量,就是局部变量;
- 局部变量没有默认值;
- 作用范围:局部变量被直接包裹的大括号中,从这变量声明开始,一直到这个大括号结束;
- 方法的参数,也是局部变量,它的作用范围在整个方法中;
- 不能使用修饰符。
实例变量:(全局变量,成员变量)
- 实例变量就是类中的属性,也叫做成员变量(非静态的);
- 实例变量是有默认值的,即使声明完,不赋值,它也有一个默认的值,不同类型的实例变量的默认值不同:
(1)byte类型,默认值为0;
(2)short类型,默认值为0;
(3)int类型,默认值为0;
(4)long类型,默认值为0L;
(5)float类型,默认值为0.0F;
(6)double类型,默认值为0.0D;
(7)boolean类型,默认值false;
(8)char类型;默认值是’\u0000’。
(9)引用类型,String字符串类型的变量,默认值是null。 - 实例变量的作用范围是当前类中所有的非静态方法中,都可以访问。
- 可以使用修饰符。
2. 操作符
- 赋值操作符:
(1)=:最基础的赋值操作符,=号右边的值,赋给=号左边变量;
(2)*=:一个变量和另一个数据相乘,并把结果再赋值给这个变量;
(3)/=:相除;
(4)%=:相余;
(5)+=:相加;
(6)-=:相减。
注意:++a和a++的区别:
(1)a++ 表示先使用a的值进行操作或者运算,然后再让a完成自增1;
(2)++a 表示先让a完成自增1,然后再使用a的值进行操作或者运算。
–a和a–与其类似。 - 比较操作符:
(1)>:大于;
(2)<:小于;
(3)>=:大于等于;
(4)<=:小于等于;
(5)instanceof:判断对象是否属于指定类型。 - 相等操作符:
(1)==:比较两边的数据是否相等,相等返回true,不相等返回false。
(2)!=:比较两边的数据是否不相等,相等返回false,不相等返回true。 - 算术操作符:
(1)+:数字之间使用+,表示俩个值相加;
(2)-:两个数字相减;
(3)*:两个数字相乘 ;
(4)/:两个数字相除;
(5)%:两个数字取余。
注意:使用+号,也可以表示拼接两个字符串,数值与字符串使用+号拼接,结果还是字符串。 - 移位操作符:
(1)>>:算术右移位运算:这个操作的本质是除以2^n,这个n是右移的位数;
(2)<<:算数左移位运算:这个操作的本质是乘以2^n,这个n是左移的位数;
(3)>>>:逻辑右移位运算(无符号右移运算):
这个操作的本质是除以2^n,这个n是右移的位数;
但是除以2^n之后只保留整数部分;
正数和负数右移之后,最左边空出的位置,都要补0。
注意:特殊情况:
int a = 0b00000000000000000000000000000001;
System.out.println(a<<32); //结果是1 相当于1<<0
System.out.println(a<<33); //结果是2 相当于1<<1
System.out.println(a<<34); //结果是4 相当于1<<2
原因:如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模/取余。如果对int类型移动33位,实际上只移动了33%32=1位。如果对int型移动32位,实际上只移动了32%32=0位。
6. 位运算符:
(1)&:与运算;
(2)|:或运算;
(3)^:异或运算;
(4)~:取反运算
7. 逻辑运算符:
(1)&&:短路与:
a>0 && (b++)>1;
//如果第一个条件a>0满足,就对下一个条件(b++)>1进行判断;如果a>0不满足就不再判断第二个条件。
(2)||:短路或:与&&类型。
8. 条件操作符(三目运算符):
boolean表达式 ? 表达式1 : 表达式2;
3. 类型转换的规则
java中的=号赋值操作,需要=号俩边的类型一致,也就是=号右边的数据的类型要和=号左边的变量的类型保持一致,如果不一致,那么就需要做类型的转换,分为隐式转换和显示转换。
(1)隐式转换(自动转换):只要满足条件就可以自动完成类型转换的过程。一般的数据范围较小的自动转换成数据范围比较大的类型(基本类型)。
(2)显示转换(手动转换、强制转换):编译器发现类型无法自动转换的时候,就会编译报错,可以通过在前面加上括号类型(比如:byte b=(byte)a;)进行强转。强转是有一定风险的,例如,浮点型数据,如果强行转换为整型,小数部分就需要全部抹去。显示转换一般的指大类型转换为小类型,但是类型大小其实仅限于形容基本数据类型。在引用数据类型中,子类类型的变量可以自动转换为父类类型,但父类类型的变量要转换为子类,就需要进行强制类型转换。
4. 流程控制
- if语句:
if(布尔表达式){ //... }
//(1)if中的代码是否执行,主要是看这里的布尔表达式的结果,如果是true则执行代码,如果是false则不执行。
if(布尔表达式){ //... }else{ //... }
//(2)if和else形成了一个组合,特点就是如果if中的代码执行了,那么else的代码就不执行,如果if中的代码没执行,那么else中的代码就会执行。也就是if和else这俩个语句中的代码,一定是有唯一的一个执行,而另一个不执行。
if(布尔表达式){ //... }else if(布尔表达式){ //... }else{ //... }
- switch语句:
switch语句和if很类似,都是用来判断值是否相等,但是switch默认只支持byte、short、int、char这四种类型的比较,JDK8中也允许String类型的变量做对比。使用switch来完成的功能,同样可以使用if来完成,但是使用if完成的功能,使用switch不一定能完成。 - for循环:
for(int i=0;i<10;i++){
System.out.println("briup");
}//常用写法
for(;;){
System.out.println("briup");
}//死循环
for(;;) System.out.println("briup");
//如果大括号中只有一句代码,那么可以把大括号省去不写。
- while循环:
int num = -1;
while(num!=5){
num = (int)(Math.random()*10);
System.out.println("num = "+num);
}
//Math.random()是指java.lang包下Math类中的random方法,用于求取随机数,返回值的类型是double类型。
while(true){
//...
}
//死循环
- do-while循环:do-while循环和while很类似,但do-while循环需要先执行循环体中的代码,然后再进行条件判断,是否可以进行一下次循环。特点:无论如何都会先执行一次大括号中的代码。
if语句和switch语句的对比
(1)如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
(2) 其他情况:对区间判断和对结果为boolean类型判断使用if,if的使用范围更广。也就是说,使用switch-case的,都可以改写为if-else。反之不成立。
for循环和while循环的对比
使用for循环,经常是在进入循环之前就已经确定循环次数;while循环更适用于循环的退出条件在循环中是不断变化的,循环次数是不确定的情况。
5. 特殊流程控制语句:break,continue,return
(1)break语句用于终止某个语句块的执行,终止本层循环,作用是退出当前循环或者switch代码。
(2)continue语句只能在循环结构中使用,用于跳出当前循环语句块,终止本次循环,继续下一次循环。
(3)return语句的作用是结束一个方法,不管return位于哪层循环中,return将结束整个方法。
注意:
(1)goto语句也可以跳出循环,goto是无条件转移语句,可以随意的控制转移到程序的任意一条语句上,然后执行它,但这样做很容易让程序出错。
(2)label标签:作用是给循环起名字,和break、continue一起使用,让break、continue对指定的循环起作用。