java基础知识点总结
Java知识点总结
-
Java是一种非常流行的计算机编程语言,其中使用最多的是Java 8(2018年)。
-
JDK是开发工具,JRE是运行环境,JVM是核心所在。JDK包含JRE,JRE包含JVM。
-
安装JDK的时候,两项建议:
a) 路径当中不要有中文或者是空格。
b) 要单独取消外部公共JRE的安装。
-
命令提示符(cmd)
a) 启动:开始 + R,输入cmd回车
b) 切换盘符:“盘符名称:回车”
c) 进入文件夹:cd 文件夹名称
d) 进入多级文件夹:cd 文件夹1\文件夹2\文件夹3
e) 返回上一级:cd ..
f) 返回盘符根路径:cd \
g) 查看当前文件夹的内容:dir
h) 清空屏幕:cls
i) 退出:exit
-
HelloWorld源代码编写:大小写、扩展名、符号、中英文。
-
运行HelloWorld两个步骤:
a) 编译:javac HelloWorld.java
b) 运行:java HelloWorld
-
Path环境变量的配置。
-
Notepad++基本使用,两个设置:设置-首选项-新建-默认语言用Java而且右侧编码选ANSI。
-
程序注释:
a) 概念:对程序代码进行解释说明的文字,不影响程序运行。
b) 单行注释:“//”开头,直到本行结束为止。
c) 多行注释:“/”开头,“/”结尾,中间的都是注释。
d) 文档注释:“/**”开头,“*/”结尾。
-
关键字
a) 概念:被保留的、有特殊含义的词汇。
b) 特点1:完全是小写字母。
c) 特点2:在增强记事本当中有特殊的颜色。
-
常量概念:程序运行期间,不可以发生改变的量。
-
常量的分类:
a) 字符串常量:双引号,可以包含0-n个字符。
b) 整数常量:100、200、1024
c) 浮点数常量:3.14、-2.5
d) 字符常量:单引号,有且仅有一个字符
e) 布尔常量:true、false,只有两个。
f) 空常量:null(不能直接用来打印输出)。
-
变量:程序运行期间,内容在一定范围之内可以发生改变的量。
-
如何使用变量:
a) 第一种方法:
数据类型 变量名称 = 数据值; b) 第二种方法:
数据类型 变量名称;
变量名称 = 数据值; -
标识符:见名知意。类名称每个单词首字母大写;变量名称第一个单词首字母小写,从第二个单词开始首字母大写。
-
数据类型(基本类型和引用类型),基本类型分为:
a) 整数类型:byte、short、int、long
b) 浮点类型:float、double
c) 字符类型:char
d) 布尔类型:boolean
-
运算符:对常量或者变量进行操作的符号。
-
表达式:用运算符连起来的式子。
-
算术运算符:
a) 四则运算:+ - * /
b) 取模运算:%(只看余数)
c) 字符串连接:任何数据类型和字符串连在一起,都是字符串结果
d) 自增自减运算符,单独使用前后没有区别,但是混合使用有重大区别
i. 前++,先加后用
ii. 后++,先用后加
-
赋值运算符:
a) 基本:=
b) 复合:+= -= *= /= %= a += 3如同a = a + 3
-
比较运算符:> < >= <= == !=
-
逻辑运算符:
a) 与 & &&
b) 或 | ||
c) 亦或 ^
d) 非 !
-
Scanner键盘输入的三个步骤:
a) 导包:import java.util.Scanner;
b) 创建:Scanner sc = new Scanner(System.in);
c) 使用:
i. 获取int数值:int num = sc.nextInt();
ii. 获取字符串:String str = sc.next();
-
流程:也就是代码的若干个步骤,先做什么,后做什么。
-
流程分类:
a) 顺序结构
b) 选择结构
c) 循环结构
-
选择结构,if语句的格式三种:
a) 单if语句:执行代码,或者不执行;有或无
b) 标准的if-else语句:执行A或者执行B,二者选其一
c) 扩展的if-else语句:N者选其一
-
循环结构:
a) for循环:格式比较死,擅长控制次数
b) while循环:格式比较灵活,不太在意次数。
i. 标准格式
ii. 扩展格式
-
跳转控制语句:
a) break:一旦执行,整个循环立刻结束
b) continue:一旦执行,当前单次循环立刻结束,马上开始下一次。
-
循环嵌套。
-
数组:一种引用数据类型,容器,可以存放多个数据,但是数据类型一定统一。
-
定义数组:
a) 数据类型[] 数组名称;
b) 数据类型 数组名称[];(了解即可)
-
定义了数组,一定要进行初始化才能使用:
a) 动态初始化:指定长度
b) 静态初始化:指定内容
-
动态初始化的格式:
a) 第一种方法:
数据类型[] 数组名称 = new 数据类型[数组长度]; b) 第二种方法:
数据类型[] 数组名称;
数组名称 = new 数据类型[数组长度]; -
静态初始化的格式:
a) 标准格式:
数据类型[] 数组名称 = new 数据类型[] {元素1, 元素2, 元素3, ...}; b) 简便格式:
数据类型[] 数组名称 = {元素1, 元素2, 元素3, ...}; c) 标准格式可以拆分成为两个步骤;但是简便格式必须一个步骤完成。
-
获取数组的长度:
数组名称.length
注意:数组在内存当中一旦被创建,长度不可以改变。 -
Java内存分为五个部分:
a) 栈(Stack):存放局部变量。
b) 堆(Heap):new出来的。
c) 方法区(Method Area):存放.class相关信息
d) 本地方法区(Native Method Area):与操作系统相关
e) 寄存器(pc Register):与CPU相关,性能极高。
-
方法:就是将一些代码使用大括号包起来,然后取一个名字。使用的时候,只要根据名称调用即可。而且比循环要更加灵活。
-
如何定义一个方法:
修饰符 返回值类型 方法名(参数类型 参数名称) {
方法体
return 返回值;
} -
调用方法的三种方式:
a) 单独调用:方法名称(实际参数);
b) 打印调用:System.out.println(方法名称(实际参数));
c) 赋值调用:数据类型 变量名称 = 方法名称(实际参数);
-
如何定义一个没有返回值的方法:
修饰符 void 方法名称(参数类型 参数名称) {
方法体
// return;
} -
调用没有返回值的方法,只能使用单独调用,不能使用打印调用或者赋值调用。
-
重载(Overload):多个方法的名称相同,但是参数列表不同。
-
重载中,什么叫做参数不同:
a) 参数的个数不同
b) 参数的类型不同
c) 参数的多类型顺序不同
-
重载中,与什么无关:
a) 与返回值类型无关
b) 与参数名称无关
-
参数传递:也就是在调用方法的时候,向方法当中传入数据的动作。
-
参数传递的两项规则:
a) 对于基本类型(以及String)来说,形式参数的操作【不会】影响实际参数。
b) 对于引用类型(除了String)来说,形式参数的操作【会】影响实际参数。
-
面向过程:当需要实现一个功能的时候,每一个过程中的详细步骤和细节都要亲力亲为。
-
面向对象:当需要实现一个功能的时候,不关心详细的步骤细节,而是找人帮我做事儿。
-
类和对象的关系:
a) 类是抽象的,通常不能直接使用。好像是一张手机设计图纸。
b) 对象是具体的,根据类创建一个对象使用,也就是根据图纸创造一个手机。
-
如何定义一个类:成员变量、成员方法。
a) 成员变量:直接定义在类当中,在方法外面。
b) 成员方法:去掉static关键字,其他和此前的普通方法一样。
-
如何根据类创建对象,格式:类名称 对象名 = new 类名称();
-
如何使用对象:
a) 使用成员变量:对象名.成员变量名
b) 调用成员方法:对象名.成员方法名(参数)
-
局部变量和成员变量的不同:
a) 定义的位置不同
b) 内存的位置不同
c) 生命周期不同
d) 默认值不同
-
private关键字用法:直接写在成员变量前面,类外面不能直接访问,确保安全性。间接访问:编写一对儿Getter Setter方法。(特例:如果是boolean类型,getXxx必须叫做isXxx的形式。)
-
this关键字典型用法:用来区分同名的成员变量和局部变量。在成员变量的前面写上“this.”前缀即可。
-
构造方法:专门用来创建对象的方法,通过new关键字创建对象就是在调用构造。
a) 构造方法不能写返回值类型,连void都不能写。
b) 构造方法的名称必须和所在的类名称完全一样,大小写也要一样。
c) 构造方法也是可以重载的。
d) 构造方法如果没有定义,默认送一个;如果定义了,那么默认的不再赠送。
-
如何定义一个标准的POJO类:
a) 所有的成员变量都用private修饰
b) 为每一个成员变量编写一对儿Getter Setter方法
c) 编写一个无参数的构造方法
d) 编写一个全参数的构造方法
-
只要是字符串,必然就是对象。
-
API文档的基本使用。
-
如何创建字符串:
a) 直接赋值双引号,也是一个字符串对象。
b) 可以通过new关键字来调用String的构造方法:
i. public String(char[] array):根据字符数组来创建字符串
ii. public String(char[] array, int offset, int count):根据字符数组当中的一部分来创建字符串。
-
字符串池:是为了节省内存,重复利用相同的字符串。
a) 凡是双引号直接写上的字符串,默认就在池中;
b) 凡是new出来的字符串,默认不在池中。
-
字符串的内容永不可变。每当你觉得好像是应该变量,必然是创建了一个新的字符串。
-
字符串的比较方法:
a) public boolean equals(Object obj):严格区分大小写。
b) public boolean equalsIgnoreCase(String str):忽略大小写
-
字符串的替换方法:
public String replace(CharSequence oldStr, CharSequence newStr) -
字符串的切割方法:
public String[] split(String regex)
注意:不要使用英文句点作为切分的标识,如果非要用英文句点,应该写[\.](file://.) -
集合:和数组类似,但是主要区别就是集合的长度可变,数组的长度不可变。
-
如何创建一个ArrayList集合?
a) 导包:import java.util.ArrayList
b) 创建:ArrayList<泛型> list = new ArrayList<>()
c) 泛型:集合当中存储的是统一的什么类型。
d) 注意:泛型只能使用引用类型,不能使用基本类型。
-
如何使用ArrayList集合,常用方法:
a) 添加:public boolean add(E element)
b) 获取:public E get(int index)
c) 长度:public int size()
-
如何让集合存储基本类型:使用包装类。记住两个特例(int对应Integer,char对应的Character),其他都是首字母大写即可。
-
集合能否存储自定义的类型,例如Person?可以,没问题。
-
IO流是用来传输数据的技术,典型应用包括读写文件。
-
IO流的分类:
a) 字节输入流
b) 字节输出流
c) 字符输入流:FileReader、BufferedReader
d) 字符输出流:FileWriter、BufferedWriter
-
FileWriter一般使用步骤:创、写、关。
a) 创:FileWriter fw = new FileWriter(“file01.txt”);
b) 写:fw.write(“Hello”);
c) 关:fw.close();
-
FileWriter如何才能追加写入呢?构造方法第二个参数为true即可。
-
如何实现换行?
a) Windows当中:\r\n
b) macOS当中:\r或者\n
c) Linux当中:\n
-
五种write方法的重载:
a) 写字符串的整体
b) 写字符串的部分
c) 写字符数组的整体
d) 写字符谁书的部分
e) 写单个字符对应的数字(参考ASCII码表或者Unicode表)
-
FileReader一般使用步骤:创、读、关。
a) 创:FileReader fr = new FileReader(“file01.txt”);
b) 读单个字符:
int ch; // 单个字符的ASCII值
while ((ch = fr.read()) != -1) {
// ...
} c) 读字符数组:
char[] buf = new char[1024];
int len; // 有效个数
while ((len = fr.read(buf)) != -1) {
String str = new String(buf, 0, len);
} -
BufferedXxx和FileXxx有什么区别?BufferedXxx有8192长度的char[]字符数组作为缓冲,所以性能更加高一些。
-
BufferedWriter有额外的方法:public void newLine(),根据操作系统自动选择写入换行符。
-
BufferedReader有额外的方法:public String readLine(),读取一行字符串,不包含换行符。
-
关于方法的参数和返回值类型:
a) 任何数据类型(基本类型、数组、字符串、自定义的类)都可以作为参数。
b) 任何数据类型(基本类型、数组、字符串、自定义的类)都可以作为返回值。
-
使用接口的好处:通用性、隔离性。
-
定义接口的格式:
public interface 接口名 {
// ...
} -
接口的组成部分:
a) 抽象方法【核心内容】
b) 常量
c) 默认方法(Java 8)
d) 静态方法(Java 8)
e) 私有方法(Java 9)
-
定义一个抽象方法,格式:
public abstract 返回值类型 方法名(参数类型 参数名); a) 修饰符public abstract也可以省略不写
b) 抽象方法不可以写方法体大括号
-
接口要想使用,一定要有一个实现类。如何实现?
public class 类名称 implements 接口名 {
// 覆盖重写所有的抽象方法
} -
如何覆盖重写(Override)抽象方法呢?一般步骤:
a) 将抽象方法抄写过来
b) 去掉abstract关键字
c) 写上方法体
-
使用接口和实现类的一般格式:
a) 创建:接口名称 引用名 = new 实现类名称();
b) 调用:引用名.抽象方法名(参数);
c) 注意:
i. 只能调用左侧接口当中定义好的方法,无法调用右侧类当中特有的方法。
ii. 运行程序的时候,方法的执行者其实是右边的类对象。
iii. “调用的时候看左边,但是运行的时候看右边。”
-
从Java 8开始,没有接口的实现类,也可以直接使用接口:Lambda表达式。Lambda表达式就替代了实现类。
-
Lambda使用前提:一定要有函数式接口才能用,没有函数式接口就不能用Lambda表达式。
-
函数式接口:有且仅有一个抽象方法的接口。无所谓有没有@FunctionalInterface,这是一个可选的检测手段而已。
-
使用Lambda必须有推断环境:
a) 要么根据参数类型传参来推断函数式接口
b) 要么就根据赋值语句左侧类型来推断函数式接口
-
Lambda表达式的标准格式:(int a, int b) ->
a) 一些参数(方法的参数)
b) 一个箭头
c) 一些代码(方法体)
-
Lambda表达式的简便格式:
(int num) -> {return ++num;}
(num) -> {return ++num;}
num -> {return ++num;}
num -> ++num; a) 参数的类型可以省略
b) 如果有且仅有一个参数,那么小括号可以省略
c) 如果有且仅有一个语句,那么大括号和return也可以省略
-
对比一下静态方法与成员方法的区别:
a) 静态方法与对象无关,可以直接通过类名称调用:
类名称.静态方法名(参数值); b) 成员方法一定要有对象才能使用:
对象名.成员方法名(参数值); -
方法引用:如果Lambda表达式想做的事情,在某一个地方某一个方法已经做过了,那么就可以使用方法引用来替代Lambda。
-
方法引用的方式:
a) 通过类名称引用静态方法:类名称::静态方法名
b) 通过对象名引用成员方法:对象名::成员方法名
-
Stream流式思想:简化了普通的集合操作,类似于流水线。Stream流在Java当中就是一个java.util.stream.Stream
接口的对象。 a) 如何获取流:
i. 通过集合获取:集合名称.stream()
ii. 通过数组获取:Stream.of(数组名称) 注意,数组当中必须是引用类型元素
b) 映射的方法:map,参数是一个负责转换的Lambda表达式
c) 过滤的方法:filter,参数是一个可以产生boolean结果的Lambda表达式
d) 遍历的方法:forEach,参数也是一个Lambda,Lambda对应的抽象方法应该只有一个参数并且不产生返回值。
e) 如何获取并发流
i. 直接一次性获取并发流:.parallelStream()
ii. 首先获取普通流,然后继续变成并发流:.stream().parallel()
-
模块化思想可以为我们带来两点好处:
a) 整体一整个,文件体积太大。如果只是用到了其中的一部分内容,就会浪费。
b) 精确控制package包级别的访问控制。只有导出的包,模块之外才可以访问,否则只能模块内部自己访问。
c) 模块的描述信息module-info.java文件的基本内容:
module 本模块的名称 {
exports 导出的包名称;
requires 需要依赖的其他模块名称;
}

浙公网安备 33010602011771号