面向对象三大特征:
封装、继承、多态
使用类的格式:
类名 变量名 = new 类名();
使用类中的属性与方法格式
使用属性: 变量名.属性
使用方法: 变量名.方法()
8种基本类型对应的包装类
基本类型 | 包装 | 占内存位数 |
---|---|---|
byte | Byte | 8位 |
short | Short | 16位 |
int | Integer | 32位 |
long | Long | 64位 |
float | Float | 32位 |
double | Double | 64位 |
char | Character | 16位 |
boolean | Boolean | 未明确 |
特殊ASCII编码
数字0-9对应十进制为48-57
字母a-z对应十进制为97-122
字母A-Z对应十进制为65-90
Collecton接口常用的子接口有:
List接口、Set接口
List接口常用的子类有:ArrayList类、LinkedList类
Set接口常用的子类有:HashSet类、LinkedHashSet类
List:
ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快
LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合
Set:
HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法
HashSet下面有一个子类LinkedHashSet,它是链表和哈希表组合的一个数据存储结构,元素的存与取的顺序一致
Map集合:
HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法
LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法
Iterator(迭代器)屏蔽不同类型集合的遍历方法
并发修改异常解决办法:在迭代时,不要使用集合的方法操作元素。那么想要在迭代时对元素操作咋办?通过ListIterator迭代器操作元素是可以的,ListIterator的出现,解决了使用Iterator迭代过程中可能会发生的错误情况。
泛型:
指明了集合中存储数据的类型 <数据类型>
? 通配符
? extends Employee 限制的是父类, 上限限定, 可以传递Employee,传递他的子类对象
? super Employee 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象
例如:public static void iterator(ArrayList<? extends Employee> array){}
异常:
异常的根类是Throwable,其下有两个子类:Error与Exception,平常所说的异常指Exception
严重错误Error,无法通过处理的错误
编译时异常Exception,编译时无法编译通过。如日期格式化异常
运行时异常RuntimeException,是Exception的子类,运行时可能会报错,可以不处理。如空指针异常
如果Java没有提供你需要的异常,则可以自定义异常类。
定义方法:编译时异常继承Exception,运行时异常继承RuntimeException
编码表:其实就是生活中字符和计算机二进制的对应关系表。
1、ascii: 一个字节中的7位就可以表示。对应的字节都是正数。0-xxxxxxx
2、iso-8859-1:拉丁码表 latin,用了一个字节用的8位。1-xxxxxxx 负数。
3、GB2312:简体中文码表。包含6000-7000中文和符号。用两个字节表示。两个字节第一个字节是负数,第二个字节可能是正数
GBK:目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中的一部分文字,第一个字节开头是1,第二字节开头是0
GB18030:最新的中文码表,目前还没有正式使用。
4、unicode:国际标准码表:无论是什么文字,都用两个字节存储。
Java中的char类型用的就是这个码表。char c = ‘a’;占两个字节。
Java中的字符串是按照系统默认码表来解析的。简体中文版 字符串默认的码表是GBK。
5、UTF-8:基于unicode,一个字节就可以存储数据,不要用两个字节存储,而且这个码表更加的标准化,在每一个字节头加入了编码信息(后期到api中查找)。
能识别中文的码表:GBK、UTF-8;正因为识别中文码表不唯一,涉及到了编码解码问题。
对于开发而言;常见的编码 GBK UTF-8 ISO-8859-1
文字—>(数字) :编码。 “abc”.getBytes() byte[]
(数字)—>文字 : 解码。 byte[] b={97,98,99} new String(b)
InputStreamReader isr = new InputStreamReader(new FileInputStream(“a.txt”));//默认字符集。
InputStreamReader isr = new InputStreamReader(new FileInputStream(“a.txt”),“GBK”);//指定GBK字符集。
FileReader fr = new FileReader(“a.txt”);
这三句代码的功能是一样的,其中第三句最为便捷。
注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。什么时候用子类呢?
条件:
1、操作的是文件。
2、使用默认编码。
总结:
字节—>字符 : 看不懂的—>看的懂的。 需要读。输入流。 InputStreamReader
字符—>字节 : 看的懂的—>看不懂的。 需要写。输出流。 OutputStreamWriter
用于从流中读取对象的操作流 ObjectInputStream 称为 反序列化流
用于向流中写入对象的操作流 ObjectOutputStream 称为 序列化流
static 静态不能序列化
transient 瞬态关键字-------只要被transient修饰了,序列化时这个属性就不会被序列化了
定义序列号:
static final long serialVersionUID = 1L;
IO流总结
字节流
- 字节输入流 InputStream
1 FileInputStream 操作文件的字节输入流
2 BufferedInputStream高效的字节输入流
3 ObjectInputStream 反序列化流 - 字节输出流 OutputStram
1 FileOutputStream 操作文件的字节输出流
2 BufferedOutputStream 高效的字节输出流
3 ObjectOuputStream 序列化流
4 PrintStream 字节打印流
字符流
- 字符输入流 Reader
1 FileReader 操作文件的字符输入流
2 BufferedReader 高效的字符输入流
3 InputStreamReader 输入操作的转换流(把字节流封装成字符流) - 字符输出流 Writer
1 FileWriter 操作文件的字符输出流
2 BufferedWriter 高效的字符输出流
3 OutputStreamWriter 输出操作的转换流(把字节流封装成字符流)
常用方法:
读数据方法:
- read() 一次读一个字节或字符的方法
- read(byte[] char[]) 一次读一个数组数据的方法
- readLine() 一次读一行字符串的方法(BufferedReader类特有方法)
- readObject() 从流中读取对象(ObjectInputStream特有方法)
写数据方法:
- write(int) 一次写一个字节或字符到文件中
- write(byte[] char[]) 一次写一个数组数据到文件中
- write(String) 一次写一个字符串内容到文件中
- writeObject(Object ) 写对象到流中(ObjectOutputStream类特有方法)
- newLine() 写一个换行符号(BufferedWriter类特有方法)
向文件中写入数据的过程
1、创建输出流对象
2、写数据到文件
3、关闭输出流
从文件中读数据的过程
1、创建输入流对象
2、从文件中读数据
3、关闭输入流
文件复制的过程
1、创建输入流(数据源)
2、创建输出流(目的地)
3、从输入流中读数据
4、通过输出流,把数据写入目的地
5、关闭流
进程:进程指正在运行的程序
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程
创建线程的步骤:
1、定义类实现Runnable接口
2、覆盖接口中的run方法
3、创建Thread类的对象
4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数
5、调用Thread类的start方法开启线程
实现Runnable接口避免了单继承的局限性,所以较为常用。实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦.
线程状态:
新建、运行、堵塞、休眠、等待、结束
Callable接口:
与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常
JavaBean:
JavaBean就是一个类,在开发中常用封装数据。具有如下特性
- 需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序
- 提供私有字段:private 类型 字段名
- 提供getter/setter方法
- 提供无参构造
DBCP连接池:
DataSource接口的实现类,我们要用的具体的连接池 BasicDataSource类
分类 | 属性 | 描述 |
---|---|---|
必须项 | driverClassName | 数据库驱动名称 |
url | 数据库的地址 | |
username | 用户名 | |
password | 密码 | |
基本项(扩展) | maxActive | 最大连接数量 |
minIdle | 最小空闲连接 | |
maxIdle | 最大空闲连接 | |
initialSize | 初始化连接 | |
扩展项 | maxWait | 超时等待时间以毫秒为单位 1000等于1秒 |
UDP/TCP:
UDP面向无连接协议
TCP面向连接的协议
UDP程序交互的流程
发送端
1、创建DatagramSocket对象
2、创建DatagramPacket对象,并封装数据
3、发送数据
4、释放流资源
接收端
1、创建DatagramSocket对象
2、创建DatagramPacket对象
3、接收数据存储到DatagramPacket对象中
4、获取DatagramPacket对象的内容
5、释放流资源
TCP程序交互的流程
客户端
1、创建客户端的Socket对象
2、获取Socket的输出流对象
3、写数据给服务器
4、获取Socket的输入流对象
5、使用输入流,读反馈信息
6、关闭流资源
服务器端
1、创建服务器端ServerSocket对象,指定服务器端端口号
2、开启服务器,等待着客户端Socket对象的连接,如有客户端连接,返回客户端的Socket对象
3、通过客户端的Socket对象,获取客户端的输入流,为了实现获取客户端发来的数据
4、通过客户端的输入流,获取流中的数据
5、通过客户端的Socket对象,获取客户端的输出流,为了实现给客户端反馈信息
6、通过客户端的输出流,写数据到流中
7、关闭流资源
反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
获取Class对象的三种方式
方式一: 通过Object类中的getObject()方法"Person p = new Person();Class c = p.getClass();"
方式二: 通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单
方式三: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可
Class c3 = Class.forName(“Person”)
注意:第三种和前两种的区别
前两种你必须明确Person类型.
后面是指定这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了
反射优点:
1、速度快
2、节省了系统资源
3、利于今后拓展
反射就是把java类中的各种成分映射成一个个的Java对象