1 关键字
关键字:被Java语言赋予了特殊含义,用作专门用途的字符串(或单词)。如class、public、static、void等,这些单词都被Java定义好了,称为关键字。
- 特点:关键字都是小写字母;
- 官方地址:Java Language Keywords (The Java™ Tutorials > Learning the Java Language > Language Basics)https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
2 标识符
标识符:Java中变量、方法、类等要素命名时使用的字符序列,称为标识符。简单的说凡是可以自己命名的地方法都是标识符,如类名、方法名、变量名等等。
标识符命名规则:必须遵守,不遵守会报错
- 由26个英文字母大小写,0-9,_或$组成;
- 不能包含空格,不能以数字开头;
- 不能与关键字或保留字相同;
- 严格区分大小写,长度不限;
- 定义标识符时要“见名知意”。
标识符命名规范:建议遵守,不遵守也可以,但遵守了显得更专业
- 包名:多单词组成时所有字母都小写:xxxyyyzzz。如java.lang
- 类名、接口名:多单词组成时所有字母的首字母大写:XxxYyyZzz。如Hello
- 变量名、方法名:多单词组成时第一个单子首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz。如bookName
- 常量名:所有字母都大写,多单词组成时每个单词之间用下划线链接:XXX_YYY_ZZZ。如MAX_VALUE
3 变量
变量:内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化。
- 变量三要素:数据类型、变量名、存储的值
- Java中变量声明的格式:数据类型 变量名 = 变量值;
- 变量的作用:在内存中保存数据
- 变量都有作用域,只在作用域内生效,同一作用域内变量不能重名
class VariableTest{
public static void main(String[] args) {
//变量的声明
//分步式:先声明,再初始化
char gender;
gender = '男';
//一步式:声明同时初始化
int age = 18;
//变量的使用,直接调用变量名
System.out.println(gender+""+age);
}
}
4 数据类型
表数范围计算公式
整型
- 整数类型包括byte、short、int、long;
- 注意:
1. 声明整型变量时遵守保小不保大,数据类型能小则小;
2. 整型常量默认为int占用空间更小,声明long型常量须后加l或L;
- 各整数类型有固定的表数范围和占用存储空间:
浮点型
- 整数类型包括float、double;
- float:单精度,尾数可以精确到7位有效数字;
- double:双精度,精度是float的两倍;
- 注意: 浮点型型常量默认为double精度更高,声明float型常量须后加f或F;
- 浮点型表数范围和占用空间:
- 浮点型常量的两种表示形式:
- 十进制形式。如5.12 512.0f .512(必须有小数点)
- 科学计数法形式。如5.12e2 512E2 100E-2
关于浮点型精度的说明:
- 不是所有小数都可以精确的使用二进制浮点数表示。二进制浮点不能精确的表示0.1、0.01、0.001这样10的负次幂。
- 浮点型float、double的数据不适合在不容许舍入误差的金融计算领域,如果需要精确数字计算或保留指定位数的精度,需要使用BigDecimal类。
- 浮点在机器中存放的形式,浮点数=符号位+指数位+尾数位。浮点数float超出存储空间的值会被丢掉
- 演示:
// 1.float精度不高,超出存储范围的部分会被丢掉
float num1 = 2.1234567851f;
double num2 = 2.1234567851f;
System.out.println("float=" + num1 + "\ndouble=" + num2);
// 2.二进制浮点数不能准确的表示0.1、0.01、0.001等10的负次幂的数
System.out.println(0.1 + 0.2);
// 3.浮点型使用陷阱
double num3= 2.7;
double num4=8.1/3;
System.out.println(num3 == num4);
float f1 = 123123123f;
float f2 = f1+1;
System.out.println(f1);
System.out.println(f2);
System.out.println(f1== f2);
应用案例:
案例1:定义圆周率并赋值为3.14,现在3个圆的半径分别为1.2、2.5、6,求他们的面积
/**
* @author shbzhao
* @version 1.0
* @date 2023/8/26-0:34
* @description 定义圆周率并赋值为3.14,现在3个圆的半径分别为1.2、2.5、6,求他们的面积
*/
public class FloatDoubleExer {
public static void main(String[] args) {
double PI = 3.14; //圆周率
double radius1 = 1.2;
double radius2 = 2.5;
double radius3 = 6;
System.out.println("第1个圆的面积=" + PI * radius1 * radius1);
System.out.println("第2个圆的面积=" + PI * radius2 * radius2);
System.out.println("第3个圆的面积=" + PI * radius3 * radius3);
}
}
案例2:将华氏温度转为摄氏温度(℃):℃=(℉ - 32) / 1.8
/**
* @author shbzhao
* @version 1.0
* @date 2023/8/26
* 将华氏温度转为摄氏温度(℃):℃=(℉ - 32) /1.8
*/
public class FloatDoubleExer02 {
public static void main(String[] args) {
double hua = 80.0;
double she = (hua-32)/1.8;
System.out.println("华氏度"+hua+"℉=摄氏度"+she+"℃");
}
}
字符型
- char类型数据用来表示通常意义上“字符”(占2字节)
- 字符型变量的三种表现形式:
- 形式1:使用单引号('')括起来的单个字符。如:char c1 = 'a'; char c2 = '男'; char c3 = 9;
- 形式2:直接使用Unicode值来表示字符常量:‘\uXXXX’。其中,XXXX表示一个十六进制整数。如:\u0023 表示'#'。
- Java中还允许使用转义字符'\',来将其后的字符转变为特殊字符型常量。如:char c4 = '\n';,'\n'表示换行符
- char类型是可以进行运算的,它都对应有Unicode码,可以看作是一个数值,ASCII码值。
- 演示:
/**
* @author shbzhao
* @version 1.0
* @date 2023/8/26
*/
public class CharBooleanTest {
public static void main(String[] args) {
//1.字符类型 char(2字节)
//2.表示形式
//2.1 使用单引号('')括起来的单个字符
char c1 = 'a';
char c2 = '1';
char c3 = '男';
char c4 = '@';
//2.2 直接使用Unicode值来表示字符常量:'\'uXXXX'。其中,XXXX表示一个十六进制整数。
char c5 = '\u0036'; //表示后买你
System.out.println(c5);
//2.3使用转义字符'\',来将其后的字符转变为特殊字符型常量。
char c6 = '\n';
//2.4char类型是可以进行运算的,它都对应有Unicode码,可以看作是一个数值,ASCII码值
char c7 = 97;
System.out.println(c7);
}
}
布尔型
- 布尔类型(boolean),只有两个值true、false;
- 常用于逻辑条件的判断,如条件判断、分支结构、循环结构等;
-
演示:
// 布尔类型(boolean) 1字节
// 1.只有两个值true和false
boolean b1 = true;
boolean b2 = false;
// 不能使用0和1代替true和false
// boolean b3 = 0; //编译不通过
// 常用于条件判断或循环语句中
boolean isStudent = true;
if (isStudent){
System.out.println("是学生");
}else{
System.out.println("不是学生");
}
5 数据类型之间的转换
自动类型提升
- 自动类型转换:数据类型表数范围的自动提升
- 类型转换规则:
- 容量较小的类型自动转换为容量大的数据类型(容量是指表数范围的大小);
- byte、short、char之间运算后为int类型;
- char不能与short、int转换。
- 演示:
/**
* @author shbzhao
* @version 1.0
* @date 2023/8/27
* 演示基本数据类型之间的类型转换
* 包括:
* 1.自动 类型转换(数据类型的精度\表数提升)
* 2.强制 类型转换
* 类型转换规则:容量是指数据类型(表数范围)的大小
* 1.容量较小的类型赋值给容量较大的类型时,结果自动转换为容量大的数据类型
* byte ---> short ---> int ---> long ---> float ---> double
* 2.byte、short char之间运算后为int类型:(特殊情况1)
* byte + short ---> int,byte + byte---> int,short + short ---> int
* 3.char不能与short、int转换(特殊情况2)
*/
public class BasicDataSwitch {
public static void main(String[] args) {
// 容量是指表数范围的大小
// 如long型占8字节,float型占4字节,但是表述范围float更大
long l1 = 115431543L;
float f1 = l1;
float f2 = 2.45465412f;
//long l2 = f2; // 编译报错
// byte ---> int ok
byte b1 = 1;
int i1 = b1 + b1;
// int ---> byte
//byte b2 = i1 + i1; // 编译报错
// 特殊情况1:byte + short ---> int
byte b3 = 11;
short s1 = 12;
//short s2 = s1+b3; // 编译报错
int i2 = s1 + b3;
// 特殊情况2:char不能与byte、short进行类型转换
char c1 = 10;
//byte b4 = c1; // 编译报错
//short s2 = c1; // 编译报错
}
}
强制类型转换
- 强制类型转换:将取值范围(或容量)大的类型强制转换为取值范围小(或容量小的类型)。
- 强制类型转换符:"()",在小括号内指定要转换为的数据类型。
- 强制类型转换可能会导致精度损失。
- 演示:
/**
* @author shbzhao
* @version 1.0
* @date 2023/8/28
* 演示强制类型转换的使用
* 规则:
* 1.如果需要将容量大的赋值给容量小的类型,需要进行强制类型转换
* 2.强制类型转换符:"()",在小括号内指定要转换为的数据类型
* 3.强制类型转换可能会导致精度损失
*/
public class ForceTypeSwitch {
public static void main(String[] args) {
// 自动类型提升 int ---> double
double d1 = 12;
// 尝试double ---> int,编译错误
//int i1 = d1;
int i2 = (int) d1;
System.out.println(i2);
long l1 = 666;
short s1 = (short) l1;
System.out.println(l1);
// 精度损失
double d2 = 12.3;
int i3 = (int) d2;
System.out.println(i3);
int i4 = 128;
byte b1 = (byte) i4;
System.out.println(b1);
}
}
6 基本数据类型与String类型转换
- 基本数据类型-->String类型:使用包装类的parse方法。
- String类型-->基本数据类型:使用双引号""拼接。
- 注意:String类型-->基本数据类型时,String数据的格式必须是能够转换的基本数据类型
- 演示:
/**
* @author shbzhao
* @version 1.0
* @date 2023/8/28
* 演示String与基本数据类型之间的转换
* 1.基本数据类型-->String类型(使用包装类的parse方法)
* 2.String类型-->基本数据类型(使用双引号""拼接)
*/
public class StringToBasic {
public static void main(String[] args) {
// 基本数据类型-->String类型(使用包装类的parse方法)
int n1 = 100;
float f1 = 1.1f;
double d1 = 4.5;
boolean b1 = true;
String s1 = n1 + "BasicToString";
String s2 = f1 + "BasicToString";
String s3 = d1 + "BasicToString";
String s4 = b1 + "BasicToString";
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
// String类型-->基本数据类型(使用双引号""拼接)
// 需要通过基本数据的包装类调用parseXX方法
String byteStr = "127";
byte b2 = Byte.parseByte(byteStr);
String shortStr = "123";
short sh2 = Short.parseShort(shortStr);
String intStr = "321";
int int2 = Integer.parseInt(intStr);
String longStr = "321123321";
long long2 = Long.parseLong(longStr);
String floatStr = "12.3";
float float2 = Float.parseFloat(floatStr);
String doubleStr = "12.3";
double double2 = Double.parseDouble(doubleStr);
//char类型调用charAt(0)方法
String charStr = "12.3";
char char2 = charStr.charAt(0);
String booleanStr = "true";
boolean boolean2 = Boolean.parseBoolean(booleanStr);
System.out.println(b2 + " " + sh2 + " " +
int2 + " " + long2 + " " +
float2 + " " + double2 + " " +
char2 + " " +
boolean2);
}
}
7 进制运算
进制的分类
- 十进制(decimal)
- 数字组成:0-9
- 进位规则:满10进1
- 二进制(bindary):以0b或0B开头
- 数字组成:0-1
- 进位规则:满2进1
- 八进制(octal):很少使用,以数字0开头
- 数字组成:0-7
- 进位规则:满8进1
- 十六进制(bindary):以0x或0X开头
- 数字组成:0-9和a-f。a-f不区分大小写
- 进位规则:满16进1
- 演示:
/**
* @author shbzhao
* @version 1.0
* @date 2023/8/28
* 演示二进制数
* 用四种进制表示数字20
*/
public class BinaryTest {
public static void main(String[] args) {
// 十进制
int num1 = 20;
// 二进制
int num2 = 0b10100;
// 八进制
int num3 = 024;
// 十六进制
int num4 = 0x14;
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
System.out.println(num4);
}
}
进制的转换
十进制 | 二进制 | 八进制 | 十六进制 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | a |
11 | 1011 | 13 | b |
12 | 1100 | 14 | c |
13 | 1101 | 15 | d |
14 | 1110 | 16 | e |
15 | 1111 | 17 | f |
16 | 10000 | 20 | 10 |
其它进制转十进制:
- 二进制转十进制:从最低位(右边)开始,将每一位上的数提取出来,乘以2的(位数-1)次方。位数是指从右边数第几位。如0b1011=1*2^(4-1) + 0*2^(3-1) + 1*2^(2-1) + 1*2^(1-1)。
- 八进制转十进制:从最低位(右边)开始,将每一位上的数提取出来,乘以8的(位数-1)次方。
- 十六进制转十进制:从最低位(右边)开始,将每一位上的数提取出来,乘以16的(位数-1)次方。
十进制转其它进制:将十进制连续除以其它进制数,直到商为0,取每步的余数倒置就是对应的进制数。
- 十进制转二进制:十进制数连续除以2,直到商为0,取每步的余数倒置
- 十进制转八进制:十进制数连续除以8,直到商为0,取每步的余数倒置
- 十进制转十六进制:十进制数连续除以16,直到商为0,取每步的余数倒置
二进制转八、十六进制:
- 二进制转八进制:将二进制数的每3位为一组(从右开始个位数的值分别是4、2、1),每一组对应转换为一个8进制数。
- 二进制转十六进制:将十六进制的每4位为一组(从右开始个位数的值分别是8、4、2、1),每一组对应转换为一个16进制数。
8 运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等等。
运算符的分类:算术运算符、赋值运算符、比较(或关系)运算符、逻辑运算符、位运算符、条件运算符、Lambda运算符。
分类 | 运算符 |
算术运算符(7个) | + - * / % ++ -- |
赋值运算符(12个) | = += -= *= /= %= >>= <<= >>>= &= |= ^= |
比较(或关系)运算符(6个) | > >= < <= == != |
逻辑运算符(6个) | & | ^ ! && || |
位运算符(7个) | & | ^ - << >> >>> |
条件运算符(1个)三元运算符 | 条件表达式?表达式1:表达式2; |
Lambda运算符(1个) | ->(Java新特性章节讲解) |
算术运算符
运算符 | 功能 | 范例 | 结果 |
+ | 正号 | +3 | 3 |
- | 负号 | b=4; -b; | -4 |
+ | 加 | 5+5 | 10 |
- | 减 | 6-4 | 2 |
* | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取模(取余) | 7%5 | 2 |
++i | 自增(前):先自增,后赋值 | a=2;b=++a; | a=3;b=3 |
i++ | 自增(后):先赋值,后自增 | a=2;b=a++ | a=3;b=2 |
--i | 自减(前):先自减,后赋值 | a=2;b=--a | a=1;b=1 |
i-- | 自减(后):先赋值,后自减 | a=2;b=a-- | a=1;b=2 |
+ | 字符串拼接 | "Hello"+"world" | "Helloworld" |
赋值运算符
赋值运算符是将某个运算后的值赋给指定的变量。
- 基本赋值运算符:"=",如int n = 1;;
- 当"="两边数据类型不一致时,可以使用自动类型提升或强制类型转换进行处理;
- 复合赋值运算符:+=、-+、*=、/=、%=,如n += 3;等价于n = n + 3;;
- 注意:复合赋值运算符会进行类型转换,底层具有强制类型转换符。
- 演示:
/**
* @author shbzhao
* @version 1.0
* @date 2023/8/28
* 演示赋值运算符
*/
public class SetValueTest {
public static void main(String[] args) {
int n = 10;
// 1.当"`=`"两边数据类型不一致时,可以使用`自动类型提升`或`强制类型转换`进行处理
long l1 = n; // 自动类型提升
byte b1 = (byte) n; // 强制类型转换
// 2.允许连续赋值
int a, b;
a = b = 100;
// 3.复合赋值运算符会进行`类型转换`,底层具有`强制类型转换符`
byte n1 = 12;
n1 += 3; // 等价于n1=(byte)(n1+3),强制类型转换为int
System.out.println(n1);
}
}
- 练习1:
int n = 10;
n += (n++) + (++n); // 等价于n = n + (n++) + (++n)
// num = 10 + 10 + 12,先计算n++和++n
System.out.println(n);
关系运算符
关系运算符的结果都是boolean类型true或false。
- 关系运算符:>、>=、<、<=、==、!=;
- ==和!=适用于基本数据类型和引用数据类型,其它只适用于基本数据类型;
- 注意:=是赋值运算符,==是关系运算符
运算符 | 功能 | 范例 | 结果 |
== | 等于 | 8 == 7 | false |
!= | 不等于 | 8 != 7 | true |
> | 大于 | 8 > 7 | true |
>= | 大于等于 | 8 >= 7 | true |
< | 小于 | 8 < 7 | false |
<= | 小于等于 | 8 <= 7 | false |
A instanceof B | 检测A是否为B类的对象 | "ahhlt" instanceof String | true |
逻辑运算符
逻辑运算符只对boolean类型进行操作,结果也是boolean类型的值。
运算符 | 功能 |
&和&& | 表示"且"关系,符号两边同时为true时,结果为true。助记:同1为1,1为true,0为fasle |
|和|| | 表示"或"关系,符号两边只要有一个为true,结果为true。助记:有1为1 |
! | 表示"非"关系,变量的值为true时,结果为false。助记:取反 |
^ | 表示"异或"关系,符号两边的值不同时,结果为true。助记:有同为0,不同为1 |
逻辑运算与短路运算的区别:
- 短路与(&&)和逻辑与(&):
- 短路与(&&):条件1 && 条件2,若条件1为false,则不再判断条件2。
- 逻辑与(&):条件1 & 条件2,若条件1为false,继续判断条件2。
- 注意:开发中一般使用短路与,除非特定情况才使用逻辑与。
- 短路或(||)和逻辑或(|):
- 短路或(||):条件1 || 条件2,若条件1为true,则不再判断条件2。
- 逻辑或(|):条件1 | 条件2,若条件1为true,继续判断条件2。
三元运算符
- 语法格式:(条件表达式)?表达式1:表达式2
- 运算规则:如果条件表达式的值为true,运算结果为表达式1,否则为表达式2
- 表达式1和表达式2必须是可以赋给接收变量的类型(可以自动转换或语法强转)
/**
* @author shbzhao
* @version 1.0
* @date 2023/8/28
* 条件表达式的使用
*/
public class ConditionTest {
public static void main(String[] args) {
int a = 10;
int b = 99;
int result = (a > b) ? a++ : b--;
// a > b为false,返回第二个表达式b--,先将b的值返回,b再自减
System.out.println("result= " + result);
System.out.println("b= " + b);
// 表达式类型与接收变量类型不同时,必须满足类型自动转换或者强制转换
int c = a > b ? (int)1.1 : (int)2.2;
}
}
位运算符
位运算
- 计算机进行运算时,都是对补码进行运算,显示运算结果时将计算后的补码转为原码;
- 正数的原码、反码、补码都相同,称三码合一;
- 负数的三码:
- 反码:原码除符号位不变,其它位取反
- 补码:反码+1。相应的:负数的反码= 补码-1
- 符号位:二进制的最高位(最左边)为符号位,0代表正数,1代表负数
位运算符
以二进制补码进行运算
运算符 | 功能 |
& | 按位与,全1为1 |
| | 按位或,有1为1 |
^ | 按位异或,不同为1,相同为0 |
~ | 按位取反,每位都取相反值 |
<< | 左移,符号位不变,低位补0。左移n位相当于乘2的n次方 |
>> | 右移,符号位不变,用符号位补高位空缺。右移n位相当于除2的n次方 |
>>> | 无符号右移,低位溢出,高位补0 |
演示:
/**
* @author shbzhao
* @version 1.0
* @date 2023/8/28
*/
public class BitOperatorTest {
public static void main(String[] args) {
/*
* 1.按位与(&):2 & 3
* 正数的原码、反码、补码都相同
* 2的三码:00000000 00000000 00000000 00000010
* 3的三码:00000000 00000000 00000000 00000011
* 2 & 3: 00000000 00000000 00000000 00000010
* 结果为2
*
* 2.按位或(&):
* */
System.out.println(2 & 3);
}
}
运算符优先级
优先级 | 运算符说明 | Java运算符 |
1 | 括号 | ()、[]、{} |
2 | 正负号 | +、- |
3 | 单元运算符 | ++、--、~、! |
4 | 乘、除、取余 | *、/、% |
5 | 加、减 | +、- |
6 | 位移运算符 | <<、>>、>>> |
7 | 关系运算符 | >、>=、<、<=、==、!=、instanceof |
8 | 按位与 | & |
9 | 按位异或 | ^ |
10 | 按位或 | | |
11 | 短路与 | && |
12 | 短路或 | || |
13 | 三元运算符 | 条件表达式?表达式1:表达式2; |
14 | 赋值运算符 | =、+=、-=、*=、/=、%=、>>=、<<=、>>>=、&=、|=、^= |