1.常量和变量
1.字面量/常量
字面量就是直接给出的一个值,可以是整数,小数等等,字面量也叫做直接量
注意点:Java中的变量必须赋初值才可以使用,初始化操作在内存中为变量开辟了内存空间!
2.变量
(1)变量的分类
变量根据位置不同,分为成员变量和局部变量,
1.成员变量/字段:直接定义在类的{}中的变量(方法外),
2.局部变量:定义在方法内的变量,除了成员变量都是局部变量
(2)变量的表现形式
变量的表现形式有三种:方法的形参,方法内变量,代码块变量
(3)变量的作用域:
1.成员变量:在所定义的类中起作用
2.局部变量:从定义的位置到所在代码块的}之间
2.数据类型
1.基本类型
Java中的数据类型共有两大类:基本类型和引用类型
基本类型分为数值类型、boolean类型和字符类型
其中数值类型又分为:整数类型、小数类型
其中整数类型包括:byte,short,int,long
其中小数类型包括:float和double类型
注意点:
(1)byte b = 10, 10在 byte类型表示的范围内,编译器将10转换为byte类型
(2)整数类型常用的表示方法有2进制,8进制和16进制
二进制使用0B或0b开头,例如:int a = 0B00001000
八进制使用0开头,例如:int b = 012
十六进制使用0X或0x开头,例如:0X001A
(3)整型字面量默认类型是int类型
(4)小数常量默认是double类型
(5)定义float类型变量时小数常量末尾要加上F/f
(6)无论是float还是double都不能表示精确的小数,因此对于金钱类型的数据使用BigDecimal,他表示任意精度
char类型的使用方式有三种:常用的是符号表示和进制来表示。
符号表示:char a = ‘A’;
十进制表示:char a = 65;
十六进制表示:char a = ‘u\0041’;
(7)定义long类型数据末尾要以L或结尾例如:long l = 120L;
2.引用类型
除了基本数类型,其他所有类型都是引用数据类型,包括类,接口,数组。
String类是最常用的引用类型,任何数据类型和字符串类型拼接都是字符串类型。
3.溢出
当要表示的数据超出了数据类型所能表示的范围,例如:int intMax = 2147483648;就会出现数据溢出的问题。
原因分析:
//定义一个int类型的变量,值为int类型表示的最大值
int intMax = 2147483647;
//intMax+1后再复制给intMax
intMax = intMax + 1;
System.out.println(intMax);
/* 0B01111111_11111111_11111111_11111111
+ 0B00000000_00000000_00000000_00000001
————————————————————————————————————————
0B10000000_00000000_00000000_00000000
转换为十进制为-2147483648
*/
在数据计算过程中很容易出现数据溢出,数据溢出会导致数据出错,但是在编译的时候,编译器只会检查语法是否正确,而不会检查结果是否正确。
注意点:比较两个数大小不能用相减的方式,因为有溢出的可能,所以使用比较运算符>,<
4.类型转换
数据类型转换分为两种:
1.自动类型转换又称为隐式类型转换
2.强制类型转换又称之为强制类型转换(可能会损失精度损失或溢出)
注意点:
(1)byte,short,,char一般不参与转换,转换时需要看类型可以表示的范围
(2)强制类型转换需要在转换的数值前加上要转换的类型例如:int a = (int)10.1;
(3)数据运算时,表达式中如果包含多种数据数据类型,那么数据类型会自动提升,byte,short,char会自动提升为int类型,整个表达式的类型将会提升到表达式中类型最高的类型
(4)String和任意类型使用+链接都会变成String类型
3.运算符
运算符分为五种:算数运算符,赋值运算符,三目运算符,比较运算符、逻辑运算符和位运算符。
1.算数运算符
算数运算符:
算数运算符是用来处理四则运算的符号。
注意点:
(1)System.out.println(9888/ 1000 * 1000);//9000
(2)+加号在处理不同数据类型的运算中得到的值是不同的,
如果是数值和字符相加则得到的是数值类型,如果是两个字符类型相加得到的也是数值类型
String a = 'A';
System.out.println(a + 1);
System.out.println(a + a);
(3)/除号,当两个整数相除得到的结果仍然是整数,小数部分会被忽略。如果当一个正整数除以0.0时或当一个正小数除以0时会引发算术异常。Infinity正无穷大,负数则会得到-Infinaity负无穷大。所有的正无穷大都是相等的,负无穷大也是相等的。0.0/0.0则会得到NaN(Not a Number)
(4)取余%,模数的符号忽略不糊,结果的符号取决被模数
(5)++单纯的对数值操作时是没有区别的:a++和++a都会使a自增1,但是如果是在表达式中,那么表达式里a++是先使用a的值进行运算,然后a自增一,如果是++a那么会使用a自增1后的值进行运算。--也是。
(6)++和--只能操作变量,如果是常量则编译会报错
2.赋值运算符
注意点:
(1)+=中间不能有空格,a += 1不单纯的等价于a = a + 1,而是带有类型转换的
例如:
/*
+=赋值符号:中间不能有空格
自带隐式类型转换
int a = 5;
a += 5;等价于 a = (int)(a + 5);
*/
int a = 10;
a += 5;
System.out.println(a);//15
3.比较运算符
比较运算符用于比较两个变量或常量之间的关系,比较运算符的结果为boolean类型,其操作格式为:boolean result = 表达式A 比较运算符 表达式B 。
4.三目运算符
用法:数据类型 变量名称 = boolean表达式 ? 结果1 : 结果2;
若表达式为真,则返回结果1否则返回2。
5.逻辑运算符
1.逻辑运算符有以下几种:逻辑与&,逻辑或}.逻辑非!,异或^,短路与&&,短路或||
2.逻辑与&,同真为真,一假即假
3.逻辑或|,同假为假,一真即真
4.逻辑非!,取反,非真为假,非假即真
3.异或^, 相同为假,不同为真
4.短路与&&,同时为真才能进行下面的运算,左边的布尔表达式如果为假,则右边表达式不在进行计算,此现象称为短路效应.
5.短路与||,只要一个条件表达式为真就会进行下面的运算,左边的布尔表达式如果为真,则右边表达式不在进行计算
//逻辑与&
System.out.println(true & true);//true
System.out.println(false & true);//false
System.out.println(true & false);//false
System.out.println(false & false);//false
System.out.println("-----华丽的分割线1------");
//逻辑或|
System.out.println(true | true);//true
System.out.println(false | true);//true
System.out.println(true | false);//true
System.out.println(false | false);//false
System.out.println("-----华丽的分割线2------");
//逻辑非!
System.out.println(!true);//false
System.out.println(!false);//true
System.out.println("-----华丽的分割线3------");
//异或^
System.out.println(true ^ true);//false
System.out.println(true ^ false);//true
System.out.println(false ^ true);//true
System.out.println(false ^ false);//false
System.out.println("-----华丽的分割线4------");
//短路与
System.out.println(true && false);//false
System.out.println(true && true);//true
System.out.println(false && true);//false
System.out.println(false && false);//false
System.out.println("-----------------------");
//短路证明
//System.out.println(true && (1 / 0 == 0));//异常
System.out.println(false && (1 / 0 == 0)); //false
System.out.println("-----华丽的分割线5------");
//短路或||
System.out.println(true || false);//true
System.out.println(true || true);//true
System.out.println(false || true);//true
System.out.println(false || false);//false
//短路证明
System.out.println(true || (1 / 0 == 0));//true
//System.out.println(false || (1 / 0 == 0)); //异常
6.位运算符
位运算符与逻辑运算符符号相同但表达的含义不同,位运算符两边都是常量或变量,而逻辑运算符两边都是布尔表达式。
1.按位与:同真为真,
2.按位或:同假为假,
3.异或:相同为真,不同为假
//按位与&
System.out.println(5 & 3);//1
/*
十进制5转二进制:00000101
十进制3转二进制:00000011
----------------------------
与结果 00000001 转十进制得1
*/
//按位或|
System.out.println(5 | 3);//7
/*
十进制5转二进制:00000101
十进制3转二进制:00000011
----------------------------
或结果 00000111 十进制7
*/
//异或^
System.out.println(5 ^ 3);//6
/*
十进制5转二进制:00000101
十进制3转二进制:00000011
----------------------------
异或结果 00000110 十进制6
*/
4.取反:计算出常量对应的二进制的补码 按位取反后,0->1,1->0,再求取反的值的补码,再转换为二进制即为原值的取反.
//正数取反~
System.out.println(~5);//-6
/*
十进制5转int类型的二进制的为
原码 00000000_00000000_00000000_000000101
取反 11111111_11111111_11111111_111111010
反码 10000000_00000000_00000000_000000101
补码 10000000_00000000_00000000_000000110 十进制-6
*/
//负数取反~
System.out.println(~-5);//4
/*
十进制-5转int类型的二进制的为
原码 10000000_00000000_00000000_000000101
反码 11111111_11111111_11111111_111111010
补码 11111111_11111111_11111111_111111011
取反 00000000_00000000_00000000_000000100 十进制4
*/
7.移位运算
1.左移<<,将操作数的二进制左移指定为数,左移之后的空位用0补齐
//正数左移<<
System.out.println(3 << 2);//12
/*
0000_0011
左移两为0000_0011_00 十进制为12
*/
//负数左移
System.out.println(-3 << 2);//-12
/*
-3补码 1111_1101
左移两为1111_1101_00
反码 1000_0010_11
补码 1000_0011_10
*/
2.右移>>,将操作数的二进制右移指定为数,右移之后的空位如果是正数用0补齐,如果是负数用1补齐,求反码补码,操作,再求反码补码
//正数右移>>
System.out.println(8 >> 2);//2
/*
0000_1000
右移两为0000_0010 十进制为2
*/
//负数右移
System.out.println(-8 >> 2);//-2
/*
-8补码 1111_1000
右移两位111111_10
反码 100000_01
补码 100000_10
*/
3.无符号右移>>>,将操作数的二进制右移指定为数,右移之后的空位用0补齐
//正数无符号右移>>>
System.out.println(5 >>> 2);//1
/*
00000000_00000000_00000000_00000101
右移两位00000000_00000000_00000000_00000001 十进制1
*/
//负数无符号右移>>>
System.out.println(-5 >>> 2);//1073741822
/*
-5 二进制补码 11111111_11111111_11111111_11111011
右移两位 00111111_11111111_11111111_11111110 十进制1073741822
*/