第二天,字面值常量、基本数据类型、运算符。
先补充一点关于进制的问题
public static void main(String[] args) {
System.out.println(0b100);
//0b 表示二进制
System.out.println(0100);
//0表示八进制
System.out.println(100);
//没有标记 就是十进制
System.out.println(0x100);
//0x表示十六进制
System.out.println("0x100");
//""中是字符串 直接打印
System.out.println("Hello World!");
}
}
常量
啥叫常量呢?就是在执行一段程序过程中,值不发生变化的量。常量分为字面值常量和自定义常量。字面值常量包括:整数常量、小数常量、字符常量、字符串常量、布尔常量、空常量。整数常量和小数常量对应的就是指整数和小数。***字符常量指单引号括起来的单个数字、字母或者符号。***字符串常量指双引号括起来的内容。布尔常量包括true、false。空常量为null,它不能进行输出。
public static void main(String[] args){
//输出字面值常量
System.out.println(1000);
System.out.println(3.14);
System.out.println('A');
System.out.println('1');
//''中是字符常量,能是单个。 ""字符串常量
System.out.println("1");
System.out.println(true);
System.out.println(false);
System.out.println("Hello World!");
}
变量
何为变量?
即在一段程序中,值发生变化的量。定义变量其实就是内存中开辟一小块区域。定义变量的目的是为了不断的存放同一类型的变量并可以重复使用。定义变量的格式: 数据类型 变量名=变量值;
为什么引入数据类型呢?因为定义一个变量就是内存中开辟一点空间,那么我们每次开辟多大的空间呢,为了解决这个问题,Java提供了不同的数据类型,针对不同的数据类型,在内存中分配了不同的内存空间。数据类型又分为:基本数据类型和引用数据类型。
基本数据类型包括四类八种,它的详细信息见下表:
数据类型 | 字符 | 字节数 | 范围 |
---|---|---|---|
整数型 | byte | 1(8bit) | -128~127 |
整数型 | short | 2(16bit) | -2^15 ~ 2^15-1 |
整数型 | int | 4(32bit) | -2^31 ~ 2^31-1 |
整数型 | long | 8(64bit) | -2^63 ~2^63-1 |
浮点型 | float | 4(32bit) | \ |
浮点型 | double | 8(64bit) | \ |
字符型 | char | 2(16bit) | 0~2^16-1=65535 |
布尔型 | boolean | 1(8bit) | \ |
使用变量的注意事项
- 变量命名一小写字母开头。
- 变量必须先赋值后使用。
- 一个作用域内不能命名同一名称的变量。
自动类型提升
byte short char 在参与数学运算时,会自动提升为int类型,如果还有long ,float double 参与运算
则会相应的提升为 long float double ,布尔类型不参与数学运算,byte short char 之间不发生转换。
强制类型提升
强制将一个数据,转换成我们要的数据类型,强制类型转换,有可能会发生精度损失的问题。
格式:目标数据类型 变量名=(目标数据类型)(被转换的数据);
byte a=10;
byte b=20;
short r=a+b;
//报错,byte,short,char运算时会转换为int类型,byte(2字节)不能装下int(4字节)。
a=a+1;
//报错,
byte c=1;
short d=127;
short e=(short)(a+b);
//运算时虽然强制转换为int类型,但强制转换为short类型,128在short数据范围内,不会发生精度损失。
byte r=r+1;
// 报错,byte不能装下int。
byte rr=3+4;
// 不会报错,常量优化机制,多个常量相加时,它会先算出结果,看结果是否在数据类型范围内,在就不报错,否则就报错。
char ch='a';
char ch2=ch+1;
//报错,int转换为char可能会发生精度损失。
int r=ch+1;
//不报错,输出98.ASCII码表中:'a' 97,'A' 65,'0' 48.
运算符
运算符:对常量和变量进行操作的符号称为运算符。
运算符的分类:
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 三目运算符
算术运算符有:+,-,,/,%,–,++
/:整数相除只能取整数,要得到小数需要用浮点数
++:自加,对原有的数据进行+1,
–:自减,对原有数据进行-1
–,++运算符单独使用时放在操作数前面和后面效果一样。参与运算时使用,++,–在操作数前面,先自加或自减,再参与运算;放在操作数后面,先参与运算,再自加或者自减。例:
int a=3;
a++;
//此处a为4
++a;
//此处a为5
int num=a++;
//num=5,a=6
int num2=++a;
//num2=6,a=6
赋值运算符:=,+=,-,=,*=,/=,%=
比较运算符:==,!=,<,>,<=,>=,比较运算符结果为boolean型
逻辑运算符:&(并且),|(或者),!(非),^(异或),&&(短路与),||(短路或)
逻辑运算符结果是boolean型。&,|,&&,||在运算结果上没有区别,区别在运算效率上,&,运算符两端都会计算,而&&,||只要左端能得出计算结果,则不会执行右端。
int a=1;
int b=2;
boolean flag =a==2&&(a>b);
//&&左端已经为false,右端不会再判断。
三元运算符
语法:表达式?结果1:结果2
案例:求两个数最大值
int a=1;
int b=2;
int max=a>b?a:b;
位运算符
位运算符:&(与),|(或),^(异或) , ~(按位取反) , <<(左移) ,>>(右移) ,>>>(无符号右移)
&:有0则0
|:有1则1
^:相同则0,不同则1。 ^ 特点 一个数被另外一个数位异或两次该数不变
~:按位取反 0变1 1变0
<< : 把<<左边的数据乘以2的移动次幂 例如 10<<3 结果 10*2^3=80
int flag =1&2; //0
int flag2=1|2; //3
int flag3=~3; //4
int num =3>>2; //3/2^2=0
int num2 =3<<2; //3*2^2=12
位运算是直接对二进制补码进行运算,效率高。