Day03JavaSE——变量&常量在运算过程中的类型变换机制&IDEA的安装&运算符

变量&常量在运算过程中的类型变换机制&IDEA的安装&运算符

变量自动转换机制

变量即在程序运行过程中可以变化的量,变量的数据类型分为基本数据和引用数据

基本数据分为四类八种

整型

byte(1个字节)

short(2个字节)

int(4个字节)

long(8个字节)

浮点型

float(4个字节)

double(8个字节)

布尔型

boolean

字符型

char(2个字节)

因为变量的本质是在存储空间里面开辟的有限的空间,则在进行程序的算术运算中变量会遵循自动类型提升机制,即在程序中进行运算的时候,若参与运算的所有数据类型大小没有超过int型数据的大小(4个字节),所有的变量数据会自动转换成int型再进行运算,即若代码是r=a+b;

class DataDemo{
	public static void main(String[] args){
		byte	a=10;
		byte	b=20;
		//自动类型提升机制:当byte short char 在参与运算时,会自动提升为int类型。如果还有long float double 类型参与运算
		//则会响应提升为long float double 类型,byte short char之间不参与转换 boolean不参与数学运算
		//int4个字节 byte 1个字节
		//
		//
		//byte	r=a+b;			报错运算后r为int类型,byte装不下故会报错
		int		r=a+b;
		
		
		System.out.println(r);
		
	}
}

常量优化机制

在Java程序中使用常量进行算术运算时,程序运行会先把结果计算出来,再看这个计算结果是否在输出的变量的数据类型范围内,若在则可以正常运行,不在则无法正常运行

class DataDemo4{
	public static void main(String[] args){
		byte	a=10;
        byte	b=127;
		//byte	result1=a+b;		//运行后这句会报错
        //Demo.java:5: 错误: 不兼容的类型: 从int转换到byte可能会有损失
        //这是因为计算出来的结果result的值为137,这超过了byte型数据的范围
        //所以需要用int型数据去输出变量,或者用强制类型转换强制输出byte型
        //但是用byte型强制输出数据会导致数据溢出,溢出后结果为-119
        //溢出计算方法:(+10)+(127)
        /*+10的原反补一样都是	0 000 1010
        +127的原反补也都一样时  0 111 1111
        按位相加结果为			 1 000 1001(补码),由于计算出的数最高位是1,
        则这个数是负数,负数的原反补需要计算,将结果的补码换算成原码,即为结果的
        二进制表示,换算成十进制结果即为-119*/		
        
        int	result1=a+b;
        int result2=(byte)(a+b);
		
		System.out.println(result1);
        System.out.println(result2);
		
	}
}

程序输出结果如下图

强制类型转换

强制类型转换的格式

目标数据类型 变量名=(目标数据类型)(被转换数据类型);

强制类型转换可能会引起数据的损失,尽量不要使用

编码问题

键盘上的字符被编在ASCII(美国信息交换标准代码)码表中

而中文字符则被编在了Unicode码表中,在Unicode中GBK编码每个中文字符占用2个字节,而UFT-8编码每个中文字符占用3个字节

所以char型数据在使用GBK编码时可以放进一个汉字,而使用UFT-8编码char型就不能放下一个汉字。

运算符

对常量和变量进行操作的符号

算数运算符[+, -, *, / ,%,++,–]

赋值运算符

比较运算符

逻辑运算符

位运算符

三目运算符

算数运算符[+, -, *, / ,%,++,–]

public class Arith {
    public static void main(String[] args) {
        //多行注释的快捷键ctrl+shift+/
        //单行注释ctrl+/
        /*算数运算符+,-,*,/,%,++,--*/
        System.out.println("-----------以下是加法运算符------------------");

        //加法运算符
        /*+有两个作用
         * 第一数学加号的作用
         * 第二起到连接符的作用
         * 当加号两边任意一边有字符串,则加号起到连接符的作用
         * 这时加号会把左右两边连接起来形成一个新的字符串*/
        System.out.println(2+3);                //5
        System.out.println(2+'3');              //53
        System.out.println('2'+'2');            //100
        System.out.println(2+"刘");             //2刘
        System.out.println(50+"100"+50);        //5010050
        System.out.println("50"+"50");          //5050
        System.out.println(20+30+"50");         //5050

        //practise1
        System.out.println("hello"+'a'+1);      //helloa1
        System.out.println('a'+1+"hello");      //98hello
        System.out.println("5+5="+5+5);         //5+5=55
        System.out.println(5+5+"=5+5");         //10=5+5
        System.out.println("-------------以下是/ 和 %运算符-------------");

        /*/运算符在程序中代表了取整的运算,%代表了取余的运算*/
        int     g=10;
        int     h=3;
        int     r1=g/h;             //因为r1是int数据类型
        int     r2=g%h;
        //取整运算,输出为3
        System.out.println("结果r1="+r1);
        //取余运算结果为1
        System.out.println("结果r2="+r2);

        /*对比r1、r2和r3的结果会发现,同样数值的除法运算,得出的结果不一样
        原因是h数据的数据类型不一样,前面讲过变量的自动提升机制
        当变量进行算术运算时,参与运算的所有数据结构:
        若只有byte,int,short型则计算的时输出结果自动提升为int型
        若有long,float,double型则输出结果自动提升为这3型数据
        简单来说就是100ML的果汁与300ML的水要混合
        必须在400ML以上的容器里混合,放在300ML和100ML里面混和结果都会溢出*/
        int     g3=10;
        double  h3=3;
        double  r3=g3/h3;
        /*此处程序会报错   Error:(54, 22) java: 不兼容的类型: 从double转换到int可能会有损失
        int     r4=g3/h3; */
        int    r5=(int)(g3/h3);
        System.out.println("结果r3="+r3);
        //System.out.println("结果r4="+r4);
        System.out.println("结果r5="+r5);

        System.out.println("---------以下是++和--运算符-----------");
        //++自增1
        //--自减1
        //++和--在单独使用时没有任何区别
        int i=1;
        i++;
        ++i;
        i--;
        --i;
        System.out.println("i="+i);

        /*但是要是混合使用时i++与++i,i--和--i是不同的
        在前先运算,在后后运算
        ++在前 先运算 后赋值
        ++在后 先赋值 后运算*/
        int j=1;
        int p1=++j;                   //j=j+1 --> p=j
        System.out.println("j="+j);
        System.out.println("p1="+p1);
        int p2=j++;                   //p2=j --> j=j+1
        int p3=j;
        System.out.println("p2="+p2);
        System.out.println("p3="+p3);

        System.out.println("-----------以下是Practice-----------------");
        System.out.println("----------------案例A---------------------");
        /*A:案例演示
	    请分别计算出a,b,c的值?
	    int a = 10;
	    int b = 10;
	    int c = 10;
	    a = b++;                  //a=10,b=b+1=11
	    c = --a;                  //c=a-1=9,a=9
	    b = ++a;                  //b=a+1=10,a=a+1=10
	    a = c--;                  //a=9,c=c-1=8
	    结果:a=9,b=10,c=8*/
        int a=10;
        int b=10;
        int c=10;
        a=b++;
        c=--a;
        b=++a;
        a=c--;
        System.out.println("a="+a);
        System.out.println("b="+b);
        System.out.println("c="+c);
        System.out.println("---------------案例B-----------------");
        /*B:案例演示
	    请分别计算出x,y的值?
	    int x = 4;
	    int y = (x++) + (++x) + (x*10);
	    y=4+6+10=70,x=6*/
        int x=4;
        int y=(x++)+(++x)+(x*10);
        System.out.println("x="+x);
        System.out.println("y="+y);
    }
}

赋值运算符(=,+=,-=,*=,/=,%=)

  • 注意事项

a:基本的赋值运算符:=
把=右边的数据赋值给左边。

b:扩展的赋值运算符:+=,-=,*=,/=,%=
+= 把左边和右边做加法,然后赋值给左边。
c: 赋值运算符要求左边的数据必须是一个变量

public class Eval {
    public static void main(String[] args) {
        /*赋值运算符:=,+=,-=,*=,/=,%=*/
        //把右边的整数常量赋值给左边的int类型的变量
        byte t=10;
        //t = t+20;   这句会报错,原因是不兼容的类型: 从int转换到byte可能会有损失
        //t定义为byte型,但是运算完等号左边是int型,int型不能直接赋值给byte型
        //+=号会自动实现强制类型转换
       t+=20;
        System.out.println("t="+t);
        System.out.println("-----------以下是面试例题----------------");
        System.out.println("---    --------案例------------- ------");
        /*A:案例演示
	    面试题:看下面的程序是否有问题,如果有问题,请指出并说明理由。
	    short s=1;          此处s是short型数据
	    s = s+1;            由于数据类型自动提升机制,此处等号右边s+1为int型数据
	                        而左边的t是short型数据,所以这里会报错
	                        
	    short s=1;          这句话不会报错,因为赋值语句衍生出来的这几个赋值语句会自动完成强制类型转换
	    s+=1;*/
    }
}

比较运算符[== ,!= , < , > , <= , >= , instanceof(后面讲解)]

关系运算符的运行结果是布尔类型,只有两个结果

public class Compare {
    public static void main(String[] args) {
        // 比较运算符
        //比较运算符的结果是布尔类型
        int     a=10;
        int     b=20;
        boolean result=a<b;
        System.out.println("result="+result);

        //==与=的区别
        //==是等于,=是赋值
    }
}
逻辑运算符
public static void main(String[] args) {
        //ctrl+alt+L    格式化代码,把代码排列整齐
        /*逻辑运算符(&,|,!,^(异或),&&(短路与),||(短路或))
         * 逻辑运算符的结果也是布尔类型*/
        // * &:运算符两端只要有一个一个结果为false,结果为false

        System.out.println("----------------以下是与运算符--------------");
        int a = 20;
        int b = 10;
        boolean flag = a > b & a != b;
        System.out.println("flag=" + flag);
        flag = a < 100 & b > 100;
        System.out.println("flag=" + flag);
        flag = a > 100 & b < 100;
        System.out.println("flag=" + flag);
        flag = a == 100 & b == 100;
        System.out.println("flag=" + flag);

        System.out.println("----------------以下是或运算符--------------");
        //|:或运算符只要运算符两边有一个时true,则输出结果为true
        flag = a > b | a != b;
        System.out.println("flag=" + flag);
        flag = a < 100 | b > 100;
        System.out.println("flag=" + flag);
        flag = a > 100 | b < 100;
        System.out.println("flag=" + flag);
        flag = a == 100 | b == 100;
        System.out.println("flag=" + flag);

        System.out.println("----------------以下是非运算符--------------");
        //!:非运算符0变1,1变0
        flag = a == 100 | b == 100;
        System.out.println("flag=" + !(flag));

        System.out.println("----------------以下是异或运算符--------------");
        //^:异或运算符,相同为false,相异为true
        System.out.println(true ^ true);
        System.out.println(false ^ false);
        System.out.println(false ^ true);

        System.out.println("----------------以下是短路与运算符--------------");
        /*短路运算符与非短路运算符的区别
         * 当使用&&短路运算符时
         * 当第一个表达式为false时则不去判断第二个表达式,直接输出结果
         * 从而节省计算机的判断次数*/
        int c = 20;
        int d = 20;
        flag = c < d & d++ > c;
        System.out.println("flag=" + flag);
        System.out.println("d=" + d);
        flag = c > d && d++ > c;
        System.out.println("flag=" + flag);
        System.out.println("d=" + d);
        flag = c < d && d++ > c;
        System.out.println("flag=" + flag);
        System.out.println("d=" + d);

        System.out.println("----------------以下是短路或运算符--------------");
        /*当使用||短路运算符时
         * 当第一个表达式为true时则不去判断第二个表达式,直接输出结果
         * 从而节省计算机的判断次数*/
        c = 20;
        d = 20;
        flag = c < d | d++ > c;
        System.out.println("flag=" + flag);
        System.out.println("d=" + d);
        flag = c > d || d++ > c;
        System.out.println("flag=" + flag);
        System.out.println("d=" + d);
        flag = c < d || d++ > c;
        System.out.println("flag=" + flag);
        System.out.println("d=" + d);


    }
}

在学习逻辑运算符时主要要区分&,&&以及|,||这两对运算符的区别

位运算符

 public static void main(String[] args) {
        /*位运算符(&,|,^,~(按位取反),<<(左移),>>(右移),>>>(无符号右移))
        是对二进制补码进行运算的
        |,&,^两边要是布尔类型,那就是逻辑运算符*/

        System.out.println("-------------以下是与运算符——————————————");
        //&:有0则0

        System.out.println("-------------以下是或运算符——————————————");
        //有1则1


        System.out.println("-------------以下是异或运算符——————————————");
        //相同则0,不同则1



        System.out.println("-------------以下是按位取反运算符——————————————");
        //0变1,1变0,符号位也变

        System.out.println("-------------以下是左移运算符——————————————");
        //空位补0,被移除的高位丢弃

        System.out.println("-------------以下是右移运算符——————————————");
        //正数高位补0,负数高位补1

        System.out.println("----------以下是无符号右移运算符—————---————");
        //最高位补0,无论正负、

        System.out.println("-------------总结特点——————————————");
        //位运算符总结特点
        //^位异或,一个数被另一个数位异或两次,结果不变
        System.out.println(3 ^ 8 ^ 8);      //结果输出为3
        System.out.println(5 ^ 6 ^ 5);      //6

        /*结论
        * <<:左边的数据乘以2的移动次幂
        * >>:把>>左边的数据除以2的移动次幂
        * 位运算符的运算效率高*/
    }
}

针对右移运算符的特点说明:右移运算符在进行计算时,若最高位是0,右移空位补0,若最高位是1,右移最高位补1

三元运算符

三元运算符使用的格式:条件试?值1:值2;

Created with Raphaël 2.2.0 Start verification Yes or No? 条件a End 条件b yes no
三元运算符与if-else语句的区别

能用三元表达式写出来的都能用if-else写出来,但是能用if-else写出来的不一定能用三元表达式写出来

从键盘录入步骤

public class keyboardinput {
    public static void main(String[] args) {
        //键盘录入,从键盘上录入用户信息
        //1、导入包:
        //2、创建scanner对象
        //alt+enter 万能纠错键,会帮你自动补全代码
        //ctrl+alt+V 自动补全
         Scanner sc=new Scanner(System.in);
        //3、提示用户
        System.out.println("请输入第一个整数");
        //4、获取用户输入整数
            int i1 = sc.nextInt();
            System.out.println("请输入第二个整数");
            int i2 = sc.nextInt();
            if(i1==i2){
                System.out.println("值相等");
            }else{
                System.out.println("值不等");
            }
    }
}

IDEA的安装

https://www.jetbrains.com/idea/download/#section=windows 进入官网 找到下载页面

  • 安装


.nextInt();
if(i1==i2){
System.out.println(“值相等”);
}else{
System.out.println(“值不等”);
}
}
}


## IDEA的安装

https://www.jetbrains.com/idea/download/#section=windows 进入官网 找到下载页面

- #### 安装

[外链图片转存中...(img-uLCxf65p-1586096990044)]

[外链图片转存中...(img-e6ZgqMao-1586096990045)]

[外链图片转存中...(img-lmsskADt-1586096990045)]

[外链图片转存中...(img-xyyPFV0i-1586096990045)]

[外链图片转存中...(img-jWfQw76t-1586096990046)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值