目录
- 数据类型与变量
- 字面常量
- 数据类型
- 变量
- 语法格式
- 整型变量
- 浮点型变量
- 字符型变量
- 希尔型变量
- 类型转换
- 自动类型转换(隐式)
- 强制类型转换(显式)
- 类型提升
- 不同数据类型的运算
- 小于4字节数据类型的运算
- 字符串类型
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 逻辑与&&
- 逻辑或||
- 逻辑非!
- 短路求值
- 位运算符
- 按位与&
- 按位或 |
- 按位取反 ~
- 按位异或^
- 移位运算
- 条件运算符
数据类型与变量
字面常量
看下面这个栗子,宝子们
System.out.println("cheer up!!!");
输出的"cheer up!!!"就是字面变量
字面常量的值在程序的整个生命周期中是不变的
字面常量的分类:
字符串常量
整形常量
浮点数常量
字符常量
布尔常量:只有两种true和false
空常量
注意:字符串,整形,浮点型,字符型以及布尔型,在java中都被叫作数据类型
数据类型
java中数据类型主要分为两类:基本数据类型和引用数据类型
基本数据类型有四类八种:
- 四类:整型、浮点型、字符型以及布尔型
- 八种:
字节型 byte 1字节
短整型 short 2字节
整型 int 4字节
长整型 long 8字节
单精度浮点数 float 4字节
双精度浮点数 double 8字节
字符型 char 2字节
布尔型 boolean
整型和浮点数都是带符号的
整型默认为int型,浮点型默认为double
变量
语法格式
数据类型 变量名 = 初始值
整型变量
分类:整型变量,长整型变量,短整型变量,字节型变量
注意:长整型初始值后面加L或者l,建议L,避免l长得太像1混淆
浮点型变量
包括单精度浮点型和双精度浮点型
和c语言一样,浮点数使用有限空间表示必然存在误差,浮点数是近似值不是精确值
字符型变量
宝子们目光向这里看
public class test
{
public static void main(String[] args) {
System.out.println("启动");
System.out.println("시동");
System.out.println("Ініціювати");
}
}
计算机里的字符本质是一个整数,c语言使用的ASCII码表示字符,为了扩充更多的字符,采用unicode表示字符,一个字符占用2字节
有兴趣可以查询Java char 型了解一下
希尔型变量
布尔类型用来判断真假
public class test
{
public static void main(String[] args)
{
boolean a = true;
System.out.println(a);
}
}
与c语言不一样,java的布尔类型就是true表示真,false表示假,而并非像c语言当中的非0表示真,0表示假,boolean与int类型不存在转换关系
在java虚拟机规范中并未明确规定boolean占几个字节
类型转换
public class test
{
public static void main(String[] args)
{
int a = 10;
long b = 2;
b = a;
}
}
自动类型转换(隐式)
如上图,数据范围小(int类型)的a赋值给b时,要转化为数据范围更大的long类型,这个过程会自动进行,比如int是个小盆子,long是个水缸(容量比小盆子大),int里的水倒入水缸里肯定不会溢出,但是倒过来就不行了,因为变量的值在编译过程是未知的,可能很大,你把水缸的水倒入盆子里就溢出,造成数据丢失了,但如果你非要把水缸里的水倒进盆子里,就要进行强制类型转换了
强制类型转换(显式)
public class test
{
public static void main(String[] args)
{
int a = 10;
long b = 2;
b = a;
a = (int)b;
}
}
依旧是上图,非要把水缸里的水倒进盆子里的强硬做法,确实霸道(强制类型转换,可能会造成数据丢失)
注意:进行强制类型转换不一定会成功,毫不相干的类型是不能相互转换,比如Boolean与int类型转换
类型提升
不同数据类型的运算
public static void main(String[] args) {
long a = 10;
int b = 10;
int c = a+b;//报错
}
如图,数据类型小的和数据类型大的运算时,a是long类型属于数据类型大的,b是int类型属于数据类型小的,两者在进行运算时,会把小类型(数据类型小的类型,往后不说了)提升为与大类型,也就是把b的int类型提升为long类型,然后与b进行运算,所以结果就是long类型,但是你用int类型来接收就达咩,所以要这样
public static void main(String[] args) {
long a = 10;
int b = 10;
long c = a+b;
}
这样接收值就不会造成数据的丢失,但是你要是非常执着于int类型,对数据不管不顾,就是纯爱int,也可以,要这样
public static void main(String[] args) {
long a = 10;
int b = 10;
int c = (int)(a+b);
}
public static void main(String[] args) {
long a = 10;
int b = 10;
int c = (int)a+b;
}
玩的就是任性
小于4字节数据类型的运算
public static void main(String[] args) {
byte a = 1;
byte b = 1;
byte c = a+b;//报错
}
有宝子就要说呀,为啥么相同类型直接的运算也会报错,这就要提到计算机的读取数据了,通常计算机CPU读取数据会按照4字节为单位来读取,也就是提升为int类型来参与计算
就图而言,a和b因为自己小于4个字节,非常卑微,经过思想教育提升到了4字节来计算,但是你还用个小盆子c来接收int(4字节)这个水缸就不道德了,就会直接报错,但是你非要用水盆子接收也可以,那就强转呗
public static void main(String[] args) {
byte a = 1;
byte b = 1;
byte c = (byte)(a+b);
}
累了,写着一个强转吧
异或这样:
public static void main(String[] args) {
byte a = 1;
byte b = 1;
int c = a+b;
}
小结:
1. 不同类型的数据混合运算, 范围小的会提升成范围大的.
2. 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算.
字符串类型
使用String类定义字符串类型
public static void main(String[] args) {
String a = "hello";
String b = "java";
System.out.println(a+b);
}
有些情况需要字符串和整型数字直接进行转换,后续会补,这里不展开了捏
运算符
算术运算符
- 基本四则运算符:加减乘除模(+ - * / %)
%可以对整型取模.还可以对double类型取模,但是没有意义,一般是对整型取模
- 增量运算符 += -= *= %=
int a = 4;
double b = 5.0;
a += b;
System.out.println(a);
在这里,a和b的类型分别是int和double。在这个过程中,与a相加,得到的结果强转为int类型是9。由于a的类型是int,所以结果也是int类型。如果你想要得到9.0,你需要将a的类型改为double
- 自增/自减运算符 ++ –
public static void main(String[] args) {
int a = 10;
a = a++;
System.out.println(a);
}
与c语言不同,此处java的结果是10,而非11,因为c语言中,a=a++的步骤可以分成a = a;a++;
两步,这样a的值应该是11,但是java结果是10,此处涉及操作表和局部变量表,但是宝子们可以大致这样理解,int temp = a;(保存原始值)
a = a + 1;(执行递增)然后temp的值再赋值给a,所以还是10,
关系运算符
在C语言中,表达式 5 < a < 10 ,C语言中的比较操作符是左关联的,所以这个表达式实际上会被解释为 (5 < a) < 10。由于 (5 < a) 的结果是1(真),因此整个表达式将变成 1 < 10,最终结果是真(1)。
在C语言中,关系运算符的结果是一个整数,要么是1(真),要么是0(假)
然而,在Java中,情况是不同的。Java中的比较运算符是不能被链式使用的,因此 5 < a < 10 这样的表达式在Java中是非法的。
注意:想表达数学表达式5 < a < 10要用(5<a&&a<10)来判断
逻辑运算符
逻辑与&&
语法规则:表达式1 && 表达式2,左右表达式必须是boolean类型的结果。
逻辑或||
语法规则:表达式1 || 表达式2,左右表达式必须是boolean类型的结果。
注意:左右表达式至少有一个为真,则结果为真
逻辑非!
语法规则: !表达式
真变假,假变真
短路求值
public static void main(String[] args) {
System.out.println(2<1&&1/0==0);
System.out.println(2>1||1/0==0);
}
&&运算在第一个错误时,将直接判断错误,不会判断第二个条件,因为不会报错,||则是第一个条件正确后,就直接跳出,不判断第二个条件
public static void main(String[] args) {
System.out.println(2<1&1/0==0);
System.out.println(2>1|1/0==0);
}
如果是&和|就不一样了,他们都会对两个条件进行判断,所以此处会报错
位运算符
按位与&
如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.
按位或 |
如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.
按位取反 ~
如果该位为 0 则转为 1, 如果该位为 1 则转为 0
按位异或^
如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1.
移位运算
- 左移 <<: 最左侧位不要了, 最右侧补 0.
- 右移 >>: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
- 无符号右移 >>>: 最右侧位不要了, 最左侧补 0.
条件运算符
条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;
当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.
也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法