那些年变量给你挖的坑
数据类型
区分基本类型与引用类型
数据类型分为基本数据类型和引用数据类型。
而String类型属于引用类型。
命名规则
1.Java使用字母数字下划线组合的形式命名变量,但是不可以数字开头,也不可以用关键字命名。
同时,虽然理论可行,也最好不要用 $ 这种符号命名。
2.Java中对变量的命名推荐小驼峰形式,也就是从第二个单词开始每个单词首字母大写,
例如:firstNum
别用拼音当字母用,显得自己很low。
3.Java的“ . ”是不可以用来命名的,因为是引用操作符
包装类型
也就是将基本类型转换为引用类型
简单来说,是把基本类型的首字母大写
int 和 char 有所不同,他们的包装类是:
Integer 和 Character
修饰常量
final修饰的量是常量,无法二次修改
final int a = 10;
a = 20 ; //error
数据类型转换
转换规则
boolean特殊,剩下七个基本类型没法与他互相转换。
小转大,都是自动转换。
大转小,需要强转,并且有可能发生数据丢失,不够精确。
运算也可能导致类型转换。
long与int
此代码进行运算时,虽然使用long类型保存运算的值,但是在运算时,并没有发生类型提升,所以经过运算,int类型溢出,保存的依旧是int的最小值。
int a = Integer.Max_Value;
long b = a+1;// int类型最小值
可以这样调整
int a = Integer.Max_Value;
long b = a+1L;// int类型最大值 + 1
因为L会将 1 转换为 long类型 ,这样在运算的时候相当于会将运算的双方转换成long类型进行运算,这样保存的值是不会发生上面的情况的。
double与int
int num1 = 5;
double num2 = 15;
System.out.println(num2/num1);
三行代码发生两次类型转换,第一次发生在double类型定义时,将15这个整型转换为15.0这个double类型,另外一次转换发生在运算时。
byte与int(难点)
byte为两个字节,所以将int赋值给byte需要强转。
int num1 = 5;
byte num2 = (byte)num1;
而对于数值型和字符型来说,小于四个字节的数据类型在存储时会转为4字节,也就是说,byte在保存时会转为int类型,当把byte类型保存区间之内的整数赋值给byte时,可以直接赋值,超出范围的话就需要强转。
例子:
byte a = 120;//可以运行
byte b = 130;//报错
byte类型会在机器中被提升为int类型
这个时候要是拿a与b相加,则相当于是两个整形相加,依旧需要强转,否则报错,例如:
byte a = 20;
byte b = 30;
byte c = a + b; //报错
当byte类型被final修饰时,则会保存为byte类型。
final byte a = 20;
final byte b = 30;
byte c = a + b; //可运行
short类型也和byte一个意思。
char与int
char类型本质上采用Unicode编码,相当于c语言中的ASII码值
char字符会按照不同的编码规则转换为int储存
char a ='a';
int b = a;// 按Unicode编码将a转换为int
反之需要强转
int a = 97;
char b = (char)a;// 'a'
String与int
将int转为String有两种方法
1.任意String类型加上int
int a = 10
String str = ""+a;
2.使用valueOf方法
int a = 10;
String str = String.valueOf(a);
将String转为int(只能用于数字)
使用int的包装类Integer.parseInt()方法
String str = "123";
int a = Integer.parseInt(str);
Java中的变量未初始化是存在默认值的
只存在于类变量,方法的局部变量没有
运算符的小陷阱
短路操作符
&& ||
这两位是短路操作符,前者前面为假后面的都不管,后者前面为真后面的都不管
异或应用
可以在交换两个值的使用(不推荐)
一个数组中其他数都出现两次,而这个数字只出现一次,可以用全部异或快速找出这个数
位运算小技巧
>>右移一位 原数字 /2
<<左移一位 原数字 *2