Java 3:变量、运算符(优先级)

来源:互联网 发布:做杂志的软件 编辑:程序博客网 时间:2024/05/17 03:10

变量

Java中不区分变量的声明和定义,不可以使用未初始化的变量
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);//左移,左移一位相当于乘以2int 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);//都输出7byte 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 最后0011 1..1 001System.out.println(a>>>1);1 1...1 00 取反:1 0..0 11 加1=-100=-4System.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,+优先级更高

数学运算符的优先级大于逻辑
一元操作符优先级比较大



0 0
原创粉丝点击