基本数据类型的运算规则:适用于除布尔(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"

		
    }
}