Java面试题3

Java面试题3

21.final, finally, finalize的区别
1
2
3
4
5
6
7
8
9
10
11
12
1、final修饰符(关键字)。
被final修饰的类,
就意味着不能再派生出新的子类,
不能作为父类而被子类继承。
因此一个类不能既被abstract声明,
又被final声明。将变量或方法声明为final,
可以保证他们在使用的过程中不被修改。
被声明为final的变量
必须在声明时给出变量的初始值,
而在以后的引用中只能读取。
被final声明的方法也同样只能使用,
即不能方法重写。
22.finally是在异常处理时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
提供finally块来执行任何清除操作。
不管有没有异常被抛出、捕获,
finally块都会被执行。
try块中的内容是在无异常时执行到结束。
catch块中的内容,
是在try块内容发生catch所声明的异常时,
跳转到catch块中执行。finally块则是无论异常是否发生,
都会执行finally块的内容,
所以在代码逻辑中有需要
无论发生什么都必须执行的代码,
就可以放在finally块中。3、finalize是方法名。
java技术允许使用finalize()方法
在垃圾收集器将对象从内存中
清除出去之前做必要的清理工作。
这个方法是由垃圾收集器
在确定这个对象没有被引用时对这个对象调用的。
它是在object类中定义的,
因此所有的类都继承了它。
子类覆盖finalize()方法
以整理系统资源或者被执行其他清理工作。
finalize()方法是在垃圾收集器
删除对象之前对这个对象调用的。

###2.Overload和Override的区别。
首先重载和重写是应用于
两个不同场景下面的两种不同的手段:
两者各自的特征:
重载(Overload):
首先是位于一个类之中或者其子类中,
具有相同的方法名,
但是方法的参数不同,
返回值类型可以相同也可以不同。
(1):方法名必须相同
(2):方法的参数列表一定不一样。
(3):访问修饰符和返回值类型
可以相同也可以不同。
其实简单而言:
重载就是对于不同的情况写不同的方法。
比如,同一个类中,
写不同的构造函数用于初始化不同的参数。

重写(override):
一般都是表示子类和父类之间的关系,
其主要的特征是:
方法名相同,
参数相同,
但是具体的实现不同。

重写的特征:
(1):方法名必须相同,返回值类型必须相同
(2):参数列表必须相同
(3):访问权限不能比父类中被
重写的方法的访问权限更低。
例如:如果父类的一个方法被声明为public,
那么在子类中重写该方法
就不能声明为protected。
(4):子类和父类在同一个包中,
那么子类可以重写父类所有方法,
除了声明为private和final的方法。
(5):构造方法不能被重写,
简单而言:就是具体的实现类
对于父类的该方法实现不满意,
需要自己在写一个满足于自己要求的方法。
23. Java中的String,StringBuilder,StringBuffer三者的区别?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
首先说运行速度,或者说是执行速度,
在这方面运行速度快慢为:
StringBuilder >
StringBuffer >
StringString最慢的原因:
String为字符串常量,
而StringBuilder和
StringBuffer均为字符串变量,
即String对象一旦创建之后
该对象是不可更改的,
但后两者的对象是变量,
是可以更改的。
而StringBuilder和StringBuffer的
对象是变量,
对变量进行操作就是
直接对该对象进行更改,
而不进行创建和回收的操作,
所以速度要比String快很多。
String ----> 字符串常量
StringBuffer ----> 字符串变量(线程安全的)
StringBuilder ----> 字符串变量(非线程安全的)
String:
适用于少量的字符串操作的情况
StringBuilder:
适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:
适用多线程下在字符缓冲区进行大量操作的情况
24.GC是什么? 为什么要有GC?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
GC是垃圾收集的意思,
内存处理是编程人员容易出现问题的地方,
忘记或者错误的内存回收
会导致程序或系统的不稳定甚至崩溃,
Java提供的GC功能
可以自动监测对象是否超过作用域
从而达到自动回收内存的目的,
Java语言没有提供释放已分配内存的
显示操作方法。
Java程序员不用担心内存管理,
因为垃圾收集器会自动进行管理。
要请求垃圾收集,
可以调用下面的方法之一:
System.gc()或Runtime.getRuntime().gc(),
但JVM可以屏蔽掉显示的垃圾回收调用。

垃圾回收可以有效的防止内存泄露,
有效的使用可以使用的内存。
垃圾回收器通常是作为
一个单独的低优先级的线程运行,
不可预知的情况下对内存堆中
已经死亡的或者长时间
没有使用的对象进行清除和回收,
程序员不能实时的调用垃圾回收器
对某个对象或所有对象进行垃圾回收。
Java有了GC,
就不需要程序员去人工释放内存空间。
当Java虚拟机发觉内存资源紧张的时候,
就会自动地去清理
无用变量所占用的内存空间。
当然,如果需要,
程序员可以在Java程序中显式地使用System.gc()
来强制进行一次立即的内存清理。
25.构造器如何工作?
1
2
3
4
5
6
7
Java在构造实例时的顺序是这样的:
1、分配对象空间,
并将对象中成员初始化为0或者空
java不允许用户操纵一个不定值的对象。   
2、执行属性值的显式初始化   
3、执行构造器   
4 、将变量关联到堆中的对象上
26.构造器Constructor是否可被override?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
构造器Constructor不能被继承,
因此不能重写Overriding,
但可以被重载Overloading
1). 构造器不能是
native,final,static,synchronized 的,
可以是public,private,或什么都没有。
2). 构造器函数里可以写return呢,
但后面什么都不许有(包括null)
3). 构造器不能返回值.
但如果有个"构造器"返值了,
它就不是构造器喽,只是个普通方法
4). super();this();
这两个方法只能在构造方法里调用.
5). 成员变量声明时候赋值,比构造函数还早.
27.写一个Singleton出来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Singleton模式主要作用是保证在Java应用程序中,
一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,
它的构造函数为private的,
它有一个static的private的该类变量,
在类初始化时实例话,
通过一个public的getInstance方法获取对它的引用,
继而调用其中的方法。

public class Singleton {
private Singleton(){}
  //在自己内部定义自己一个实例,是不是很奇怪?   
//注意这是private 只供内部调用   
private static Singleton instance = new Singleton();
  //这里提供了一个供外部访问本class的静态方法,可以直接访问    
 public static Singleton getInstance() {
    return instance;   
   }
}

第二种形式:
public class Singleton {
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 
  //使用时生成实例,提高了效率!   
 if (instance==null)
    instance=new Singleton();
return instance;   
 }
}

其他形式:
定义一个类,
它的构造函数为private的,
所有方法为static的。
一般认为第一种形式要更加安全些
28.error和exception有什么区别?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Error类和Exception类都继承自Throwable类。
二者的不同之处:
Exception:
1.可以是可被控制(checked)
或不可控制的(unchecked)。
2.表示一个由程序员导致的错误。
3.应该在应用程序级被处理。

Error:
1.总是不可控制的(unchecked)。
2.经常用来用于表示系统错误或低层资源的错误。
3.如何可能的话,应该在系统级被捕捉。

error 表示恢复不是不可能
但很困难的情况下的一种严重问题。
比如说内存溢出。
不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。
也就是说,
它表示如果程序运行正常,
从不会发生的情况。
29.HashMap和Hashtable的区别?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
hashmap:
1.线程不安全
2.允许有null的键和值
3.效率高一点、
4.方法不是Synchronize的要提供外同步
5.有containsvalue和containsKey方法
6.HashMap 是Java1.2
引进的Map interface 的一个实现
7.HashMap是Hashtable的轻量级实现hashtable:
1.线程安全
2.不允许有null的键和值
3.效率稍低、
4.方法是是Synchronize的
5.有contains方法方法
6.Hashtable 继承于Dictionary 类
7.Hashtable 比HashMap 要旧
30.==和equals()区别?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
对于==,
如果作用于基本数据类型的变量,
则直接比较其存储的
“值”是否相等;
如果作用于引用类型的变量,
则比较的是所指向的对象的地址

对于equals方法,
注意:equals方法不能作用于
基本数据类型的变量
如果没有对equals方法进行重写,
则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类
对equals方法进行了重写的话,
比较的是所指向的对象的内容。
-------------本文结束感谢您的阅读-------------
0%