框架是个好东西,可早晚有一天会过时,这世界上就没有亘古不变的东西,来学下Java基础吧
线程,进程,程序之间的关系
线程与进程类似,但线程是比进程更小的执行单位,一个进程在执行过程中可以产生多个线程,同类的多个线程共享同一片内存资源
基本状态如下表所示:
线程直接切换的方式
操作系统将JVM的RUNNING和READY合并成一个状态RUNNABLE
程序是静态的代码
进程是程序的一次执行过程,一个进程就是一个执行中的程序,进程与线程最大的不同在于基本上各个进程都是独立的,各个线程则不一样
final关键字的总结
- 变量上
如果是基本数据变量,则一旦初始化后则不能改变(final变量一定要初始化)
- 方法上
不能被重写,锁定方法,防止继承类重写了这个方法,类中所有private方法隐式声明为final类型
- 类上
这个类不能被继承,所有的方法都被隐式的声明为final方法
Java异常处理
Error(错误):一般与代码编写者编写的程序无关,表示运行时候JVM出现的问题【不要想着在程序中去catch Error,已经超出了程序处理的范畴】
Exception(异常):程序本身可以处理的异常
⚠️:异常和错误的区别:异常能被程序本身处理,错误是无法处理。
Throwable类几个常用方法:
- public String getMessage();
返回异常的简要描述
- public String toString();
返回异常的详细信息
- public String getLocalizedMessage();
输出异常的本地化信息,如果子类没有重写这个方法,则调用getMessage()方法
- public void printStackTrace();
在控制台打印的异常信息
异常处理方法:
- try块
后面接零个或者多个catch块,如果没有catch块则必定要有一个finally块
- catch块
处理捕获到的异常
- finally块
无论是否捕获到异常都会调用finally块里面的代码
finally块的补充说明:
如果在try块或者catch块中遇到了return语句时,finally块会在方法返回之前执行,并且如果finally语句里面有返回值,将会覆盖原返回值
finally块不会执行的情况:
finally块第一条语句抛出了异常
在前面的代码(try/catch)中使用了System.exit(int)退出程序
程序所在的线程死亡
CPU关闭
transient关键字
让类中的某些字段不进行序列化
transient只能用来修饰变量,不能修饰类和方法
Java从键盘输入
方法 1:通过 Scanner
Scanner input = new Scanner(System.in);
String s = input.nextLine();
input.close();
方法 2:通过 BufferedReader
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine();
IO流
分类情况:
- 流的流向划分:输入流和输出流
- 操作单元划分:字节流和字符流
- 流的角色划分:节点流和处理流
共涉及到40多个类,大体分为以下两大块:
- InputStream/Reader:所有输入流的基类,字节输入流/字符输入流
- OutputSream/Writer:所有输出流的基类,字节输出流/字符输出流
操作方式具体划分:
操作对象具体划分
如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。
BIO/NIO/AIO的区别:
-
BIO(Blocking I/O):同步阻塞IO模型,数据的读取写入必须阻塞在一个线程内等待其完成
-
NIO(New I/O【Not-Blocking I/O】):同步非阻塞IO模型,在Java 1.4 中引入了 NIO 框架,对应 java.nio 包
-
AIO(Asynchronous I/O):AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2, 它是异步非阻塞的 IO 模型。
浅拷贝,深拷贝
- 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝
- 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新对象,复制内容,此为深拷贝