javaSE框架
2020-05-30 09:26:38 82 举报
AI智能生成
JavaSE基础知识点总结
作者其他创作
大纲/内容
Java语言基础
Java语言概述
Java的发展
1995:jdk1.0(java的诞生)
JRE运行环境
JVM
核心库<br>
核心API<br>
集成API<br>
用户界面API
发布技术
JDK开发环境<br>
JRE
编译Java程序的编译器(即javac命令)
1998:jdk1.2
JavaSE<br>
JavaME
JavaEE
2005: jdk1.5
2011: jdk1.7
2014: jdk1.8
Java语言最大的特点
跨平台性
java语言的运行机制<br>
JVM虚拟机
指令集
寄存器
类文件的格式
栈
垃圾回收堆<br>
存储区
第一个Java程序
HelloWorld
javac命令:编译程序
java命令:运行程序
垃圾回收机制<br>
回收特点<br>
流程控制
顺序结构
分支选择结构<br>
单选择结构
双选择结构(典型)
三选择结构
switch
循环结构
当型结构:先判断后执行<br>
while循环语句
for循环语句
直到型循环:先执行后判断
do...while循环语句
break
continue
基本语法
注释
单行注释://
多行注释:/* */
文档注释:/** */<br>
标识符和关键字<br>
标识符规则
关键字<br>
数据类型
基本数据类型
数值类型
整数类型
byte:1个字节
short:2个字节
int:4个字节(常用数据类型)<br>
long:8个字节
char:2个字节<br>
浮点类型
float:4个字节<br>
double:8个字节(默认类型)
BigDecimal<br>
浮点数的表示方法
十进制数<br>
科学计数法
三个特殊的浮点数值
正无穷大
负无穷大
非数
boolean布尔类型:占1位<br>
引用类型<br>
类
接口
数组
类型转换
自动类型转换:表数范围小的向表数范围大的自动转换<br>
子主题
强制类型转换:表数范围大的向表数范围小的自动转换
表达式类型的自动提升
进制转换
二进制:0B或0b开头<br>
八进制:0开头
十六进制:0X或0x开头
运算符
算术运算符
赋值运算符
比较运算符
逻辑运算符
位运算符
类型相关运算符
三目运算符
数组
初始化
静态初始化
动态初始化
异常
java.lang.ArraylndexOutOfBoundsException:N(数组索引越界异常)
增强for遍历数组
数组内存中的运行机制<br>
多维数组
Arrays工具类
int binarySearch(type[] a,type key):<br>
type[] copyOf(type[] original,int length):
boolean equals(type[]a,type[]a2)
void sort(type[]a):该方法对a数组的数组元素进行排序。
String toString(type[]a)
方法
方法的属性
方法的参数传递机制:值传递
递归方法
方法的重载
成员变量和局部变量
成员变量:在类中定义的变量
实例变量:不用static修饰
静态变量(类变量):用static修饰
局部变量:在方法内定义的
形参:方法签名中定义的变量
方法局部变量(在方法内定义的)
<span style="font-size: inherit;">代码块局部变量(在代码块内定义的)</span><br>
面向对象
类和对象
类是对象的抽象
对象是类的具体
对象的引用
this引用
类的组成
构造方法(构造器)
修饰符
构造器的初始化
构造器的重载
成员变量
修饰符
成员方法
修饰符
注意
三大特征
封装
封装的目的
封装的做法
访问控制符
private(同一个类):当前类访问权限<br>
default(同一个包):包访问权限
protected(不同包子类):子类访问权限
public(不同包非子类):公共访问权限(全局范围内都可访问)
访问控制级别
访问控制符的基本原则
包
package
import
继承
创建变量时的内存变化
成员变量,方法的访问特点
调用父类构造器
重写(覆盖,覆写)
重写的规则
重写的特点
创建的是子类对象就优先用子类方法<br>
super关键字限定<br>
三种用法
在子类成员方法中访问父类成员变量
在子类成员方法中访问父类成员方法
在子类构造方法中访问父类构造方法
this关键字
三种用法
在本类的成员方法访问本类的成员变量
在本类的成员方法访问本类中另一个的成员方法
在本类的构造方法访问本类中另一个的构造方法
注意:这个this调用必须是第一个语句
super和this两种构造调用不能同时调用
重写和重载的区别
继承的三个特点
单继承:一个类的直接父类只有唯一一个<br>
多级继承
一个父类可以拥有多个子类
多态
引用类型的类型转换<br>
向上转型:一定是安全的
向下转型:把父类对象还原为本来的子类对象
instanceof 运算符
格式:对象 instanceof 类型,用于判断前面的的对象能否用于后面类型的实例,返回一个布尔值
多态中成员变量的使用特点(编译看左边,运行还看左边)
通过对象调用成员变量:看等号左边是谁,就是谁,没有则向上找
间接通过成员方法调用成员变量:看方法属于谁,就优先用谁,没有则向上找(即子类没有重写方法,就调用父类的, 重写了就调用子类的)
成员方法的访问规则
看new的是谁,就优先用谁,没有则向上找(编译看左边,运行看右边)
多态的好处:不管等号右边,等号左边可以统一
抽象类:包含抽象方法的类
抽象方法
抽象类的使用
注意事项
抽象类不能创建对象
抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
接口
抽象方法
接口使用步骤
接口不能直接使用,必须要有一个实现类实现接口
接口的实现类必须覆盖重写接口中所有的抽象方法
创建实现类对象,进行使用
默认方法(java8)
默认方法可以通过实现类对象直接调用
默认方法也可以被实现类进行覆盖重写
静态方法(java8)
调用格式:接口名称.方法名称
不能通过实现类对象调用静态方法
私有方法(java9)
普通私有方法:解决默认方法中重复代码的问题
静态私有方法:解决静态方法重复代码的问题
常量
注意
关键字
final 关键字
四种用法
修饰一个类
当前这个类不能有子类而且当前类中中的成员方法不能再被重写
修饰一个方法
这个方法不能被重写,而且abstract 不能和final同时修饰方法
修饰一个成员变量
由于成员变量有默认值,用了final 之后必须手动赋值,不然一直是默认值
赋值方式二选一
手动赋值
通过构造方法赋值
必须保证类中所有重载的构造方法对final修饰的成员变量都有赋值
修饰一个局部变量
变量是基本类型,值不变
变量是应用类型,地址不变,内容可变
内部类
成员内部类
内部类用外部类随便用,外部类用内部类,需要借助内部类对象
使用成员内部类的方法
间接方式:在外部类方法中使用内部类,然后在main中使用外部类方法
直接方式:外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称()
内部类方法调用外部类重名成员变量方式:外部类名称.this.外部类成员变量的名称
局部内部类:在方法中定义的,只能在方法中被调用
匿名内部类:如果接口的实现类或者父类的子类只使用一次,就可以省略类的定义,用匿名内部类
注意事项
如果局部内部类想要调用方法中的变量,那么这个变量就一定是final的,java8之后方法中被内部类调用的变量不写final,也默认是final
类和接口的特殊用法
类作为成员变量类型
接口作为成员变量类型
接口作为方法的参数或返回值类型
常用API类
Object类
toString方法
直接打印对象,相当于调用toString方法,没有重写Object的toString方法就只会打印出对象的地址值
equals方法:其他某个对象是否与这个对象相等
比较的类型
基本数据类型:比较的是内容
引用类型:比较的是地址值
hashcode方法:返回对象的哈希吗值
native:代表该方法调用的是本地操作系统的方法
wait方法
notify方法<br>
notifyAll方法
Date类:表示特定的瞬间,精确到毫秒
DateFormat类<br>
Calendar类
System类
StringBuilder类
包装类
Scanner类
Random类
JDK新特性
JDK5新特性
泛型
泛型通配符<br>
通配符高级使用----受限泛型
增强for
可变数量的形参
注解
自动拆箱和装箱<br>
静态导入
导入单个静态成员变量,方法
导入全部静态成员变量,方法
import和import static的区别
枚举
JDK7新特性
二进制字面量
数字字面量可以出现下划线
switch 语句可以用字符串<br>
泛型简化
多异常捕捉:异常的多个catch合并
自动关闭资源(try-with-resources 语句)
JDK8新特性
允许在接口中有默认方法实现
Lambda表达式<br>
函数式编程思想
Lambda表达式的标准格式
Lambda省略格式
Lambda的使用前提
Lambda表达式的特点:延迟加载
方法引用
方法引用符
通过对象名引用成员方法
通过类名称引用静态方法
通过super引用成员方法
通过this引用成员方法
类的构造器引用
数组的构造器引用
函数式接口
格式<br>
@FunctionalInterface注解
常用的函数式接口
Supplier接口
Consumer接口
抽象方法:accept
默认方法:andThen
Predicate接口
抽象方法:test
默认方法:and
默认方法:or
默认方法:negate
Function接口
抽象方法:apply
默认方法:andThen
内置函数式接口
Stream流
流式思想
获取流的方式
根据Collection获取流
根据Map获取流
根据数组获取流
Stream流的of方法
常用方法
延迟方法
过滤:filter
映射:map
取用前几个:limit
跳过前几个:skip
组合:concat
终结方法
forEach
统计个数:count
Stream流的特点:只能使用消费(使用)一次
Map
时间日期API
Annotations
JDK9新特性
集合工厂方法
List接口,Set接口,Map接口的静态of方法
使用前提:当集合中存储的元素的个数已经确定,不在改变的时候使用
注意
对于try-with-resource引入对象的简化<br>
集合
集合与数组的区别
数组的长度是固定的,集合的长度是可变的
数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
Collection:单列集合类的根接口
List接口:元素有序(存储和取出元素的顺序相同)、元素可重复,有索引,包含带索引的方法
Vector实现类(jdk1.0)
数据结构:数组
特点:查询快,增删慢,是同步的,单线程的,速率慢
遍历的方法:elements方法,返回此向量的组件的枚举
ArrayList实现类
数据结构:大小可变的数组
特点:查询快,增删慢,不是同步的,多线程的,速率快
集合添加元素的底层是调用数组的复制,每次添加元素都是新建数组添加到集合中,所以速度慢
LinkedList实现类
数据结构:链表实现
特点:查询慢,增删快,不同步的,多线程,速率快,包含大量操作首尾元素的方法,不能使用多态
Set接口:元素无序(存储和取出元素的顺序有可能不一致),而且不可重复,没有索引,也不能用普通for循环遍历<br>
TreeSet实现类
HashSet实现类
LinkedHashSet集合:具有可预知迭代顺序bSet接口的哈希表和链表实现
特点:底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序,保证元素有序)
HashSet特点
是一个无序的集合,存储元素和取出元素的顺序有可能不一致
底层是哈希表结构,哈希表特点是查询特别快
哈希值
哈希表结构
数据结构
Set集合存储元素不重复的原理
Iterator迭代器
常用方法
Collections集合工具类
常用功能
addAll:往集合中添加一些元素
sort :将集合中元素按照默认规则排序,只能传递List集合,默认是升序
Comparator和Comparable的区别
shuffle:打乱集合顺序
Map集合(接口)
特点
元素是成对存在的,每个元素由键和值两部分组成,通过键可以找到所对应的值
键是唯一的,值可以重复
一个键对应一个值
常用的子类
HashMap类
特点:底层数据结构是哈希表,不同步,是多线程的,速度快
LinkedHashMap类
数据结构是哈希表和链表,具有可预知的迭代顺序
遍历的方法
Entry键值对对象(内部类)
Hashtable 实现类(jdk1.0)
数据结构是哈希表
和HashMap的区别
异常
异常的体系
Throwable根类
Error:无法通过处理的错误
Exception:表示编译期异常,可以通过代码的方式纠正,是必须处理的
RuntimeException:运行期异常
异常的处理
异常处理
try...catch:捕获异常,对出现的异常进行指定方式的处理
finally
作用:无论是否出现异常都会执行
注意事项
finally中有return语句
throw:在指定的方法中抛出一个指定的异常对象
注意事项
throws:声明异常对象
作用
在方法声明时使用,处理方法内部抛出的异常对象,会把异常对象抛出给方法的调用者
Throwable类中3个异常处理的方法
String getMessage:返回此throwable的简短描述
String toString:返回此throwable 的详细信息字符串
void printStackTrace:JVM打印异常,默认此方法,异常信息是最全面的
多异常处理
多个异常分别处理
多个异常一次捕获,多次处理
多个异常一次捕获一次处理
Objects的非空判断:查看指定引用对象是否为null
自定义异常类
多线程
并发与并行
并发:指两个或多个事件在同一个时间段内发生,一个CPU交替执行多个任务
并行:指两个或多个事件在同一时刻发生(同时发生),多个CPU同时执行多个任务
线程与进程
进程
线程
线程的调度
分时调度:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
Thread线程类
创建线程类的方法
继承Thread类,并重写该类的run()方法
声明实现Runnable接口的类,该类实现run方法
实现Runnable和Thread的区别
Thread类的常用方法
getName:获取获取当前线程名称
sleep方法:使当前正在执行的线程以指定的毫秒数暂停
多线程的原理
线程安全
线程同步机制
同步代码块
同步方法
静态同步方法
锁机制
Lock锁 接口(JDK1.5)
线程状态
新建
运行
阻塞
等待
计时等待
死亡
等待唤醒机制
线程池:一个容纳多个线程的容器
线程池的好处
降低资源消耗<br>
提高响应速度
提高线程的可管理性
线程池的使用步骤
IO流
File类
绝对路径
相对路径
常用方法
判断功能的方法
创建和删除的方法
文件过滤器
递归
直接递归
间接递归
注意事项
IO流的分类
根据数据的流向分
输入流
输出流
格局数据的类型分
字节流
字节输出流OutputStream
FileOutputStream类
构造方法
数据追加续写
字节输入流InputStream<br>
FileInputStream类
构造方法
从字节输入流中读取键值对
字符流
字符输入流Reader
FileReader类
构造方法
字符输出流Writer
FileWriter类
构造方法
IO异常的处理
Properties类
缓冲流
字节缓冲流<br>
构造方法
字符缓冲流
构造方法
特有方法
转换流
InputStreamReader类
构造方法
OutputStreamWriter类
构造方法
序列化
序列化流ObjectOutputStream类
构造方法
序列化操作
反序列化流ObjectInputStream类
构造方法
反序列化操作
打印流
PrintStream类
网络编程
网络通信协议
UDP
TCP
网络编程三要素
协议
IP地址:互联网协议地址
端口号:标识设备中的进程(应用程序)
Socket类:实现客户端套接字,套接字指的是两台设备之间通讯的端点
构造方法
成员方法
ServerSocket类:实现了服务器套接字,该对象等待通过网络的请求
构造方法
成员方法
TCP通信分析
JavaSE增强知识
Junit单元测试
测试分类
黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值
白盒测试:需要写代码的。关注程序具体的执行流程
Junit使用:白盒测试步骤
判定结果
红色:失败
绿色:成功
断言
@Before:修饰的方法会在测试方法之前被自动执行
@After:修饰的方法会在测试方法执行之后自动被执行
注解
注解的作用
编写文档:通过代码里标识的注解生成文档【生成文档doc文档】
代码分析:通过代码里标识的注解对代码进行分析【使用反射】
编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
JDK的内置注解
@Override :检测被该注解标注的方法是否是继承自父类(接口)的
@Deprecated:该注解标注的内容,表示已过时
@SuppressWarnings:压制警告
自定义注解
格式
本质:注解本质上就是一个接口,该接口默认继承Annotation接口
属性:接口中的抽象方法
要求
元注解:用于描述注解的注解
@Target:描述注解能够作用的位置
ElementType取值
TYPE:可以作用于类上
METHOD:可以作用于方法上
FIELD:可以作用于成员变量上
@Retention:描述注解被保留的阶段
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承
反射读取注解
反射
Class
newInstance()
获取Class对象的方式
Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
类名.class:通过类名的属性class获取
对象.getClass():getClass()方法在Object类中定义着
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。
获取功能
获取成员变量
获取构造方法
获取成员方法
获取全类名
类加载机制<br>
Method
执行方法:invoke()
获取方法名称:String getName:获取方法名
存在重载,也需要写参数的class类型
Field:成员变量
操作
设置值
获取值
忽略访问权限修饰符的安全检查
Construct:构造方法
newInstance()
获取的时候,需要传递参数的class类型
如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
暴力访问,破坏私有的关键字
setAccessible(true)
性能分析
正常的new>检测关闭的反射>默认的反射
反射的好处
可以在程序运行过程中,操作这些对象。
可以解耦,提高程序的可扩展性。
反射案例
0 条评论
下一页