【Java面试】常见的 Java 面试题(一)

Java基础部分

(知乎总结)

1.面向对象编程(OOP)的特征有哪些?

答:抽象、继承、封装、多态。

1) 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。过程抽象是指任何一个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。数据抽象定义了数据类型和施加于该类型对象上的操作,并限定了对象的值只能通过使用这些操作修改和观察。

2)继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

3)封装是把过程和数据包装起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。一旦定义了一个对象的特性,则有必要决定这些特性的可见性,即哪些特性对外部世界是可见的,哪些特性用于表示内部状态。通常,应禁止直接访问一个对象的实际表示,而应通过操作接口访问对象,这称为信息隐藏。封装保证了模块具有较好的独立性,使得程序维护修改较为容易。

4)多态是指允许不同类的对象对同一消息作出响应。比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

2.什么是GC,其优点和原理是什么?

GC是垃圾收集的意思(Garbage Collection),Java使用GC作为其内存管理机制。由于有垃圾回收的机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效地防止内存泄露,有效利用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时地调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收、标记垃圾回收和增量垃圾回收。垃圾回收机制使得编程者不需要手动管理内存,极大地提高了编程效率。

3.Java编程中,构造方法能否被重写和重载?
答:构造方法可以被重载,但不能被重写。

重载是指在一个类中,两个或两个以上的方法具有相同方法名和不同参数列表,则表示这些方法为重载方法。重写是指在父类和子类中,子类的方法和父类的方法具有相同方法名、相同参数列表、相同返回类型、子类的访问修饰符范围不小于父类的访问修饰符范围,异常的类型和个数不大于或多于父类的异常类型和个数,则表示该方法为重写方法。换句话说重载方法是区分同一个类中相同方法名的方法,重写方法是找到父类相同方法名的方法并重新改变方法的行为。

4.Java编程中,抽象类和接口的区别有哪些?
1)抽象类是abstract class修饰,接口是interface修饰。
2)抽象类可以有任意类型的属性,接口只能有静态常量属性。
3)抽象类可以有普通方法和抽象方法,接口的方法都是抽象方法。
4)抽象类和接口都不能实例化,但是抽象类有构造方法,接口没有构造方法。
5)抽象类只能单根继承,接口可以多重实现。

5.Java编程中,使用接口时的注意事项有哪些?
1)接口中的字段全部默认为public static类型。
2)接口中的方法全部默认为public类型。
3)接口中可以申明内部类,默认为public static。正因为是static,只是命名空间属于接口,代码逻辑不属于接口。所以不违法接口定义。
4)接口本身可以申明为public或者缺省。
5)抽象类继承自某接口。如果在抽象类中实现了接口中的方法,在其子类可以不用实现,否则在子类必须实现。

6.Java编程中,内部类可以引用它的包含类中的成员吗?有没有什么限制?
可以引用
当引用包含类时要用包含类的.this来引用。当引用包含类中的局部变量时,需要将局部变量指定为final。

7.Java编程中,sleep()和wait()方法的区别有哪些?
1)sleep是Thread类的方法,wait是Object类的方法。
2)sleep可以用在任意方法中,wait只能用在同步方法或同步块中。
3)sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。sleep不出让系统资源。wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
4)sleep需要捕获异常,而wait不需要。

8.Java编程中,作用域public, private, protected以及不写的区别?
1)public为公共修饰符,表示任意类都可以访问。
2)protected为受保护的修饰符,表示同类、同包以及不同包但是父子关系的可以访问。
3)private为私有修饰符,表示只有同类中可以访问,出了这个类就不能访问了。
4)不写表示默认修饰符,或者称为package修饰符,该修饰符表示只有同类或同包下的类可以访问,出了这个包就不能访问了。

9.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的.

10.XML有哪些解析技术?有什么区别?
基本的解析方式有三种: DOM, SAX, Pull。
1)DOM解析解析器读入整个文档,构建一个驻留内存的树结构,然后程序中就可以使用DOM接口来操作这个树结构。优点是对文档增删改查比较方便,缺点占用内存比较大。
2)SAX解析基于事件驱动型,优点是占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改查。
3)PULL解析同样基于事件驱动型,Android官方API提供这种方法。

11.什么是Java序列化,如何实现?
1)序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化为了解决在对对象流进行读写操作时所引发的问题。
2)序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出,要恢复的话则用输入流。

12.Java编程中,“==”和equals方法有什么区别?
1)== 是判断两个变量或实例是不是指向同一个内存空间。equals是判断两个变量或实例所指向的内存空间的值是不是相同。
2)== 是指对内存地址进行比较。equals是对字符串的内容进行比较。
3)== 指引用是否相同。equals指的是值是否相同。

13.Integer和int的区别是什么?
Integer为包装类,int是基本数据类型。包装类拥有方法和属性,基本数据类型不具备。包装类可以通过intValue来转换成基本数据类型,也可以通过new Integer()将基本数据类型转换为包装类。在JDK1.5后,包装类和基本数据类型可以实现自动转换。

14.Java编程中,运行时异常与一般异常的区别?
1)运行时异常是指继承于RuntimeException的异常,这些异常在编译时可以不进行处理,当运行时如果出现问题才会抛出。如NullPointException, ArrayIndexOutOfBoundsException。
2)一般异常也称为编译时异常,这些异常是继承Exception但又不属于RuntimeException的子类,如果程序中出现这些异常,在编译时必须进行捕获或抛出,否则编译无法通过,如IOException, FileNotFoundException。

15.try语句块里有一个return语句,那么紧跟在这个try后的finally语句块会不会被执行?如果会被执行,执行的时机是什么?
答: 会在return前执行。

16.在异常处理当中throw和throws有什么区别和联系?
1)throw是在代码中抛出一个异常,后面跟的是异常对象,虚拟机运行到这里时会立即引发一个异常。
2)throws是写在方法声明上的,表示声明该方法可能会抛出异常,后面跟的是异常类型。调用该方法的时候可以选择处理它或继续往外抛出。

17.Java编程中,关键字final,finally和finalize的区别是什么?
1)final是修饰符,可以修饰类(不能被继承)、属性(常量)、
和方法(不能被重写)。
2)finally是异常处理块中的代码块,表示无论如何都会执行的代码块。
3)finalize是Object类的方法,该方法在对象被垃圾回收之前被执行。

18.Java编程中,Iterator和Enumeration的不同点?
1)函数接口不同
Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。Iterator有3个函数接口,Iterator除了能读取集合的数据之外,也能数据进行删除操作。
2)Iterator支持fail-fast机制,而Enumeration不支持。Enumeration是JDK 1.0添加的接口,使用到它的函数包括Vector, Hashtable等类,这些类都是JDK 1.0中加入的。Enumeration存在的目的就是为它们提供遍历接口,Enumeration本身并没有支持同步,而在Vector, Hashtable实现Enumeration时,添加了同步。而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap, ArrayList等集合提供遍历接口。
3)Iterator是支持fail-fast机制的。fail-fast机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了,那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

你可能感兴趣的:(Java)