Java基础知识
1、注释
注释是对代码的解释和说明文字。
//单行注释
/*多行注释*/
2、关键字
2.1、定义
在Java语言中被赋予特殊含义的小写单词
2.2、分类
//用于定义数据类型的关键字
class,interface,byte,short,int,long,float,double,char,boolean,void
//用于定义数据类型值的关键字
true,false,null
//用于定义流程控制的关键字
if,else,switch,case,default,while,do,for,break,continue,return
//用于定义访问权限修饰符的关键字
private,protected,public
//用于定义类,方法,变量修饰符的关键字
abstract,final,static,synchronized
//用于定义类与类之间关系的关键字
extends,implements
//用于建立实例、引用实例及判断实例的关键字
new,this,super,instanceof
//用于异常处理的关键字
try,catch,finally,throw,throws
//用于包的关键字
package,import
//其他修饰符关键字
native,strictfp,transient,volatile,assert
3、标识符
3.1、定义
标识符就是给常量、变量、类、方法起名字
3.2、注意事项
- 标识符由字母、数字、下划线"_"、美元符号"$"组成
- 标识符不能以数字开头
- 标识符不能是关键字
- 标识符严格区分大小写
3.3、格式要求
-
常量:
规则:每个单词都大写,单词与单词之间用下划线分隔
举例:IS_TRUE
-
变量和方法名:小驼峰命名法
规则:首字母小写,从第二个单词开始每个单词的首字母大写
举例:studentName
-
类名:大驼峰命名法
规则:每个单词的首字母都大写
举例:StudentInfo
4、数据类型
4.1、分类
4.2、取值范围
-
图解:
-
描述:
-
byte:
- byte 数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是 -128(-2^7) ;
- 最大值是 127(2^7-1) ;
- 默认值是 0;
- byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
- 例子:byte a = 100,byte b = -50。
-
short:
- short 数据类型是 16 位、有符号的以二进制补码表示的整数
- 最小值是 -32768(-2^15) ;
- 最大值是 32767(2^15 - 1) ;
- Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是 0;
- 例子:short s = 1000,short r = -20000。
-
int:
- int 数据类型是32位、有符号的以二进制补码表示的整数;
- 最小值是 -2,147,483,648(-2^31) ;
- 最大值是 2,147,483,647(2^31 - 1) ;
- 一般地整型变量默认为 int 类型;
- 默认值是 0 ;
- 例子:int a = 100000, int b = -200000。
-
long:
- long 数据类型是 64 位、有符号的以二进制补码表示的整数;
- 最小值是 -9,223,372,036,854,775,808(-2^63) ;
- 最大值是 9,223,372,036,854,775,807(2^63 -1) ;
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是 0L;
- 例子: long a = 100000L,Long b = -200000L。 "L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
-
float:
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是 0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f。
-
double:
-
double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
-
浮点数的默认类型为 double 类型;
-
double类型同样不能表示精确的值,如货币;
-
默认值是 0.0d;
-
例子:
double d1 = 7D ; double d2 = 7.; double d3 = 8.0; double d4 = 8.D; double d5 = 12.9867;7 是一个 int 字面量,而 7D,7. 和 8.0 是 double 字面量。
-
-
boolean:
- boolean数据类型表示一位的信息;
- 只有两个取值:true 和 false;
- 这种类型只作为一种标志来记录 true/false 情况;
- 默认值是 false;
- 例子:boolean one = true。
-
char:
- char 类型是一个单一的 16 位 Unicode 字符;
- 最小值是 \u0000(十进制等效值为 0);
- 最大值是 \uffff(即为 65535);
- char 数据类型可以储存任何字符;
- 例子:char letter = 'A';。
-
-
整数取值范围的快速记忆:
-2^(位数-1)~2^(位数-1)-1
- 例如:byte 1个字节,8位,则取值范围为: -2^7~2^7-1
-
浮点数范围的快速记忆:
内存空间为四个部分:
------ 符号位 指数符号位 指数位 尾数位 总计 float 1 1 7 23 32 double 1 1 10 52 64 作用 用于保存浮点数的正负号(0:正,1:负) 用于保存指数位的正负号 影响浮点数的取值范围 影响浮点数的精度 以float为例:指数相关的内存占8bit,符号位1bit,指数位7bit。则指数的取值范围为[-127,128]
4.3、一些重要的字符集
- ASCII字符集:共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于只有128个字符,所以可以使用一个字节来进行编码。
- ISO 8859-1字符集(别名:Latin1) :共收录256个字符,它在ASCII字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母)。它也可以使用一个字节来进行编码。
- GB2312字符集:收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母,收录汉字6763个,收录其他文字符号682个。这种字符同时又兼容ASCII字符集,所以在编码方式上有点奇怪:如果该字符在ASCII字符集中,则使用一字节编码;否则采用两字节编码。 (汉字采用2字节编码)
- GBK字符集:GBK字符集只是在收录的字符范围上对GB2312字符集进行了扩充,编码方式兼容GB2312字符集。
- UTF-8字符集:几乎收录了当今世界各国/地区使用的字符,而且还在不断的扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符时需要使用1~4字节。 (汉字采用3字节编码)
- Unicode字符集:上面提到的UTF-8只是Unicode字符集的一种编码方案,Unicode字符集可以采用UNT-8、UTF-16、UTF-32这几种编码方案。UTF-8使用1~4字节编码一个字符,UTF-16使用2或4字节编注一个字符,UTF-32使用4字节编码一个字符。(Java语言采用的是Unicode编码,确切地说是 UTF - 16 编码来表示字符。)
5、常量
5.1、定义
在程序运行期间,其值不会发生改变的量,被称为常量
在Java中,利用关键字final指示常量。 例如:
//final修饰的变量只能赋值一次
final double TREE_LENGTH=30;
类常量,通常使用static final设置,可以被一个类中的多个方法同时使用,如果再加上public,那么其他类的方法也可以使用这个常量。 例如:
public class Example {
//类常量
public static final int TREE_LENGTH = 10;
public static void main(String[] args) {
System.out.println(TREE_LENGTH);
}
}
5.2、分类
| 常量类型 | 说明 | 举例 |
|---|---|---|
| 字符串常量 | 用双引号括起来的内容 | "Hello world" |
| 整数常量 | 不带小数的数字 | 666,-888 |
| 浮点数常量 | 带小数的数字 | 13.14,-5.20 |
| 字符常量 | 用单引号括起来的单个内容 | 'A','我','0' |
| 布尔常量 | 布尔值,表示真假 | true,false |
| 空常量 | 一个特殊的值,空值 | null |
6、变量
6.1、定义
在程序运行期间,其值可以发生改变的量,被称为变量。
6.2、格式
变量类型 变量名 = 初始化值;
或
变量类型 变量名;
变量名=初始化值;
JDK10以后,可以用var来接收方法中的局部变量
6.3、注意事项
- 同一对大括号内,变量名称不能重复
- 在变量使用之前,必须要进行初始化
- long数据后边需要加L、float数据后边需要加F
- 整数默认是int类型、浮点默认是double类型
7、类型转换
-
自动类型转换:
把小范围数据类型赋值给大范围数据类型,由于精度并不会丢失,因此这种转换是自动的
如图:
-
强制类型转换:
把大范围数据类型赋值给小范围数据类型,由于精度可能会丢失,因此需要进行强制转换
格式:目标数据类型 变量名 = (目标数据类型)(表达式或变量);
8、运算符和表达式
- 运算符:对常量或者变量进行操作的符号
- 表达式:用运算符把常量或者变量连接起来符合Java语法的式子被称为表达式
8.1、算术运算符
| 符号 | 作用 | 举例 | 说明 |
|---|---|---|---|
| + | 加 | 7+3 | 7+3=10 |
| - | 减 | 7-3 | 7-3=4 |
| * | 乘 | 7*3 | 7-3=21 |
| / | 除 | 7/3 | 7/3=2 |
| % | 取余 | 7%3 | 7%3=1 |
8.2、自增和自减
| 符号 | 作用 | 举例 | 说明 |
|---|---|---|---|
++ | 自增 | int i = 10; i++; | i=11 |
-- | 自减 | int i = 10; i--; | i=9 |
注意: ++i、i++、--i、i--的区别
int i = 0;
i = i++;
System.out.println("i = " + i); //0
int a = 2;
int b = (3 * a++) + a;
System.out.println(b);//9
int a = 2;
int b = a + (3 * a++);
System.out.println(b);//8
int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++;
System.out.println(k);//8
int a = 0;
int b = 0;
a = a++;//a=0
b = a++;//b=0;a=1
System.out.println("a = " + a + ", b = " + b);//a = 1, b = 0
-
原理:
i++ 即后加加,原理是:先自增,然后返回自增之前的值 ++i 即前加加,原理是:先自增,然后返回自增之后的值
8.3、赋值运算符
| 符号 | 作用 | 举例 | 说明 |
|---|---|---|---|
| = | 赋值 | a=10 | 将10赋值给变量a |
| += | 加后赋值 | a+=b | 将a+b的值给变量a |
| -= | 减后赋值 | a-=b | 将a-b的值给变量a |
| *= | 乘后赋值 | a*=b | 将a*b的值给变量a |
| /= | 除后赋值 | a/=b | 将a/b的值给变量a |
| %= | 取余后赋值 | a%=b | 将a%b的值给变量a |
注意:
short s = 10;
s = s + 10; //此行代码报错,因为运算中s提升为int类型,运算结果int赋值给short可能损失精度
short s = 10;
s += 10; //此行代码正确,隐含了强制类型转换,相当于 s = (short)(s + 10);
8.4、关系运算符
| 符号 | 作用 | 举例 | 说明 |
|---|---|---|---|
| == | 判断是否相等 | a==b | 判断a和b的值是否相等,成立为true,不成立为false |
| != | 判断是否不等 | a!=b | 判断a和b的值是否不等,成立为true,不成立为false |
| 判断是否大于 | a>b | 判断a是否大于b,成立为true,不成立为false | |
| >= | 判断是否大于等于 | a>=b | 判断a是否大于等于b,成立为true,不成立为false |
| < | 判断是否小于 | a<b | 判断a是否小于b,成立为true,不成立为false |
| <= | 判断是否小于等于 | a<=b | 判断a是否小于等于b,成立为true,不成立为false |
8.5、逻辑运算符
| 符号 | 作用 | 说明 | |
|---|---|---|---|
| & | 逻辑与 | “与”,并且的关系,只要表达式中有一个值为false,结果即为false | |
| | | 逻辑或 | “或”,或者的关系,只要表达式中有一个值为true,结果即为true | |
| ! | 逻辑非 | true变false、false变true | |
| 逻辑异或 | 如果两边相同,结果为false,如果两边不同,结果为true | ||
| && | 短路与 | 作用和&相同,但是有短路效果,如果左边为false,右边就不执行了 | |
| || | 短路或 | 作用和 | 相同,但是有短路效果,如果左边为true,右边就不执行了 |
8.6、三元运算符
- 格式: 格式:关系表达式 ? 表达式1 : 表达式2;
-
int a = 10; int b = 20; int max = a > b ? a : b;//关系表达式为true,max=a;为false,max=b System.out.println(max);//20
9、数据输出和输入
-
数据输出:
-
输出后换行
System.out.println(常量/变量/方法返回值/对象/表达式); -
输出不换行
System.out.print(常量/变量/方法返回值/对象/表达式); -
格式化输出:沿用了C语言函数库中的printf方法
//例如:打印x:包含8个字符,精度为小数点后两位 System.out.printf("%8.2f",x) //可以是多个参数 System.out.printf("Hello,%s.Next year,you`ll be %d",name,age) //可以使用标志位 System.out.printf("%,.2f",10000.0/3.0)//输出3,333.33 逗号为标志prinft转换符和prinft标志自行百度
-
-
数据输入:
import java.util.Scanner; public class Main { public static void main(String[] args) { //构造标准输入流System.in关联的Scanner对象 Scanner sc = new Scanner(System.in); //使用Scanner提供的各种方法读取输入 int i = sc.nextInt(); System.out.println(i); } }
10、分支结构(if、switch)
10.1、if语句
-
格式一:
if (关系表达式) { 语句体; } -
流程一:
- 首先计算关系表达式的值
- 如果关系表达式的值为true就执行语句体
- 如果关系表达式的值为false就不执行语句体
- 继续执行后面的语句内容
-
格式二:
if (关系表达式) { 语句体1; } else { 语句体2; } -
流程二:
- 首先计算关系表达式的值
- 如果关系表达式的值为true就执行语句体1
- 如果关系表达式的值为false就执行语句体2
- 继续执行后面的语句内
-
格式三:
if (关系表达式1) { 语句体1; } else if (关系表达式2) { 语句体2; } ... else { 语句体n+1; } -
流程三:
- 首先计算关系表达式1的值
- 如果值为true就执行语句体1;如果值为false就计算关系表达式2的值
- 如果值为true就执行语句体2;如果值为false就计算关系表达式3的值
- ....
- 如果没有任何关系表达式为true,就执行语句体n+1。
10.2、switch语句
-
格式:
switch (关系表达式) { case 1: 语句体1; break; case 2: 语句体2; break; ... default: 语句体n+1; [break;] } -
流程:
- 首先计算出关系表达式的值
- 和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束
- 如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉,注意default中的break可以省略
-
注意:
- 关系表达式的取值可以是byte、short、int、char
- JDK5以后可以是枚举
- JDK7以后可以是String
11、循环结构(for、while、do...while)
11.1、for语句
-
格式:
for (初始化语句;条件判断语句;条件控制语句) { 循环体语句; } -
流程:
- 执行初始化语句
- 执行条件判断语句,看其结果是true还是false,如果是false,循环结束,如果是true,继续执行
- 执行循环体语句
- 执行条件控制语句
- 回到 第二条 继续
11.2、while语句
-
格式:
初始化语句; while (条件判断语句) { 循环体语句; 条件控制语句; } -
流程:
- 执行初始化语句
- 执行条件判断语句,看其结果是true还是false,如果是false,循环结束,如果是true,继续执行
- 执行循环体语句
- 执行条件控制语句
- 回到 第二条 继续
11.3、do...while语句
-
格式:
初始化语句; do { 循环体语句; 条件控制语句; }while(条件判断语句); -
流程:
- 执行初始化语句
- 执行循环体语句
- 执行条件控制语句
- 执行条件判断语句,看其结果是true还是false,如果是false,循环结束,如果是true,继续执行
- 回到 第二条 继续
11.4、死循环语句
第一种:
for(;;){
}
第二种:
while(true){
}
第三种:
do{
}while(true);
12、跳转控制
goto作为Java保留关键字,实际上并没有使用。
break://跳出所有循环,循环语句结束
continue://跳过本次循环,继续下次循环
for (int i = 0; i < 5; i++) {
if (i==2) {
//continue;//结果为0 1 3 4
break;//结果为 0 1
}
System.out.println(i);
}
13、数组
13.1、定义
- 数组是用于储存多个相同类型数据的有序集合。
- 组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。
- 用于区分数组的各个元素的数字编号称为下标。
13.2、格式
第一种:数据类型[] 数组名;
第二种:数据类型 数组名[];
13.3、初始化
动态初始化
含义:数组动态初始化就是只给定数组的长度,由系统给出默认初始化值
格式:数据类型[] 数组名 = new 数据类型[数组长度];
举例:int[] arr = new int[3];
静态初始化
含义:在创建数组时,直接将元素确定,由系统给出数组长度
格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
简化:数据类型[] 数组名 = {元素1,元素2,...};
举例:int[] arr = {1, 2, 3};
13.4、数组遍历
public class Main {
public static void main(String[] args) {
//定义数组
int[] arr = {11, 22, 33, 44, 55};
//数组遍历 arr.length:代表数组个数
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
//增强for循环 循环对象必须是数字或者一个实现了Iterable接口的类对象(例如ArrayList)
for (int i : arr) {
System.out.println(i);
}
}
}
-
常见异常:
- ArrayIndexOutOfBoundsException:数组下标越界异常
- NullPointerException:空指针异常
13.5、数组拷贝
在Java中,允许将一个数组变量拷贝到另一个数组变量。
-
两个变量引用一个数组:
int[] oldArr = {11, 22, 33, 44, 55}; int[] newArr = oldArr; -
将数组拷贝到一个新数组里面:
int[] oldArr = {11, 22, 33, 44, 55}; //第二个为新数组的长度,可以增加数组的大小,如果长度小于原始数组的长度,则只拷贝前面的值 int[] newArr = Arrays.copyOf(oldArr,2*oldArr.leangth);
13.6、数组排序
要想对数组进行排序,可以使用Arrays类的sort方法
int[] a = new int[1000];
//赋值...
Arrays.sort(a);
Arrays还提供了很多便捷的方法,具体可参照相关API;
13.7、命令行参数
我们已经见到很多次main方法上的args字符串参数。其实我们javac将主类编译成class文件执行时,可以这样用到:
java Message a1 a2 a3 `main方法所在类名`
此时 args 数组值为
args = {"a1","a2","a3"}
13.8、二维数组(矩阵)
13.8.1、创建
数据类型[][] 数组名 = new 数据类型[行长度] [列长度];数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2,...},{元素1,元素2,...},...};数据类型[][] 数组名 = {{元素1,元素2,...},{元素1,元素2,...},...};
13.8.2、遍历
int[][] matrix = {
{16, 3, 3},
{2, 5, 8},
{11, 4, 8},
{3, 7, 66}
};
//第一种,下标循环
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
System.out.println("-------------------");
//第二种,增强for
for (int[] row : matrix) {
for (int val : row) {
System.out.print(val+" ");
}
System.out.println();
}
System.out.println("-------------------");
//第三种:工具类
System.out.println(Arrays.deepToString(matrix));
14、方法
14.1、定义
是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集
14.2、格式
[权限修饰符] [static] 返回值类型 方法名(参数列表) {
方法体;
return 数据;
}
14.3、形参实参
- 形参:方法定义中的参数
- 实参:方法调用中的参数
14.4、参数传递
- 方法参数传递基本类型:基本数据类型的参数,形式参数的改变,不会影响实际参数
- 方法参数传递引用类型:对于引用类型的参数,形式参数的改变,影响实际参数的值
14.5、可变参数
//参数为可变参数,可以传0个或多个参数进去
public static void method1(Integer... args){ }
//参数为数组,必须要传数组参数进去
public static void method2(Integer[] args){ }
- 可变参数是指在调用方法时传入不定长度的参数,本质上是基于数组实现的
- 在定义方法时,在最后一个形参上加"…"就表示该形参可以接受多个参数值,多个参数值被当做数组传入。
- 可变参数只能做为函数的最后一个参数,前面有没有其他参数都可以,一个函数最多只能有一个可变参数。
14.6、方法重载
指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
- 多个方法在同一个类中
- 多个方法具有相同的方法名
- 多个方法的参数不相同:参数类型或者数量不同
14.7、注意事项
- 方法不能嵌套定义,但是方法可以嵌套调用
- 方法必须先定义,后调用,否则程序将报错
- 方法定义时,多个参数之间使用逗号(,)分隔
- void表示无返回值,return可省略也可不省