面向对象的特征:封装、继承、多态、抽象
封装给对象提供了隐藏内部特性和行为的能力,对象提供一些能被其他对象访问的方法来改变它内部的数据。在 Java 当中,有 4 种访问权限,对应有三个修饰符 : public、private 、protected,每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。下面列出了使用封装的一些好处:
- 通过隐藏对象的属性来保护对象内部的状态
- 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展
- 禁止对象之间的不良交互提高模块化
继承给对象提供了从基类获取字段和方法的能力、继承提供了代码的重用行、在不修改类的情况下给现存的类添加新特性。
多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力,一个多态类型上的操作可以应用到其他类型的值上面。
抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类,Java 支持创建只暴漏接口而不包含方法实现的抽象的类,这种抽象技术的主要目的是把类的行为和实现细节分离开。
** 备注: 抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对象行为的 细节。一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略。**
final, finally, finalize 的区别
final : 修饰符(关键字),如果一个类被声明为 final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被声明为 final 的。将变量或方法声明为 final,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final 的方法也同样只能使用,不能重载。
finally : 在异常处理时提供 finally 块来执行资源释放操作,如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后就会进入 finally 块(如果有的话)。
finalize : 方法名,Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作,这个方法是由垃圾收集器在确定这个对象没有被引用时在释放对象占用的内存之前会调用该方法,它是在 Object 类中定义的,因此所有的类都继承了它,子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。
Exception、Error、运行时异常与一般异常有何异同
error 表示程序运行出错了,它是一种比较严重的问题,比如说内存溢出,不可能指望程序能处理这样的情况。
exception 表示程序运行过程中可能会出现的异常情况,如果程序运行正常的话不会发生的情况。
异常表示程序运行过程中可能出现的非正常状态。运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,比如说 NullPointerException、IndexOutOfBoundsException、NumberFormatException、ClassCastException、IllegalArgumentException,这类异常的话 Java 虚拟机并不要求声明抛出或者捕获。而对于一般异常 Java 编译器要求方法必须声明抛出或者捕获,常见的这类异常有IOException、SQLException、InternetedException。
int 和 Integer 有什么区别,Integer 的值缓存范围
Java 中有八种基本数据类型,int 就是其中一种,而每一种基本数据类型都有其对应的包装类型,两者之间的转换也称为自动装箱和自动拆箱。
对于 Integer 的值 Java 会进行缓存,值在 -128 - 127 之间的数字会进行缓存。
String、StringBuilder、StringBuffer 的理解
首先 String 字符串常量,被 final 所修饰,不可被继承,StringBuilder 字符串变量,非线程安全,StringBuffer 字符串变量,线程安全,由于 String 是字符串常量,不可变,当涉及到字符串的拼接时会频繁的创建对象,所以这时需要使用 StringBuilder 和 StringBuffer 这两个类了,当然如果没有涉及到多线程的话尽量使用 StringBuilder ,它比 StringBuffer 这个类处理速度要快,当然如果涉及到多线程的话就只能使用 StringBuffer 类了。
重载和重写的区别
方法的重写 Overriding 是父类与子类之间多态性的一种表现,如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写,子类重写的方法访问修饰符的限制一定要大于被重写方法的访问修饰符 (public>protected>default>private),重写方法一定不能抛出新的检查异常或者比被重写方法声明更加宽泛的检查型异常。
重载 Overloading 是一个类中多态性的一种体现,子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。如果在一个类中定义了多个同名的方法,它们有不同的参数个数或者有不同的参数类型,则称为方法的重载 Overloading,Overloaded 的方法是可以改变返回值的类型,也可以有不同的访问修饰符,还可以抛出不同的异常。
抽象类和接口有什么区别
抽象类是对根源的抽象,它表示的是这个对象是什么。同时抽象类中可以没有抽象方法,抽象类中的变量可以任意定义,对于抽象方法是要被实现的,所以不能是静态的也不能是私有的,
接口是对动作的抽象,接口表示的是这个对象能做什么。对于接口中的抽象方法默认是都是公开的,接口里定义的变量只能是公共的静态的常量,接口中一般只做方法的声明,不过在 Java 8 中可以有具体的实现,一种是由 static 修饰,另一种使用 default关键字修饰,对于 static 修饰的由接口名称直接调用,而对于 default 修饰的方法则需要对应的实现类去调用,如果一个类实现了多个接口,而且这些接口中都有相同的默认方法时,此时必须重写掉默认方法,否则编译失败。
反射的用途及实现
当程序运行时,允许动态的改变程序结构或变量类型,通过反射我们可以在运行时获得程序或程序集中每一个类型成员和成员变量的信息。由于在运行时才动态加载的类或调用方法或属性,所以不需要事先(写代码的时候或编译期)知道运行对象是谁。
当我们在使用 IDE 时,当我们输入一个对象名或者类名并想调用它的属性和方法时,一按 (“.”) 点号,编译器就会自动列出它的属性和方法,这里就会用到反射。
反射最重要的用途就是开发各种通用框架,很多框架(比如 Spring)都是配置化的(比如通过 XML文件配置 JavaBean,Action之类的),为了保证框架的通用性,他们可能根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。
先获得一个类的 Class 对象 :
Class> klass = Class.forName(class 全类名); Class> klass = 对象.class; 或者 Class> klass = 对象.getClass(); 又或者 Class> klass = 类名.TYPE;再通过拿到的 Class 对象创建实例 :
Object str = klass.getInstance(); 或者
Constructor constructor = klass.getConstructor(String.class);
//根据构造器创建实例
Object obj = constructor.newInstance(“23333”);
HTTP请求的 GET 与 POST 方式的区别
- GET 方式会将请求的参数拼接在 URL 后面,会显示在地址栏中,而 POST 方式则是 放在请求体中
- GET方式提交的数据最多只能有 1024 字节,POST 方式没有限制
- HTTP 请求默认是 GET 方式,对于敏感的数据类型最好采用 POST 方式提交请求。
Session与Cookie区别
- Cookie 和 Session 都是会话技术,Cookie 是运行在客户端,Session 是运行在服务器端,通过生成的 sessionId 来区分不同的客户,同时将 sessionId 的值通过 Cookie 返回给客户端。
- Cookie 有大小限制以及浏览器在存 Cookie 的个数也有限制,Session 是没有大小限制的,和服务器的内存大小有关。
- Cookie 有安全隐患,通过拦截或本地文件找得到你的 Cookie 后可以进行攻击。
- Session 是保存在服务器端会存在一段时间才会消失,如果 Session 过多会增加服务器的压力。