一,abstract关键字:
abstract关键字表示的是抽象的意思,可以用来修饰类和方法。修饰的类我们称之为抽象类,修饰的方法我们称为抽象方法
二.abstract修饰类,抽象类:
public abstract class 类名{}
抽象类用来表示一些抽象的概念
抽象类的特点:
a.抽象类不能被实例化
b.抽象类中可以有属性,方法,构造方法,都是用来给子类继承
c.抽象类中的方法不一定全部都是抽象方法
三.abstract修饰方法,抽象方法(不需要实现,由子类来实现)
访问修饰符 abstract 返回值类型 方法名(参数列表);
抽象方法的特点:
a.抽象方法没有方法体
b.抽象方法必须出现在抽象类中
c.一个类继承抽象类之后必须实现里面的所有抽象方法
四.抽象类可以继承抽象类
在java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。
加载:将java类的字节码文件加载到机器内存中,并在内存中构建出java类的原型(类模板对象)
1、加载类时,java虚拟机加载步骤
(1)通过类的全名,获取类的二进制数据流
(2)解析类的二进制数据流为方法区内的数据结构(Java类模型)
(3)创建java.lang.Class类的实例,作为方法区这个类的各种数据的访问入口
每个类编译后产生一个Class对象,存储在.class文件中,JVM使用类加载器(Class Loader)来加载类的字节码文件(.class),类加载器实质上是一条类加载器链,一般的,我们只会用到一个原生的类加载器,它只加载Java API等可信类,通常只是在本地磁盘中加载,这些类一般就够我们使用了。如果我们需要从远程网络或数据库中下载.class字节码文件,那就需要我们来挂载额外的类加载器。
一般来说,类加载器是按照树形的层次结构组织的,每个加载器都有一个父类加载器。另外,每个类加载器都支持代理模式,即可以自己完成Java类的加载工作,也可以代理给其它类加载器。
类加载器的加载顺序有两种,一种是父类优先策略,一种是是自己优先策略,父类优先策略是比较一般的情况(如JDK采用的就是这种方式),在这种策略下,类在加载某个Java类之前,会尝试代理给其父类加载器,只有当父类加载器找不到时,才尝试自己去加载。自己优先的策略与父类优先相反,它会首先尝试子经济加载,找不到的时候才要父类加载器去加载,这种在web容器(如tomcat)中比较常见。
类什么时候初始化
1.创建类的实例,也就是new一个对象
2.访问某个类或接口的静态变量,或者对该静态变量赋值
3.调用类的静态方法
一、什么是阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。
这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。
常见的有以下几种
(1)ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列(数组结构可配合指针实现一个环形队列)。
(2)LinkedBlockingQueue: 一个由链表结构组成的有界阻塞队列,而在未指明容量时,容量默认为Integer.MAX_VALUE。
(3)LinkedBlockingDeque: 使用双向队列实现的双端阻塞队列,双端意味着可以像普通队列一样FIFO(先进先出),可以以像栈一样FILO(先进后出)
(4)PriorityBlockingQueue: 一个支持优先级排序的无界阻塞队列,对元素没有要求,可以实现Comparable接口也可以提供Comparator来对队列中的元素进行比较,跟时间没有任何关系,仅仅是按照优先级取任务。
(5)DelayQueue:同PriorityBlockingQueue,也是二叉堆实现的优先级阻塞队列。要求元素都实现Delayed接口,通过执行时延从队列中提取任务,时间没到任务取不出来。
(6)SynchronousQueue: 一个不存储元素的阻塞队列,消费者线程调用take()方法的时候就会发生阻塞,直到有一个生产者线程生产了一个元素,消费者线程就可以拿到这个元素并返回;生产者线程调用put()方法的时候就会发生阻塞,直到有一个消费者线程消费了一个元素,生产者才会返回。
原文链接:https://blog.csdn.net/meihuai7538/article/details/104883129
- ArrayBlockingQueue: 一个基于数组实现的有界阻塞队列,必须设置容量
- LinkedBlockingQueue: 基于链表实现的阻塞队列,容量可以选择进行设置,不设置的话,将是一个无边界的阻塞队列
- PriorityBlockingQueue: 一个无界的阻塞队列,使用的排序规则和PriorityQueue类似并提供了阻塞操作
- LinkedBlockingDeque: 一个基于双端链表的双端阻塞队列,容量可以选择进行设置
问题描述 Java BlockingQueue 阻塞队列的take()和put()方法是线程安全的吗? 多线程下调用take()或者put()方法会出问题吗?
看了BlockingQueue的三个实现类, 发现对应的方法中都使用了锁, 所以不会出现线程安全问题
阻塞队列主要应用场景--‘生产者消费者’模型
阻塞队列元素不能为null,因为null值会作为队列为空时 poll和peek接口的返回值 。并且应该设置边界,如果没有指定容量大小,默认容量是Integer.MAX_VALUE
ConcurrentHashMap是线程安全的使用synchronized关键字
字符变量占位16bit
int占位32bit
类没有实例-需要静态修饰才可调用里面内容
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。
File对象代表磁盘中实际存在的文件和目录。
能够读写文件的是数据流(OutputStream和InputStream)
类的加载顺序。
(1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)
(2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )
(3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )
(4) 父类构造函数
(5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )
(6) 子类构造函数
其中:类中静态块按照声明顺序执行,并且(1)和(2)不需要调用new类实例的时候就执行了(意思就是在类加载到方法区的时候执行的)