JavaSE 知识点总结
温馨提示:这篇文章已超过439天没有更新,请注意相关的内容是否还可用!
路在脚下,行则将至
目录
1. 初始Java
1.1 Java之父——高斯林
1.2 一次编译,到处运行
1.3 注释
2. 数据结构与变量
2.1 数据类型
2.2 变量
2.3 常量
3. 运算符
3.1 逻辑与 &&
3.2 逻辑 ||
3.3 逻辑非 !
3.4 特殊的位运算符(C语言没有)
4. 逻辑控制
4.1 选择(If 与 switch)
4.2 循环(while , for , do while)
4.3 输入输出
5. 方法
5.1 方法的定义
5.2 方法的传参
5.3 方法的重载
5.4 方法的递归
6. 数组
6.1 数组的定义方式
6.2 内存布局
6.3 数组的访问
6.4 数组指向null
6.5 常见的错误
6.6 数组作为参数进行传递
6.7 数组作为函数的返回值
6.8 数组常见的方法
6.9 二维数组
7. 类和对象
7.1 什么是类?如何定义类?
7.2 对象
7.3 this是什么?
7.4 构造方法
7.5 封装
7.6 static关键字
7.7 代码块
8. 继承和多态
8.1 继承
8.2 多态
9. 抽象类和接口
9.1 抽象类
9.2 接口
9.3 几个重要的接口
9.4 object类
9.5 面试问题: 抽类和接口的区别
10. String类
10.1 常用的方法
10.2 String ,StringBuffer ,StringBuilder的区别
11. 异常
11.1 程序自己抛出的异常
11.2 自定义的异常
11.3 异常的处理流程
1. 初始Java
1.1 Java之父——高斯林
1.2 一次编译,到处运行
Java是一门半编译型、半解释型语言。先通过javac编译程序把源文件进行编译,编译后生成的.class文件是由字节码组成的平台无关、面向JVM的文件。最后启动java虚拟机来运行.class文件,此时JVM会将字节码转换成平台能够理解的形式来运行。
1.3 注释
Java中的注释主要分为以下三种:
1.单行注释:// 注释内容(用的最多)
2.多行注释:/* 注释内容*/(不推荐)
3.文档注释: /** 文档注释 */(常见于方法和类之上描述方法和类的作用),可以被javadoc工具解析,生成一套以网页文件形式体现的程序说明文档
注意:
1. 多行注释不能嵌套使用
2. 不论是单行还是多行注释,都不参与编译,即编译之后生成的.class文件中不包含注释信息。
2. 数据结构与变量
2.1 数据类型
在Java中数据类型主要分为两类:基本数据类型和引用数据类型。
基本数据类型有四类八种:
1. 四类:整型、浮点型、字符型以及布尔型
2. 八种:
注意:
1.不论是在16位系统还是32位系统,int都占用4个字节,long都占8个字节
2.整形和浮点型都是带有符号的
3.整型默认为int型,浮点型默认为double
4.字符串属于引用类型
什么是字节?
字节是计算机中表示空间大小的基本单位.
计算机使用二进制表示数据. 我们认为 8 个二进制位(bit) 为一个字节(Byte).
我们平时的计算机为 8GB 内存, 意思是 8G 个字节.
其中 1KB = 1024 Byte, 1MB = 1024 KB, 1GB = 1024 MB.
所以 8GB 相当于 80 多亿个字节
2.2 变量
定义变量的语法格式为:
数据类型 变量名 = 初始值;
int的包装类型为 Integer
short的包装类型为Short
long的包装类型为Long
字节的包装类型为Byte
double的包装类型为Double
char的包装类型为Character
boolean的包装类型为Boolean
2.3 常量
final int a = 10;
3. 运算符
3.1 逻辑与 &&
语法规则:表达式1 && 表达式2,左右表达式必须是boolean类型的结果。
两个表达式都为真,结果才是真,只要有一个是假,结果就是假
3.2 逻辑 ||
语法规则:表达式1 || 表达式2,左右表达式必须是boolean类型的结果
左右表达式至少有一个为真,则结果为真
3.3 逻辑非 !
语法规则:! 表达式
真变假,假变真。
注意:
对于 && , 如果左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式.
对于 ||, 如果左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式.
& 和 | 如果表达式结果为 boolean 时, 也表示逻辑运算. 但与 && || 相比, 它们不支持短路求值
3.4 特殊的位运算符(C语言没有)
无符号右移 >>>: 最右侧位不要了, 最左侧补 0.
4. 逻辑控制
4.1 选择(If 与 switch)
if 语句:条件必须是boolan类型的
不能做switch参数的数据类型:float double boolean long
4.2 循环(while , for , do while)
while循环条件为 true, 则执行循环语句; 否则结束循环.
for语句: 表达式1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次
表达式2: 循环条件,满则循环继续,否则循环结束
表达式3: 循环变量更新方式
for(表达式①;布尔表达式②;表达式③){
表达式④;
}
do while语句:先执行循环语句, 再判定循环条件,循环条件成立则继续执行,否则循环结束
注意:
1. do while 循环最后的分号不要忘记
2. 一般 do while 很少用到, 更推荐使用 for 和 while.
4.3 输入输出
while (sc.hasNextlnt0) {
输入输出
int tmp = sc.nextlnt0();
sum += tmp;
num++;
}
循环输出/多组输入:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) { // 循环读入多组数据
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.println(a + b);
}
scanner.close();
}
}
5. 方法
5.1 方法的定义
// 方法定义
修饰符 返回值类型 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
5.2 方法的传参
public static funcl(int[] array) (
array = new int[10];
}
public static funcl(int[] array) (
array[l];
}
方法的返回值:返回一个数组
5.3 方法的重载
1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
3. 与返回值类型是否相同无关
5.4 方法的递归
1.趋近于终止的条件
2.调用自己本身
3.找到递推公式
6. 数组
6.1 数组的定义方式
int[] array = {1,2,3,4};
int[] array = new int[]{1,2,3,4,5,6};
6.2 内存布局
JVM的5块内存:虚拟机栈,本地方法栈、方法区、堆、程序计数器
6.3 数组的访问
数组的长度可以用 数组名 .length 的方式得到
然后利用for循环遍历数组下标即可完成数组的访问
6.4 数组指向null
null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用.
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会抛出 NullPointerException.
6.5 常见的错误
1.数组越界异常
int[] array = {1, 2, 3};
System.out.println(array[3]); // 数组中只有3个元素,下标一次为:0 1 2,array[3]下标越界
// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at Test.main(Test.java:4)
2. 空针异常
int[] arr = null; System.out.println(arr[0]); // 执行结果 Exception in thread "main" java.lang.NullPointerException at Test.main(Test.java:6)
6.6 数组作为参数进行传递
1. 参数传基本数据类型
public static void main(String[] args) {
int num = 0;
func(num);
System.out.println("num = " + num);
}
public static void func(int x) {
x = 10;
System.out.println("x = " + x);
}
// 执行结果
x = 10
num = 0
在func方法中修改形参 x 的值, 不影响实参的 num 值.
2. 参数传数组类型(引用数据类型)
public static void main(String[] args) {
int[] arr = {1, 2, 3};
func(arr);
System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
}
// 执行结果
a[0] = 10
arr[0] = 10
发现在func方法内部修改数组的内容, 方法外部的数组内容也发生改变.
因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的
6.7 数组作为函数的返回值
例子: 获取斐波那契数列的前N项
public class TestArray {
public static int[] fib(int n){
if(n 






