开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情
Java面向对象有哪些特征,如何应用
面向对象编程利用的是类和对象编程的一种思想,万物都可归类。类其实就是对事件事物的抽象,不同事物间有不太的关系。
Java面向对象有三个特征:封装继承多态。
封装说明的是应该类的行为和属性与其他类的关系,低耦合高内聚。继承是父类和子类的关系,多态是类和类之间的关系
封装隐藏了内部类的实现机制,给外界一个接口,外界只能通过接口使用整个功能,不需要关心接口内部怎么实现的,它保护了数据。
- 属性的封装,使用者只能通过事先制定好的方法类访问数据,可以方便地加入逻辑控制,限制对属性的不合理操作。
- 方法的封装:使用者按照既定的方式调用方法,奴需要关系方法内部的实现,便于使用,便于修改,增强代码的可维护性
继承是从已有的类派生出新的类,即需要两个类,发生在父与子之间。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的属性方法。比如:父类是动物类,子类可以是猫类,狗类。Java通过extends关键字来实现继承,父类中通过private定义的变量和方法不会被继承,不能在子类中直接操作父类通过private定义的变量以及方法。
继承里面就涉及到方法的重写。子类重写父类的方法。需要满足:两小一大名参同
- 两小:返回类型和异常比父类小
- 一大:访问权限比父类大
- 名参同:方法名,参数和父类一样
相比封装继承,多态是最难的,它是类和类之间关系。多态必备三个要素:继承,重写,父类引用指向子类对象。
ACID靠什么保证?
第一步介绍什么是acid
第二步他的依赖:
- 原子性,由undolog日志保证,它记录回滚日志。当事务测序时候,回滚sql。
- 一致性:由其他三大特征保证,程序代码需要保证业务一致性
- 隔离性:由mvcc控制
- 持久性:由redolog保证,mysql修改时候,会在其中记录,就算数据没有修改成功,业务有记录,使用不会进行数据的丢失。
创建线程的方式
- 继承thread类
public class myThread extends Thread{
public void run(){
System.out.println("thread");
}
}
myThread my=new mythread();
my.start();
步骤:继承thread,重写run方法,创建子线程实例,调用start方法。
- 实现runnable接口。
class myThread implements Runnable{
@Override
public void run(){
System.out.println("thread");
}
}
public static void main(String[] args){
myThread my=new Thread(new myThread());
my.start();
}
步骤:实现runnable接口,实现run方法,传教runnable实例,并把他作为参数用来创建thread,调用start启动。
- 实现Callable接口,并通过FutureTask包装器来创建Thread线程
class myThread<Object> implements Callable<Object>{
@Override
public Object call() throws Exception{
System.out.println("thread");
return null;
}
}
public static void main(String[] args){
Callable<Object> one = new myThread<Object>();
FutureTask<Object> oneTask = new FutureTask<Object>(one);
Thread t = new Thread(oneTask);
System.out.println(Thread.currentThread().getName());
t.start();
}
步骤:实现callable接口,重写call方法,创建callable实例,并且以该实例作为参数,创建FutureTask对象,创建thread对象,然后启动线程
FutureTask参考: Future & FutureTask 使用详解 - 掘金 (juejin.cn)
实现接口比继承 Thread 类所具有的优势主要有:
- 可以避免 JAVA 中单继承的限制;
- 线程池只能放入实现 Runable 或 Callable类线程,不能直接放入继承 Thread 的类
- 代码可以被多个线程共享,代码和数据独立,适合多个相同的程序代码的线程去处理同一个资源的情况
- 线程池 线程池:其实就是管理线程的容器。它可以管理线程,防止线程过多(避免无节制创建线程),导致系统崩溃。并且它可以让线程复用。
线程池需要依赖一些参数来控制任务的执行流程,其中最重要的参数有: corePoolSize(核心线程数)、workQueue(等待队列)、 maxinumPoolSize(最大线程数)、handler(拒绝策略)、 keepAliveTime(空闲线程存活时间) 步骤:
- 判断线程数是不是达到核心线程数,如果没有,新建线程。如果已经到了,转下一步
- 判断等待队列是不是满了,如果没有,放入等待队列,如果满了,进入下一步
- 判断线程数是不是到了最大线程数,如果没有,新建线程,如果有,转下一步 因为已经到最大线程了,使用采用拒绝策略,拒绝该任务
- 新建线程处理完当前任务后,不会立即关闭而是继续处理等待队列中的任务。
- 如果线程的空闲时间达到了存活时间,则线程池会销毁一部分线程, 将线程数量收缩至核心线程数大小。