1.面向对象的特性:
1)抽象。将一类对象的共同特征总结出来的过程,包括数据抽象和行为抽象两方面。抽象值关注对象有哪些属性和行为,并不关注这些行为的具体细节
2)继承。
3)封装。把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
4)多态性。指允许不同子类型的对象对同一消息作出不同的响应。分为编译时多态和运行时的多态。方法重载实现的是编译时的多态性(前绑定),而方法重写实现的是运行时的多态
2. 基本数据类型和包装类型
1)Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type);
2)Java中为了能够将基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class);
几个经典考题:
<span style="font-size:18px;">class AutoUnboxingTest {
public static void main(String[] args) {
Integer a = new Integer(3);
Integer b = 3; // 将3自动装箱成Integer类型
int c = 3;
System.out.println(a == b); // false 两个引用没有引用同一对象
System.out.println(a == c); // true a自动拆箱成int类型再和c比较
}
}</span>
其中封装类型和基本数据类型之间的比较,封装类型会自动拆箱
3. 构造器是否可以重写
首先构造器是不能够被继承的,所以就不能被重写,但可以被重载
4.Java中的equal和hasCode之间的关系
1).如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;如果两个对象的hashCode相同,它们并不一定相同。
2).hasCode是根据对象的地址进行映射的,所以在重写equal方法时,必须重写hasCode方法
3).总的来说,hasCode是为了方便在集合中进行元素的查找
5.Java虚拟机
1). 为什么使用java虚拟机?
Java语言一个重要的特点就是平台的无关性,java虚拟就就是实现这一特点的关键。一般的高级程序语言如果要在不同平台上运行,至少需要编译成不同的目标代码,而引入了JVM,java屏蔽了具体平台相关的信息,使得java语言编译程序只需生成在java虚拟机上运行的目标代码。JVM在执行字节码时,把字节码解释成具体平台上的机器码(.class--->机器码)
2).加载.class文件的原理机制
由于JVM得到是多个类文件,java需要在使用这些类的时候,JVM需要确保这个类已经被加载、链接和初始化。类的加载指把类文件读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。
6. 运行时异常和受检异常
1).常见的运行时异常:ArithmeticException/ClassCasteException/NullPointerException/IndexOutOfBoundsException
RuntimeException是不一定需要捕捉的
2). 对于父类异常和子类异常,记住子类异常要catch在前面,父类异常catch在后面(有一种先具体后抽象的概念),一旦异常被捕获之后,就不会再继续存在
7. 线程的sleep()/yield()/wait()方法之间的区别
1). sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复;
2). wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。
3). sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
4). 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
5).sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
8. 事务的问题
1). 读脏:A事务读取了B事务没有提交的事务,而B事务又回滚了,A事务读取的就是脏数据
2). 不可重复读:A事务重复读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过了
3). 幻读:事务A重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务B提交的行
事务的隔离级别:READ UNCOMMIT、READ COMMIT、REPEATABLE、SERIALIZABLE
JDBC如何操作事务:
Connection提供事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;当事务完成后用commit()显示提交事务,如果在事务处理过程中发生异常则通过rollback()进行事务的回滚,还引入了savepoint让事务回滚到指定的保存点
9. 设计模式
-工厂模式:工厂类可以根据条件生成不同的子类实例,但这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作,可以不考虑到底返回了哪个子类直接调用父类
-代理模式:给一个对象提供一个代理对象,并由代理对象控制原对象的引用。
-适配器模式:当一个类想实现一个接口中的多个方法是=时,又不想实现所有的方法时,可以找一个中间的抽象类,实现其中需要的方法