Java基础概述
名次释义:
- Java虚拟机(Java Virtual Machine)java运行的环境。
- 垃圾收集机制(Garbage Collection):由系统控制。
- JDK(Java Development Kit) Java开发工具包
- JRE(Java Runtime Environment) Java运行环境


Java 代码规则:
- 唯一入口 main的方法:固定格式:
public static void main(String[] args){...} - 一个 Java 源文件中最多只能有一个public类,且它必须是该类名命名
- Java中的名称命名规范:
- 包名:xxxyyyzzz
- 类名接口名:XxxYyyZzz
- 变量名和函数名:xxxYyyZzz
- 常量名:XXX_YYY_ZZZ
建议写代码的时候:先将自己的思想通过注释先整理出来,再用代码去体现
一些细节问题:
- “+”可把非字符转换为字符串例如:
System.out.println("5+5="+5+5); //打印结果是55 - 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是负数就另当别论。
- Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法
- java中的数组也是new出来的。 每个数组都有一个属性 length 指明它的长度,默认初始化为全0。
- Java中多维数组不必须是规则矩阵形式:这里可以从其保存引用,而非预分配内存的角度思考。
面向对象
三大特征
- 封装 (Encapsulation)
- 继承 (Inheritance)
- 多态 (Polymorphism)
封装:将函数(接口)和变量(属性)封装成class,对外开放接口、隐藏属性。
继承:实现了后扩展,精简了代码,使得后人在前人的基础上开发,并且已经搭设好的软件平台的业务逻辑不需要改动。
多态:父类引用指向子类对象,子类可能重写父类的方法,父类对象调用子类方法,从而扩展功能。并且不改动软件架构。
动态绑定:直到运行时确定绑定指定的类。现在具体类找,如果没有则在父类总找。
- 每次调用方法都要进行搜索,时间开销太大。
- 所以虚拟机预先为每个类创建一个方法表,在调用方法的时候,只需要查找这个表即可。
静态绑定:程序执行前已经被绑定。
- private: 所属的类绑定
- final: 定义final的父类绑定
- static:类绑定
构造方法: 这里一定注意,和C家族不一样,java没有析构方法。(但我记得有一个finally方法)。可以重载,且有复制构造方法、空参数构造方法。不能继承
this指针:对自身对象的引用。
super指针:指向父类。
访问控制

- 覆盖方法不能使用比被覆盖方法更严格的访问权限
-
覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回值类型
子类对象实例化过程:
结论:
- super(…)和this(…)调用语句不能同时在一个构造函数中出现
- super(…)或this(…)调用语句只能作为构造函数中的第一句出现
x instanceof A:判断x是否为A类对象或者其子类对象。
高级类特性:
static 关键字
- 类属性:先于main存在。可以用类名加方法名访问不存在this和super。
- 类方法:只能访问静态变量。
静态代码块:静态初始化,在main开始之前,且只执行一次。
static {
total = 100;//为total赋初值
}
final 关键字
- final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。
- final标记的类不能被继承。提高安全性,提高程序的可读性。
- final标记的方法不能被子类重写。增加安全性。
- final标记的成员变量必须在声明的同时或在每个构造方法中显式赋值,然后才能使用。
抽象类(abstract 关键字)
- 抽象方法:只有方法的声明,没有方法的实现。以分号结束
- 含有抽象方法的类必须被声明为抽象类。
- 不能用abstract修饰私有方法,构造方法,静态方法。不能被重写继承的方法。
接口(interface 关键字)
- 接口(interface)是抽象方法和常量值的定义的集合。
- 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
- 接口中的所有成员变量都默认是由public static final修饰的。
- 接口中的所有方法都默认是由public abstract修饰的。接口没有构造方法。
- 接口也可以继承另一个接口,使用extends关键字。
异常处理与集合:
异常类层次:

try-catch-finally语句:
try
{
...... //可能产生异常的代码
}
catch( ExceptionName1 e )
{
...... //当产生ExceptionName1型异常时的处置措施
}
catch( ExceptionName2 e )
{
...... //当产生ExceptionName2型异常时的处置措施
}
finally{
...... //无条件执行的语句
}
- throws修饰方法:该方法可能抛出的异常。
- throw在方法体中使用,抛出异常(抛出的类需继承自异常体系,可以自定义)。
- 重写方法不能抛出比被重写方法范围更大的异常类型
Java 集合
Java 集合可分为 Set、List 和 Map 三种
- Set:无序、不可重复的集合
- List:有序,可重复的集合
-
Map:具有映射关系的键值对集合
- Set 使用equals判断两个对象是否相同,而非 == 运算符
- HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能
- HashSet 具有以下特点:
- 不能保证元素的排列顺序
- HashSet不是线程安全的
- 集合元素可以使 null
hash:当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,hashSet 将会把它们存储在不同的位置,但依然可以添加成功。
因此重写 hashCode() 方法的应遵循以下基本原则:
- 在程序运行时,同一个对象多次调用 hashCode() 方法应该返回相同的值
- 当两个对象的 equals() 方法比较返回 true 时,这两个对象的 hashCode() 方法的返回值也应相等
- 对象中用作 equals() 方法比较的 Field,都应该用来计算 hashCode 值
ArrayList 和 Vector 是 List 接口的两个典型实现(细化下)
- 区别:
- Vector是查询效率较低,通常建议使用 ArrayList
- ArrayList 是线程不安全的,而 Vector 是线程安全的。
- 即使为保证 List 集合线程安全,也不推荐使用 Vector
HashMap 和 Hashtable 是 Map 接口的两个典型实现类(细化)
- 区别:
- Hashtable 是一个古老的 Map 实现类,不建议使用
- Hashtable 是一个线程安全的 Map 实现,HashMap 是线程不安全的。
- Hashtable 不允许使用 null 作为 key 和 value,而 HashMap 可以
Collections 是一个操作 Set、List 和 Map 等集合的工具类
泛型枚举与注解:
泛型:(待补充)
分为泛型类和泛型方法,仅仅是数据类型不同,而业务逻辑相同。
优点:降低代码量,实现迟绑定。
枚举:
JDK 1.5 新增的 enum 关键字用于定义枚举类,枚举类和普通类的区别:
- 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
- 枚举类的构造器只能使用 private 访问控制符
- 枚举类的所有实例必须在枚举类中显式列出( ,分隔 ;结尾). 列出的实例系统会自动添加 public static final 修饰
- 所有的枚举类都提供了一个 values 方法, 该方法可以很方便地遍历所有的枚举值
Annotation(注解):
元数据:描述数据的数据。
三个基本的 Annotation:
- @Override: 限定重写父类方法, 该注释只能用于方法
- @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
- @SuppressWarnings: 抑制编译器警告.
JDK 的元 Annotation 用于修饰其他 Annotation 定义
spring 与 spring boot中大量的使用了Annotation,因此关于本节内容,后面在框架中在详细总结。
IO与反射
File 类
File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
IO 流体系

对象的序列化:
如果需要让某个对象支持序列化机制,则必须让的类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
- Serializable
- Externalizable
Class类
- Class 对象只能由系统建立对象
- 一个类在 JVM 中只会有一个Class实例
- 每个类的实例都会记得自己是由哪个 Class 实例所生成
常用方法:
类加载:
java的加载采用双亲依赖模式,使得虚拟机的java类一致。
Java反射机制主要提供了以下功能:
- 在运行时构造任意一个类的对象
- 在运行时获取任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法(属性)
- 生成动态代理
-
反射是动态代理的基础,动态代理可以实习AOP,从而增加代理工作
多线程与网络编程:
术语: 程序、进程、线程
创建多线程的方法:
- 继承 java.lang.Thread 类,重写 run方 法
- 实现java.lang.Runnable接 口,实现接口中的 run 方法
常用方法:
- run方法:包括线程运行时执行的代码,通常在子类中重写它。
- start方法:启动一个新的线程,然后虚拟机调用新线程的run方法
- join 方法:指定的线程加入到当前线程,等其他线程结束后,继续该线程。不释放锁。
- isAlive 方法:判断线程是否活着
- wait()方法:中断方法的执行,使本线程等待,暂时让出 cpu 的使用权,释放锁
- notify()方法:唤醒由于使用wait()方法而处于等待线程。
- notifyall()方法:唤醒所有由于使用这个同步方法而处于等待的线程结束等待。
- getPriority:获取当前线程的优先级
- setPriority:设置当前线程的优先级
Java语言为线程类设置了10个优先级,分别使用1~10内的整数表示 ,整数值越大代表优先级越高。每个线程都有一个默认的优先级,主线程的默认优先级是5。
线程的运行状态
- 新建态(New)
- 就绪态(Runnable)
- 运行态(Running)
- 阻塞态/睡眠态(Blocking)
-
死亡态(Dead)
synchronized关键字
- 确保共享对象在同一时刻只能被一个线程访问,这种处理机制称为“线程同步”或“线程互斥”。Java中的“线程同步”基于“对象锁”的概念
- 分为:同步方法、同步代码块。
网络编程:
客户端Socket的工作过程包含以下四个基本的步骤:
- 创建 Socket。根据指定的 IP 地址或端口号构造 Socket 类对象。
- 打开连接到 Socket 的输入/出流。 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流。
- 按照一定的协议对 Socket 进行读/写操作。通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
-
关闭 Socket。断开客户端到服务器的连接,释放线路
服务器程序的工作过程包含以下四个基本的步骤:
- 对于服务器和客户机而言,将上述第一步改为构造 ServerSocket 类对象,监听客户端的请求并进行响应。
- 调用 ServerSocket(int port) 创建一个服务器端套接字,并绑定到指定端口上。
- 调用 accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。
- 调用 Socket类的 getOutputStream 和 getInputStream 获取输出流和输入流,开始网络数据的发送和接收。
-
最后关闭通信套接字。
JDBC
概念:java连接访问数据库的技术。hibernate、mybatis的基础。
JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题

JDBC URL的标准由三部分组成,各部分间用冒号分隔。
- jdbc:<子协议>:<子名称>
- 协议:JDBC URL中的协议总是jdbc
- 子协议:子协议用于标识一个数据库驱动程序
- 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化.
防范 SQL 注入
防范SQL注入需要对SQL语句预编译,因此JDBC使用PreparedStatement 取代 Statement,PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句

DatabaseMetaData:包含数据源的各种信息。
ResultSetMetaData:包含结果集的各种信息。
事务的ACID(acid)属性:
- 原子性:操作不可分割
- 一致性:转态间跳转
- 隔离性:事务间隔离
- 持久性:提交即永久
数据库事务的隔离级别:
- 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
- 不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
- 幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.

默认为:REPEATABLE READ
JDBC的批量处理语句包括下面两个方法:
- addBatch(String):添加需要批量处理的SQL语句或是参数;
- executeBatch();执行批量处理语句;
通常我们会遇到两种批量执行SQL语句的情况:
- 多条SQL语句的批量处理;
- 一个SQL语句的批量传参;
数据库连接池:避免大量的建立连接、关闭连接的消耗。

DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分:
- DBCP 数据库连接池
- C3P0 数据库连接池
网友评论