基本数据类型的运算规则:适用于除布尔(boolean)类型之外的七种变量。
1. 自动类型提升
当容量小(指该类型变量表示数的大小)的数据类型的变量与容量大的数据类型之间做运算时,结果自动提升为容量大的数据类型。
byte、char、short(三者并列关系,相互做运算时,结果是int型)> int > long > float > double
note:注意byte char short三者之间的运算。
class VariableTest{
public static void main(String[] args){
byte b1 = 2;
int i1 = 129;
//byte b2 = b1 + i1;//编译失败,结果应该为int型
int i2 = b1 + i1;//编译运行成功
long l1 = b1 + i1;
System.out.println(l1);//编译运行成功,long比int范围还大
float f = b1 + i1;
System.out.println(f);//同上
short s1 = 123;
double d1 = s1;
System.out.println(d1);
//编译运行成功。结果:123.0。double的十进制表示形式必须有小数点
//byte、int、char 三者运算,结果一定要是int型
char c1 = 'a';//a=97
int i3 = 10;
int i4 = c1 + i3;
System.out.println(i4);
// 107
short s2 = 10;
char c2 = c1 + s3;//编译不通过,结果应该是int型
byte b2 = 10;
char c3 = c1 + b2; // 编译运行失败,结果为int
short s3 = b2 + s2;// 编译运行失败,结果为int
short s4 = b1 + b2;// 编译运行失败,结果为int
}
}
2.强制类型转换:自动提升运算的逆运算
①需要使用强转符:()
②可能会导致精度损失
class VariableTest{
public static void main(String[] args){
//精度损失1
double d1 = 12.3;
int i1 = int(d1);//把d1强制转换为int型
System.out.println(i1);
// 结果为12,无论小数点后几位,最后只取小数点前的整数
//精度损失2
long l1 = 123;
short s2 = (short)l1;
// 结果123,没有精度损失
//精度损失3
int i2 = 128;
byte b = (byte)i2;
System.out.println(b);
//结果:-128,二进制运算
}
}
3.转换的两种特殊情况
整型常量默认为int型
浮点型常量默认为double型
class VariableTest{
public static void main(String[] args){
// 特例1
long l = 123213;
//long后面没有写'l'或 'L',此时就相当于把应该int型数据赋值给long,即自动提升类型
System.out.println(l);
long l1 = 1238765986473579;
// 编译失败,此时的数超出了int的范围
long l1 = 2123983719649234L;
// 特例2
float f1 = 12.3;//编译失败
// 此时的12.3默认为double型,不能直接转换
float f2 = (float)12.3;//实现需要用强转符
byte b = 12;
byte b1 = b + 12;//默认为int,不能直接赋值给byte型
float f3 = b1 + 12.3;//,默认为double型,不能直接赋值给float型
}
}
4.String类型变量的使用
①String是引用数据类型,即字符串
②String类型变量声明时,用一对双引号""
③String可以和8种数据类型变量做运算,且只能是连接运算:+
④String与任何字类型变量之间的运算,结果还是String类型变量
class String{
public static void main(String[] args){
String s1 = "Hello World";
System.out.println(s1);
//结果:"Hello World"
//String在范围之内可以放入0~多个字符,空格也算字符
String s2 = "a";
String s3 = " ";//空格算字符
//char c = ' ';//空格算字符对char也适用,但char只能放入一个字符
//连接运算
int number = 1001;
String numberStr = "学号:";
String info = numberStr + number;
boolean b1 = true;
String info1 = info + b1;
System.out.println(info1);
//结果:学号:1001
}
}
class String{
public static void main(String[] args){
//练习1
char c = 'a';
int num = 10;
String str = "hello";
System.out.println(c + num + str);
//c+num结果是int型,107,与str结果为String型:107hello
System.out.println(c + str + num);
//c+str结果是String型,ahello,与num结果还是String,结果:ahello10
System.out.println(c + (num + str));
// 先算小括号里的,10hello是String型,然后与c运算,结果是String,a10hello
System.out.println((c + num) + str);
// 前面结果107,后面string型,107hello
System.out.println(str + num + c);
//hello10,室string型,最后还是string,hello10a
//练习2
//实现* *
System.out.println("* *");//利用tab键实现
System.out.println('*' + '\t' + '*');
//'*' + '\t'结果是int型,与'*'运算还是int型,结果93
System.out.println('*' + "\t" + '*');
// '*' + "\t" 结果是string型,\t制表作用,结果* ,与'*'结果还是string,
//最终结果:* *
System.out.println('*' + '\t' + "*");
//'*' + '\t'结果是int型51,与"*"结果是string型,结果:51*
System.out.println('*' + ('\t' + "*");
//('\t' + "*")结果是 *,是String型,与'*'结果是* *
//练习3
//String str1 = 123;//编译不通过,要用双引号
String str1 = 123 + "";
System.out.println(str1);//结果"123"
//int num1 = str1;编译不通过,str不能直接赋值给int型
//int num1 = (int)str1;//"123"
}
}