1. 接口和抽象类的区别
从设计目的上来说:
接口是一种规范,规定其实现类可以调用哪些服务,以及如何调用这些服务。接口是多个模块间的耦合标准,是多个程序间的通信标准。
抽象类是一种模板设计,抽象类作为多个子类的抽象父类,可以看着是系统实现过程的中间产品。这个中间产品他已经确定了部分功能,还有一些功能需要子类进一步完善才能使用。
接口和抽象类在使用上也有很大区别
接口不能有非静态的成员变量(属性)不能有代码块,不能有构造器,
抽象类和普通类一样,是可以有非静态和静态的成员变量的,可以有代码块,也可以有构造器,
抽象类的构造器不是为了创建对象的,是为了子类调用这些构造器完成抽象类的初始化操作
接口只能包含抽象方法,静态方法,默认方法和 JDK9后可以包含私有方法,不能有final方法。不能为普通方法做实现。抽象类则完全可以包括普通方法
接口中可以有内部类(包括内部接口、枚举等)
2. 谈谈对面向接口编程的理解
接口体现的是一种规范和实现分离的设计思想,充分利用好接口可以降低各个模块间的耦合,从而提高系统的可扩展性和可维护性。所以要倡导面向接口编程而不是面向实现类编程,通过接口来降低程序间的耦合。
3. Java异常机制,遇到过异常吗?怎么处理
当程序出现错误,系统会自动抛出异常,Java也允许程序有throw关键字主动抛出异常。如果当前方法不知道如何处理这个异常可以在方法上通过throws关键字将异常抛出,异常会传播到调用这个方法的地方,如果最终传到main方法都没有处理的话,JVM就会中止并打印异常跟踪栈的信息。
在Java中,处理异常的语句包括try、catch、finally三部分组成, 编码的时候try必须有,catch和finally必须有一个。try用于包裹业务代码,catch块用于捕获并处理try中出现的某个异常,处理方法包括给变量赋默认值,直接返回空值,或者抛出一个新的业务异常给调用者处理,finally则用于资源回收,无论是否发生异常finally块一定会执行。
4. Java的异常接口
Throwable 是异常的顶层父类,代表所有非正常情况,有两个直接之类:Error 和 Exception。
Error是错误,一般指与虚拟机相关的问题,比如系统崩溃,虚拟机错误,动态链接失败等,
这种错误无法恢复也无法捕获,将导致应用程序中断。例如OOM
Exception是异常,可以被分为两大类,分别是Checked异常和Runtime异常, 所有的RuntimeException类及其子类都是Runtime异常,比如空指针异常,数值计算异常,数值越界异常等,其他不是RuntimeException的都是Checked异常,Checked异常必须显式的去处理异常,比如用try catch捕获,
5.finally中使用return、throw语句
通常情况下,不要再finally块中使用return、throw等导致方法中止的语句。
一旦使用了return 或 throw语句,会导致try块 和 catch块中return 语句失效
6.说说对static关键字的理解
在Java类里,只能包含成员变量、方法、构造器、初始化块、内部类5中成员,除了构造器,其他的成员变量、方法、初始化块、内部类都可以加static关键字。加了static关键字就是就变成了类成员,和类的生命周期一致。静态成员中不能访问非静态成员,因为静态成员是属于类的,伴随着类的加载而初始化,而非静态成员是伴随的对象的创建而初始化的。静态成员初始化必非静态成员初始化要早。
7.static和final有什么区别
static能修饰成员变量、代码块、内部类、方法这些Java类的成员,static修饰的成员会变成类成员,和类的生命周期一致,伴随着类的加载而初始化,伴随着类的回收而销毁。存在JVM的方法区中。
final 能修饰类、方法、成员变量。被final修饰的类不能被继承、被final修饰的方法不能被重写、被final修饰的成员变量一旦获得初始值就不能修改。
8. 说说对泛型的理解和泛型擦除
Java集合设计的初衷就是把什么都能放进集合,但是这样有一个缺点就是把对象放进集合以后,集合会忘记这个对象的数据类型,再次取出的时候就变成了Object类型,必须强制转化成原来的类型。这会带来编码的复杂也可能引入错误,比如一个专门存Dog类型的集合,也能轻易的放入Cat类型,然后拿出来进行强转的时候可能引发ClassCastException异常。
从JDK5开始引入了泛型的概念,允许程序在创建集合的时候指定集合的元素类型,例如List< String >,表明集合里面只能放String类型的对象。这样程序更加简洁,而且集合自动记住所有集合元素的类型。
为了与老Java代码保持一致,程序也允许不带泛型的集合,当一个带泛型的集合对象赋值给一个不带泛型的集合对象就会发生泛型擦除,在尖括号中的类型信息被扔掉。比如List< String >被赋值给一个List对象。则该List对集合元素的类型检查就变成了Object。
9. List<? super T> 和 List<? extends T> 有什么区别?
List<? extends T> 表示集合中能添加的元素是T,或T的子类,不能直接add添加,需要其他集合赋值给他,只能取,不能加也叫生产者。
List<? super T> 表示集合里能添加的元素是T,或者T的父类,这个可以用add添加,但是不能获取具体的元素,只能获取Object,也叫消费者
10. 说说你对Java反射机制的理解
通过反射可以获得任意一个对象的Class对象,并通过这个Class对象查看这个类的信息
通过反射可以创建任意一个类的实例,并访问该类的实例成员
通过反射机制可以生成一个类的动态代理类或动态代理对象
Java的反射机制在实际项目中应用广泛,常见的应用场景有:
使用JDBC时,如果要创建数据库的连接,需要通过反射机制加载数据库的驱动程序。
多少框架都支持注解或者XML配置,从配置中解析出来的类是字符串,需要通过反射机制实例化
面向切面编程AOP的实现方案,是在程序运行时创建目标对象的代理类,这必须由反射机制来实现
11. Java的四种引用方式
Java的四种引用方式分别是强引用、软引用、弱引用、虚引用,具体含义如下:
强引用:是最常见的引用。即创建一个对象,把这个对象赋给一个引用变量,程序通过该引用变量操作实际的对象。
当对象一个或一个以上的引用变量所引用时,它处于可达状态,不能被系统垃圾回收机制回收。 死不回收
软引用: 内存不足即回收,高速缓存用到软引用
弱引用: 发现即回收,
由于垃圾回收线程优先级很低,所有弱引用也可能存在很长时间,软引用、弱引用都非常适合来保存可有可无的缓存数据。
弱引用: 虚引用和没引用一样, 虚引用的唯一目的是能在对象被回收时收到一个系统通知。