面向对象特征
封装,继承,多态和抽象
-
封装
封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在 Java 当中,有 3 种修饰符: public, private 和 protected。每一种修饰符- 通过隐藏对象的属性来保护对象内部的状态。
- 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。
- 禁止对象之间的不良交互提高模块化
-
继承
给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用,也可以在不修改类的情况下给现存的类添加新特性。 -
多态
多态,是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作,可以应用到其他类型的值上面。 -
抽象
抽象,是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。
Java 支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。
重载和重写的区别?
- 重写 override
- 方法名、参数、返回值相同。
- 子类方法不能缩小父类方法的访问权限。
- 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
- 存在于父类和子类之间。
- 方法被定义为 final 不能被重写。
- 重载 overload
- 参数类型、个数、顺序至少有一个不相同。
- 不能重载只有返回值不同的方法名。
- 存在于父类和子类、同类中。
JDK、JRE、JVM 分别是什么关系?
-
JDK
JDK 即为 Java 开发工具包,包含编写 Java 程序所必须的编译、运行等开发工具以及 JRE。 -
JRE
JRE 即为 Java 运行环境,提供了运行 Java 应用程序所必须的软件环境,包含有 Java 虚拟机(JVM)和丰富的系统类库。 -
JVM
JVM 即为 Java 虚拟机,提供了字节码文件(.class)的运行环境支持。
Java 中的几种数据类型是什么?各自占用多少字节?
Java 支持的数据类型包括基本数据类型和引用类型。
- 基本数据类型如下:
- 整数值型:byte、short、int、long
- 字符型:char
- 浮点类型:float、double
- 布尔型:boolean
- 整数型:默认 int 型,小数默认是 double 型。Float 和 Long 类型的必须加后缀。比如:float f = 100f 。
引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。
- 引用类型包括类、接口、数组等。
- 特别注意,String 是引用类型不是基本类型。
什么是值传递和引用传递?
- 值传递,是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。
- 引用传递,一般是对于对象型变量而言的,传递的是该对象地址的一个副本,并不是原对象本身。
一般认为,Java 内的传递都是值传递,Java 中实例对象的传递是引用传递。
String、StringBuffer、StringBuilder 的区别?
Java 平台提供了两种类型的字符串:String 和 StringBuffer/StringBuilder,它们可以储存和操作字符串。
-
String ,是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的。每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。
-
StringBuffer/StringBuilder 类,表示的字符串对象可以直接进行修改。StringBuilder 是 Java 5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被
synchronized
修饰,因此它的效率也比 StringBuffer 要高。
StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。
String、StringBuffer、StringBuilder的使用
- 操作少量的数据 = String
- 单线程操作字符串缓冲区下操作大量数据 = StringBuilder 。
- 多线程操作字符串缓冲区下操作大量数据 = StringBuffer
String s = new String(“xyz”) 会创建几个对象?
首先,在 String 池内找,找到 “xyz” 字符串,不创建 “xyz” 对应的 String 对象,否则创建一个对象。
然后,遇到 new 关键字,在内存上创建 String 对象,并将其返回给 s ,又一个对象。
所以,总共是 1 个或者 2 个对象。
String 为什么是不可变的?
简单的来说,String 类中使用 final 关键字字符数组保存字符串。代码如下:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
.......
}
所以 String 对象是不可变的
阐述静态变量和实例变量的区别。
静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。
补充:在Java开发中,上下文类和工具类中通常会有大量的静态成员
深拷贝和浅拷贝的区别是什么?
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
如何实现对象克隆?
有两种方式:
- 实现Cloneable接口并重写Object类中的clone()方法;
- 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
equals 与 == 的区别?
值类型(int,char,long,boolean 等基本数据类型)的话
- 都是用 == 判断相等性。
对象引用的话
- == 判断引用所指的对象是否是同一个。
- equals 方法,是 Object 的成员函数,有些类会覆盖(override) 这个方法,用于判断对象的等价性。
Object中有哪些公共方法?
- equals()
- clone()
- getClass()
- notify(),notifyAll(),wait()
- toString()
throw和throws的区别
throw用于主动抛出java.lang.Throwable 类的一个实例化对象,意思是说你可以通过关键字 throw 抛出一个 Error 或者 一个Exception,如:throw new IllegalArgumentException(“size must be multiple of 2″)。
throws 的作用是作为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。Java 中,任何未处理的受检查异常强制在 throws 子句中声明。
final、finally、finalize 的区别?
-
final
final ,是修饰符(关键字)有三种用法- 将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。
- 将变量或方法声明为
final
,可以保证它们在使用中不被改变。被声明为final
的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final
的方法也同样只能使用,不能重写。 - 如果一个类被声明为
final
,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract
的,又被声明为final
的。
-
finally
在异常处理时提供finally
块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入finally
块(如果有的话)。
在以下 4 种特殊情况下,finally
块不会被执行:- 在 finally 语句块中发生了异常。
- 在前面的代码中用了
System.exit()
退出程序。 - 程序所在的线程死亡。
- 关闭
CPU
。
-
finalize
Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。
抽象类和接口有什么区别?
从设计层面来说 抽象是对类的抽象,是一种模板设计。 接口是行为的抽象,是一种行为的规范。
- 类可以实现很多个接口,但是只能继承一个抽象类。类可以不实现抽象类(抽象方法)和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的
- Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的,而抽象类则可以同时包含抽象和非抽象的方法。
- Java 接口中声明的变量默认都是
final
的。抽象类可以包含非 final 的变量。 - Java 接口中的成员函数默认是
public
的。抽象类的成员函数可以是private
,protected
或者是public
。 - 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含
#main(String[] args)
方法的话是可以被调用的。
类的实例化顺序?
初始化顺序如下:
- 父类静态变量
- 父类静态代码块
- 子类静态变量、
- 子类静态代码块
- 父类非静态变量(父类实例成员变量)
- 父类构造函数
- 子类非静态变量(子类实例成员变量)
- 子类构造函数
error 和 exception 有什么区别?CheckedException 和 RuntimeException 有什么区别?
- Error(错误),表示系统级的错误和程序不必处理的异常,是 Java 运行环境中的内部错误或者硬件问题。
- 例如:内存资源不足等。
- 对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由 Java 虚拟机抛出的。
- Exception(异常),表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。Exception 又分为运行时异常,受检查异常。
- RuntimeException(运行时异常),表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止逻辑,因此,编译器不检查这些异常。
- CheckedException(受检查异常),是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理),所以称之为受检查异常。
HTTP 请求的 GET 与 POST 方式的区别
- GET请求
- 请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。
- URL对字符数目有限制,进而限制了用在客户端请求的参数值的数目。
- GET请求的数据会暴露在地址栏中。因此,敏感信息不能用这种方式传递。
- POST请求
- POST请求会把请求的数据放置在HTTP请求包的包体中
- POST可以发送的数据理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制
- POST的安全性比GET的高,POST请求传递的敏感信息对外部客户端是不可见的。
session 与 cookie 区别
http协议是无状态的,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换建立新的连接,也就是说,服务器无法跟踪会话。而cookie 和 session 就是用与解决这种问题。
-
什么是cookie
cookie是客户端
的技术,程序把每个用户数据以cookie的形式写给用户各自的浏览器,当客户端再次访问服务器的时候,会带着各自的Cookie过来,这样服务器就能处理各自用户的数据了。浏览器可以把Cookie禁用了,Cookie功能就会失效。
-
什么是session
session是服务端
的技术,当浏览器第1次访问web资源的时候,服务器会自动为其创建一个session,并保存在服务器,当需要保存用户数据的时候,可以将数据写入session中。当用户访问其他程序的时候,就可以直接从session中取值。值得一提的是sesion是建立在cookie的基础上创建的。