1.复习面向对象
封装:将一个事物属性私有化(private),保证数据安全性,对外提供公共的访问方法(setter/getter)
private关键字特点:被其修饰的变量或者方法只能在本类中访问,外界不能够直接访问,但是可以通过公共的访问方法来访问
构造方法
介绍:构造方法是方法名和类名相同的方法,不过这个方法没有返回值,也没有void
注意:当一个类中没有构造方法,系统默认提供一个无参构造方法,如果有有参构造方法,则系统不在默认提供无参构造方法,因此建议永远给出无参构造方法
目的:就是给成员变量进行显式初始化的
如何输出自定义类对象的信息:直接输出自定义类的具体对象,输出值为对象的空间地址值,重写Object类的toString()方法即可得到对象信息的简易表达式
给成员变量赋值方式:
setter()方法
有参构造方法
javaBean规范
1.这个类必须为具体类
2.这个类必须有私有属性
3.这个类必须有公关的setXXX()/getXXX()方法
4.这个类必须实现Serializable接口(这个类的数据可以变为流,在网络中传输)
static关键字
被static修饰的变量/方法,随着类的加载一起加载
优先于对象存在
可以被多个对象共用,共享
被修饰的推荐访问方式:类名.变量名/方法名();
静态方法只能访问静态方法
继承:将多个类的共性内容抽取出来,放在一个独立的类中,多个类和独立类产生的关系就是继承
好处:
1.提高代码复用性
2.提高代码维护性
3.类和类之间的关系,是多态的前提条件
特点:
只能单继承,不能多继承,但是支持多层级继承
成员访问问题
成员变量:遵循就近原则,先找最近的局部位置,之后子类成员位置,最后父类成员位置,都没有就报错
构造方法:子类不能继承父类构造方法,但是可以通过super来访问父类的构造方法,子类所有的构造方法默认访问父类无参构造方法
父类没有无参构造方法,子类构造方法如何访问
手动给出父类无参构造方法
让子类的构造方法都访问父类的有参构造方法
只要子类一个构造方法能够让父类初始化即可
成员方法:子类继承父类,如果出现了父类一模一样的方法,方法重写,就是要子类功能,子类将父类覆盖了
多态:一个事物体现的不同形态,在程序中为对象在内存中的变化
前提条件
1.必须具有继承关系
2.存在方法重写
3.必须有父类引用指向子类对象
成员访问特点
成员变量:编译看左,运行看左
成员方法:编译看左,运行看右
构造方法:存在继承关系,分层初始化,先父类初始化,然后是子类初始化
多态的好处
1.提高了代码复用性
2.提高了代码扩展性
多态弊端
不能访问子类特有功能
如何访问子类特有功能:向下转型
2.设计模式之单例设计模式
单例模式:内存中始终只有一个类对象存在
实现方式
饿汉式:永远不会出现问题的单例模式
1.在类成员位置,创建一个静态实例变量
2.构造方法私有化,外界不能够创建对象,保证安全性
3.提供静态的公共访问方法,返回值就是当前类本身
懒汉式:可能会出现安全问题的单例模式
1.在类的成员位置,声明当前类的静态变量
2.构造方法私有化,外界类不能创建对象,保证安全性
3.判断当前静态变量是否为空,用的时候才去创建对象
3.集合
分类:单列集合Collection,双列集合Map
关系:Collection集合的子接口set分为HashSet和TreeSet底层都是Map接口实现类HashMap和TreeMap实现的
Collection集合子接口List遍历方式
1.Object[] toArray()
2.size()和get()方法结合
3.Collection的迭代器Iterator iterator()
4.List的列表迭代器ListIterator listIterator()
5.增强for循环
for(集合数据类型 变量名:对象名称){
使用变量名
}
Map集合的遍历方式
1. Set<K> keySet() + V get(K,key)
2.Set<Map.entry<K,V>> entrySet():获取所有键值对对象
K getKey()
V getValue()
TreeSet<E>存储自定义类型,如何实现自然排序或者比较强排序
TreeSet底层依赖于TreeMap红黑树结构(类似二叉树)
要实现自然排序,存储类型的类必须实现compareable接口,重写compareTo()方法,按照三元运算操作,进行排序规则,并且TreeSet使用无参构造方法
要实现比较器排序:使用有参构造方法TreeSet<E>(Comparator<E> com)
TreeSet<Student> ts = new TreeSet<E>(new Comparator<Student>(){
public int compare(student s1,student s2){
int num = s1.getAge()-s2.getAge();
int num2 = (num==0)?(s1.getName().compareTo(s2.getName())):num;
retuen num2;
}
})
4.多线程
线程一个有几种状态
6种
新建,运行,阻塞,死死等待,超时等待,死亡
创建线程的方式
继承实现:
自定义一个类,继承Thread类
在main方法中,创建自定义类对象
启动线程,start()
接口实现:使用到了静态代理,静态代理最大特点就是代理角色和真实角色必须实现同一个接口
自定义一个类,实现Runnable接口,这个类为资源共享类
创建资源共享类对象
创建Thread类对象,将资源共享类对象作为参数传递进去
启动线程
线程池:ExecutorService 接口,具体子实现类
工厂类
Executors的静态功能
public static ExecutorService newFixedThreadPool(int nThread):创建一个具有固定数量线程的线程池
ExecutorService:
Future<V> submit(Callable<V> call):提交异步任务
Future:线程异步计算的结果
自定义类实现callable方法,重写call方法,进行计算
void shutdown():关闭线程池
检验多线程安全问题的标准
1.查看是否有多线程环境
2.是否存在共享数据
3.是否有多条语句对共享数据进行操作
解决多线程安全问题的方式
1.使用同步代码块将对数据进行操作的语句包裹起来,解决安全问题
2.使用Lock锁对象ReentrantLock
lock():获取锁
unlock():释放锁
5.IO流
按照类型及流方向划分
字节输入流:执行读操作
InputStream
FileInputStream:文件字节输入流
BufferedInputStream:字节缓冲输入流
字节输出流:执行写操作
OutputStream
FileInOutputStream:文件字节输出流
BufferedOutputStream:字节缓冲输出流
字符输入流:执行读操作
Reader
InputStreamReader:字符转换输入流
FileReader(String path):符转换输入流便捷类
字符输出流:执行写操作
Writer
InputStreamWriter:字符转换输出流
FileWriter(String path):字符转换输出流便捷类