Java基础笔记4(变量常量、命名规范、运算符)

变量

作用域

  • 类变量(静态变量)
    • 在方法外
    • 从属类
    • 无需初始化,有默认值
  • 实例变量(对象变量)
    • 在方法外
    • 从属对象
    • 无需初始化,有默认值
  • 局部变量
    • 在方法内
    • 只在方法内有效
    • 必须声明和初始化
1
2
3
4
5
6
7
8
public class Test{
static int a = 0; //类变量
int b = 0; //实例变量

public void method(){
int c = 0; //局部变量
}
}

类变量和实例变量的区别

类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果。

实例变量属对象私有,某一个对象将其值改变,不影响其他对象。

常量

初始化后不能改变值

常量一般用大写字符

1
final double PI = 3.14;

命名规范

  • 变量、方法、类名:见名知意
  • 类成员变量:小驼峰(lastName)
  • 局部变量:小驼峰
  • 常量:大写(MAX_VALUE)
  • 类名:大驼峰
  • 方法名:小驼峰

运算符

  • 算术运算符:+,-,*,/,%,++,—
  • 赋值运算符:=
  • 关系运算符:>,<,>=,<=,==,!=,instanceof(测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。)
  • 逻辑运算符:&&,||,!
  • 位运算符:&,|,^,~,>>,<<,>>>
  • 条件运算符:? :

  • 扩展赋值运算符:+=,-=,*=,/=

1
2
3
4
5
6
7
8
9
10
long a = 2333333333333L;
int b = 2333;
short c = 233;
byte d = 23;

System.out.println(a+b+c+d); //long
System.out.println(b+c+d); //int
System.out.println(c+d); //int
//自动升为混合运算类型中最高类型
//整数类型操作中,操作数中有long,结果也为long,操作数中没有long时,结果为int
1
2
3
byte b = 3;
b = b + 2;//编译失败,b+2运算中b会被提升为int类型,是结果是int型,从int转为byte需要强制类型转换
b=(byte)(b+2);//编译通过,手动将运算结果进行强制类型转换
1
2
3
short s = 4;
s = s + 5; //编译失败,因为s会被提升为int类型,运算后的结果还是int类型,无法给short类型赋值
s += 5; //编译通过,因为+=运算符在给s赋值时,自动完成了强转操作

一元运算符 自增自减

1
2
3
4
5
6
7
int a = 0;
int b = a++; //先赋值,再自增
int c = ++a; //先自增,再赋值

System.out.println(a); //2
System.out.println(b); //0
System.out.println(c); //2

幂运算

1
Math.pow(2,3);  //2的3次方,使用Math工具类操作

逻辑运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//与(&&\&) 两边表达式只有全为真时,运算结果才为真  
//或(||\|) 两边表达式只要一个为真,运算结果就为真
//非(!) 真变假,假变真
boolean a = true;
boolean b = false;

System.out.println(!a); //false
System.out.println(a&&b); //false
System.out.println(a||b); //true
System.out.println(a&b); //false
System.out.println(a|b); //true

//&&与&、||与|的区别
//&&短路功能,当判断左边表达式为假时,直接返回假,不再判断右边表达式
//||短路功能,当判断左边表达式为真时,直接返回真,不再判断右边表达式
//&和|没有短路功能,左右表达式都需要判断
//当左右表达式不为boolean类型时,&和|表示按位操作
System.out.println(0b1010&0b0101); //0
System.out.println(0b1010|0b0101); //15

位运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//与运算,同一位都是1结果为1,否则为0
System.out.println(0b1010&0b1100); //0b1000
//或运算,同一位都是0结果为0,否则为1
System.out.println(0b1010|0b1100); //0b1110
//异或运算,同一位相同为0,不同为1
System.out.println(0b1010^0b1100); //0b0110
//取反运算,按位取反
System.out.println(~0b1010); //0b0101

//左移,将二进制数左移n位,每移一位相当于*2
System.out.println(3<<2); //12
//0b11
//0b1100

//右移,将二进制数右移n位,每移一位相当于/2
System.out.println(9>>2); //2
//0b1001
//0b10

关于位运算的问题

问题:为什么java中按位取反~5结果为-6。即 System.out.println(~5);的输出结果为-6

1
2
3
4
5
6
7
在计算机中,负数以其绝对值的补码形式表达。
1个字节,只能表示256个数。
因为有符号所以我们就把它表示为:-128~+127。用最高位表示符号位(0表示正数,1表示负数),剩下的7位用来储存数的绝对值的话,能表示2^7个数的绝对值,因为分正负两种情况,2^7*2一共还是256个数。
0在计算机中储存为00000000
00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码。
10000001到11111111依次表示-127到-1。10000000表示最小的负数-128。
计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加1。
  • 5是int类型,占4字节,32位
    • 原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
      00000000 00000000 00000000 00000101 是 5的原码。
    • 反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。11111111 11111111 11111111 11111010 是5的反码
    • 补码:反码加1称为补码。
      11111111 11111111 11111111 11111011 是5的补码
  • -6是int类型,占4字节,32位。因为负数以其绝对值的补码形式表达,所以-6在计算机中以6的补码表示
    • 6的原码:00000000 00000000 00000000 00000110
    • 6的反码:11111111 11111111 11111111 11111001
    • 6的补码:11111111 11111111 11111111 11111010

因为0的原码、补码都是0;正数的原码、补码可以特殊理解为相同;负数的补码是它的反码加1。

5在计算机中用原码表示:00000000 00000000 00000000 00000101

按位取反~5后:11111111 11111111 11111111 11111010,符号位为1,是负数,且该值与6的补码相同,负数以其绝对值的补码形式表达,因此计算机输出-6

字符串连接

1
2
3
4
5
6
7
8
int a = 10;
int b = 20;
System.out.println(a+b); //30(int)
System.out.println(""+a+b); //1020(String)
System.out.println(a+b+""); //30(String)
System.out.println(a+b+""+a); //3010(String)
//+运算中碰到String类型时,会将其他操作数转换为String类型并进行字符串连接
//没有遇到String类型之前,操作数按原有类型运算,遇到String类型后再将之前的运算结果转化为字符串进行拼接

三元运算符

1
2
3
4
5
6
7
x?y:z
//等价于
if(X){
y;
}else{
z;
}