变量&常量在运算过程中的类型变换机制&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;
三元运算符与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)]