oop-面向对象
编程思想
面向过程编程
面向对象编程
面向接口编程
面向切面编程
函数式编程思想
类和对象
类是对象的抽象,对象是类的实例化
如何创建对应的对象
构造器
定义好一个类之后,会有默认的无参构造方法,如果自己添加了构造方法,则无参构造方法失效
注意:每次写具体的类的时候,一定要写上无参构造方法
this
指代当前对象
用途
可以在构造方法中使用,区分参数和成员属性
在普通方法中使用,表示调用当前的属性或者当前类的方法,可以省略
static
表示静态
用途
可以定义在属性上,被所有的对象共享
可以定义在方法上,可以通过类名直接调用
可以定义在类上,但是是内部类
final
表示最终的
用途
定义在类上,表示类不可以被继承
定义在方法上,表示方法不能被重写
定义在属性上,表示值不可以被修改
package
打包:区分同名的文件,分布在不同的目录
将不同的功能代码整合到一起
静态导包
使用类中的某些方法的时候不在需要写类名,直接调用方法即可
访问修饰符
规定方法、类等的访问范围
分类
protected
只能在本类、本包、继承的子类中使用、
方法的重载
在同一个类中,定义了多个同名的方法
重载有三种展示形式
参数列表的个数不同
参数列表的类型不同
参数列表的顺序不同
封装
广义的封装
在代码中可以将某个代码块变成方法,抽象出某些工具类
狭义的封装
特点
1、将属性设置成私有,不能被外部直接访问
2、提供共有的set和get方法,使外部可以进行调用
3、可以实现更加复杂细致的内部逻辑判断
总结:保护类的内部实现细节,只提供公共的对外访问接口,保护类的安全
继承
解释说明
子类可以拥有父类的某些属性和方法,但是私有的除外
java中式严格意义上的单继承
使用extends关键字来实现继承
重写
当父类中的某些方法不能满足子类的需要的时候,子类可以重写父类的方法,要求跟父类的方法名称一致
子类方法的访问修饰符>父类的访问修饰符
建议添加@override注解,在编译时提示错误
super
表示的是父类的对象
在创建对象的时候,可以在子类中直接通过super关键字调用父类的构造方法
在子类方法中可以使用super.的方法调用父类的方法和属性
多态
通俗解释;对于同一个指令,不同的对象给予的不同反应
前提
1、必须有继承关系
2、子类必须重写父类方法
3、父类引用指向子类对象
父类和子类对象的转换
由子类到父类,自动转换
由父类到子类,强制转换,一般通过instanceof进行判断
接口
接口代表一种能力
接口代表一种规范
接口可以在一定程度上实现java的多继承
接口中的方法都是public abstract这样的访问修饰符,不能包含具体的方法实现
子类如果实现了某个接口,那么接口中的所有方法都要被重写,且实现具体的逻辑,如果没有实现的话,那么子类要么是子接口要么是抽象类
接口中的属性都是常量值
抽象类
抽象类跟接口类似,可以定义抽象方法,也可以包含具体的实现
抽象类和抽象方法需要使用abstract关键字来进行修饰
抽象类的子类必须重写抽象类中的抽象方法,如果不重写的话,那么该子类也会成为一个抽象类
内部类
静态内部类
方法内部类
匿名内部类
使用最多,形式上像是new 接口,但是只适合于该接口只使用一次的应用场景
成员内部类
异常
表示程序在运行过程中出现的非正常情况,编写代码的过程中尽可能少的减少异常出现的情况
分类
Throwable
Exception
运行时异常
在程序运行过程中,由于输入的参数值的不同,可能会发生也可能不会发生
checked异常
编译时异常,在ide中会显示的检查出来
异常的处理
捕获异常
try...catch...
try...catch...finally
在进行异常捕获的时候,return语句的不同位置会造成结果的不同
抛出异常
throws
将异常情况抛出给调用者
注意,如果整个程序的运行过程中都没有异常的处理的话,最终异常会抛给jvm,不太友好,一般都要对异常进行处理
自定义异常
java中提供了非常多的异常类,但是在某些项目中需要自己定义独特的异常处理方式,此时需要自定义异常
步骤
1、继承Exception
2、编写构造方法,可以传入自己想打印的异常信息
3、调用的时候通过throw向外抛出异常
常用类
表示的是一些在程序编写过程中经常用到的类,可以进行提取,变成工具类
分类
String
可变字符串
StringBuffer
StringBuilder
Date
使用比较少,一般用于获取当前时间及当前时间的毫秒值
枚举类
enum
枚举类也是一个类,可以定义属性和方法,甚至可以写构造方法,填写具体的枚举类对象的时候,可以带参数,但是要跟构造方法进行匹配
集合
一组相同类型的数据的集合,可以使用不同的数据结构来存储数据
分类
数组
数据的类型必须是一致的
数组必须在声明的时候显示的给出长度
数组在插入和删除的时候,频繁的移动元素,效率比较低
数组在查找元素的时候可以按照下标查找
注意:排序方法问的相当多
Collection
List:有序不唯一
ArrayList
Vector
LinkedList
Map:键值对的数据
HashMap
扩展知识:ConcurrentHashmap
hashtable
TreeMap
泛型
结合框架中可以使用不同类型的数据进行存储,但是某些方法无法使用,因此提出泛型的概念,来强制约束对应的结合处理类,保证处理的集合都是同一个数据类型
泛型类
泛型接口
泛型方法
io
处理数据的读取和写出,不止是文件,还包含网络数据的处理
详细子类
InputStream
OutputStream
FileInputStream
FileOutputStream
Reader
Writer
FileReader
FileWriter
BufferedInputstream
BufferedOutputStream
BufferedReader
BufferedWriter
ByteArrayInputStream
ByteArrayOutputStream
InputStreamReader
OutputStreamWriter
DataInputStream
DataOutputStream
ObjectInputStream
ObjectOutputStream
PrintStream
System.in
System.out
注意事项
1、创建流之后相当于源数据和目的数据上建议连接,需要占用一定的系统资源
2、每次使用完流之后一定要进行关闭操作
3、字节流是万能的,可以输入输出任意类型的数据
4、在处理纯文本文件的时候可以使用字符流
线程
线程的创建方式
继承Thread类
要在run方法中填写具体的代码逻辑
实现Runnable接口
要在run方法中填写具体的代码逻辑
线程的运行
不要直接调用run方法,而需要使用Thread类的start方法才能够启动线程,直接调用run相当于就是一次普通的方法调用
线程的生命周期
死亡状态
线程正常结构
stop强制结束
异常情况
线程安全问题
使用同步代码块
需要锁定一个监视器对象,也就是共享资源
使用同步方法
死锁
两个线程分别占用一份资源,同时又想占用对方的资源,但是两方谁也不先释放资源
生产者和消费者的问题
高阶知识:线程池
池化技术:频繁的创建和销毁线程比较浪费时间,因此可以将线程放到线程池中,需要的时候直接获取即可,省去创建和销毁的时间,通过可以更加方法的管理线程
分类
newCachedThreadPool
newFixedThreadPool
newSingleThreadPool
newSingleThreadScheduledExecutor
newScheduledThreadPool
ForkJoinPool
newWorkStealingPool
ExecutorThreadPool:创建线程池
参数列表
核心线程数
最大线程数
存货时间
时间单位
线程工厂
拒绝策略
executor方法的执行
execute和submmit方法的区别
线程池的核心执行流程
线程池的生命周期
running
shutdown
stop
tidying
terminated