变量
Java中不区分变量的声明和定义,
不可以使用未初始化的变量;
<<左移,左移时右端填充0,不影响符号位
数学运算符的优先级大于逻辑
int i,j=0;//这样只有j赋值,i并没有初始化
final常量
final常量的声明和赋值可以分开,类中的final变量可以在构造函数中定义,但是
不能在构造函数结束后还没有赋值。
fianl只能被赋值一次,习惯上使用全大写
class A{
final int a;
A(){
a=1;
}
}//正确
class A{
final int a=1;
A(){}
}正确
class A{
public static void aaa(){
final int v;
}
}//作为局部变量,正确,只要不操作v,就不报错
class A{
final int a=1;
A(){
a=1;
}
}//错误,一旦定义,不能再对常量赋值
一个类的变量声明为public,则其他类的方法可以直接使用(对象名.变量名,如果是static变量,可以类名.变量名)
运算符
整数除以0,报错
浮点数除以0,得到无穷大(Infinity)或NaN
&&、||采用短路方法,第二个操作数可以不计算
&、| 也可以应用于布尔运算,但是不短路
位运算符
包括:&、|、^、~
^会将符号位也考虑在内
~0b100=-5(取反时包括符号位一起取反,然后当做补码计算真值)
取得一个整数的每一位
public static void main(String[] args) {
int a=0b110011;
for(int i=6;i>0;i--){
System.out.print(judge(a,i));
}
}
public static int judge(int number,int wei){
int s=1<<(wei-1);//左移,左移一位相当于乘以2
int result=(number&s)/s;//需要判别的一位不变,其余置0,再将这一位移到最右位
return result;
}
byte a=(byte) 0b00110011;
byte b=(byte) 0b10000011;
System.out.println(a&b);//符号位也要与一下,或一下
<<左移,左移时右端填充0,不影响符号位
>>右移,用符号位填充高位,移2位就前面加两个符号位
>>>右移,用0填充高位
移位运算右侧参数需要模32(除了long是模64),就是说对于int或short,移位33=移位1
移位运算不能对浮点数进行
byte a=(byte) 0b00001111;//正数,>>和>>>一样
System.out.println(a>>>1);
System.out.println(a>>1);//都输出7
byte a=(byte) 0b10001111;//负数
System.out.println(a>>>1);//2147483591 ??
System.out.println(a>>1);-(0111000+1)=-57
//所以,>>填充符号位反倒好算,>>>怎么弄的
short a= -0b111;//-7(先计算0b111=7,然后加的负号) 补码是:符号:1 中间全1 最后001 1 1..1 001
System.out.println(a>>>1);1 1...1 00 取反:1 0..0 11 加1=-100=-4
System.out.println(a>>1);//2147483644,看来负数不能随便移动
System.out.println(a>>2);//1 1...1 0 取反 1 0...0 1 加1=-10=-2
优先级
a+=b+=c 等价于 a+=(b+=c),因为+=是右结合运算符
[ ] . (方法调用) | |
! ~ ++ -- +-(正负号)()(强转)new | 从右向左 |
* / % | |
+ - | |
<< >> >>> | |
< <= > >= instanceof | |
== != | |
& | |
^ | |
| | |
&& | |
|| | |
?: | 从右向左 |
= += -= *= %=&=^=<<=>>= | 从右向左 |
int a=0b1;
System.out.println(a<<1+1);//输出100=4,+优先级更高
数学运算符的优先级大于逻辑
一元操作符优先级比较大