面向对象的特征:
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有那些属性和行为
继承。继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。我们在类中编写的方法就是对实现细节的一种封装;编写的类就是对数据和数据操作的封装。
多态:多态是指允许不同子类型的对象对同一消息做出不同的响应。或者说是用同样的对象引用调用同样的方法但是做了不同的事情。
Equal方法和hashCode方法:
1).如果两个对象相同(equals方法返回true),那么他们的hashCode值一定要相同
2).如果两个对象的hashCode相同,他们并一定相同。
Equals方法:
首先equals方法必须满足自反性(x.equals(x)必须返回true),对称性(x.equals(y)返回true时,y.equals(x)也必须返回true),传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null值的引用x,x.equals(null)必须返回false。
实现高质量的equals方法的诀窍:
- 使用==操作符检查:参数是否为这个对象的引用
- 使用instanceof操作符检查:参数是否为正确的类型
- 对于类中的关键属性,检查参数传入对象的属性是否与之相配
- 编写完equals方法后,问自己它是否满足对称性,传递性,一致性
- 重写equals时总是要重写hashCode
- 不要将equals方法参数中的object对象替换为其他的类型,在重写时不要忘记@override注解
String和StringBuilder,StringBuffer的区别
String是只读字符串,意味着String引用的字符串内容是不能被改变的。而StringBuilder/StringBuffer类表示的字符串对象可以直接修改。StringBuilder和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率比StringBuffer高
Java中的内存泄漏
在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点:1.对象是可达的,即在又向图中,存在通路就可以与其相连 2.对象是无用的,即程序以后就不会再使用这些对象。
理论上Java因为有垃圾回收机制,不会存在内存泄漏问题,然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被gc回收,始终占用内存,因此会导致内存泄露的发生。Session中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭或清空一级缓存就可能导致内存泄漏。
静态变量和实例变量的区别:
静态变量是被static修饰符修饰的变量,也成为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝,实例变量必须依存某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时,可能对象并没有被初始化。
如何实现对象克隆:
1) 实现Cloneable接口并重写object类中的clone()方法
2) 实现serializable接口,通过对象的序列化和反序列化实现克隆,可以实现深度克隆
Error和Exception的区别:
Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题,比如内存溢出,不可能指望程序能处理这样的情况;exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题,也就是说,如果程序正常运行,从不会发生的情况
Collection和Collections的区别:
Collection是一个接口,它是Set、List等容器的父接口;Collections是一个工具类,提供了一系列的静态方法来辅助容器操作,包括对容器的搜索,排序,线程安全化等等
实现多线程的方法:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
前两种方式都要通过重写run方法来定义线程的行为,第二种更好,因为java中的继承是单继承,一个类只有一个父类,如果继承了Thread类就无法在继承其他类了,用Runnable接口更灵活
同步的异步:
如果系统中存在临界资源(资源数量少于竞争资源的线程数量的资源),例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。事实上,所谓的同步就是指阻塞式操作,而异步就是非阻塞式操作
Java中的流:
字节流继承于InputStream,OutputStream
字符流继承于Reader,Writer
JDBC操作数据库的步骤:
- 加载驱动
class.forName(“mysql.jdbc.driver.MysqlDriver”)
- 创建连接
Connection conn=DriverManager.getConnection(“jdbc:…”)
- 创建语句
PrepaerdStatement ps = conn.prepareStatement(“…”)
- 执行语句
ResultSet rs = ps.executeQuery();
- 处理结果
While(rs.next()){
Sysout(rs.getIn()+””+rs.getString());
}
- 关闭资源
Conn!=null conn.close();
Statement和PreparedStatement的区别:
与statement相比,
1)prepareStatement接口代表预编译的语句,他的主要优势在于可以减少sql的编译错误,并增加sql的安全性;
2)preparedstatement中的sql语句是可以带参数的,避免了用字符串连接拼接sql语句的麻烦和不安全;
3)批量处理sql或者频繁执行相同的查询时,preparedstatement有明显的性能上的优势,由于数据库可以将编译优化后的sql语句缓存起来,下次执行相同结构的语句时就会很快
DAO模式:
Data access object,顾名思义是为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据库访问操作。
获得一个类的类对象的方式:
1) 类型.class
2) 对象.getClass()
3) Class.forName()
设计模式:
工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作(多态方法)。当得到子类的实例后,开发人员可以调用基类的方法而不必考虑返回的是哪一个子类的实例
适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起使用的类能够一起工作
模板方法模式:提供一个抽象类,将部分逻辑以具体方法或构造器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑,不同的子类可以以不同的方式实现这些抽象方法(多态实现),从而实现不同的业务逻辑
单例模式:保证整个应用中某个实例有且只有一个(配置文件,工具类,线程池,缓存,日志对象等)
类型:
饿汉模式(1.将构造方法私有化,不允许外部直接创建对象2.创建类的唯一实例并private static修饰 3.提供一个用于获取实例的方法,使用private static修饰)
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
懒汉模式(1.将构造方法私有化,不允许外部直接创建对象2.创建类的唯一实例并private static修饰 3.提供一个用于获取实例的方法,使用private static修饰)
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance(){
if (instance == null) instance = new Singleton();
return instance;
}
}
ORM:
对象关系映射(object relational mapping)是一种为了解决程序的面向对象模型模型与数据库的关系模型互不匹配问题的技术,简单地说,orm是通过描述对象和数据库之间映射的元数据(在Java中可以用xml或注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换为Java对象,其本质就是将数据从一种形式转换到另一种形式
持久层设计和持久层框架:
所谓持久就是将数据保存到可掉电式存储设备中以便今后使用,简单的来说,就是将内存中的数据保存到关系型数据库,文化系统,消息队列等提供持久化支持的设备中,。持久层就是系统中专注于实现数据持久化的相对独立的层面。
持久层设计的目标包括:
数据存储逻辑的分离,提供抽象化的数据访问接口
数据访问底层实现的分离,在数据访问层实现统一的资源调度
数据抽象,提供面向对象的数据操作
持久化框架:mybatis,hiberbate
反射:
反射是Java中一种强大的工具,他能够创建灵活的代码,这些代码可以在运行时装配,无须在组件之间进行链接。反射允许在编写与执行时,使程序代码能够接入装载到jvm中的类的内部信息,而不是源代码中选定的类协作的代码。
不管Java参数的类型是什么,一律传递参数的副本。(如果Java是传值,那么传递的是值得副本,如果Java是传引用,那么传递的是引用的副本)
网友评论