目录
1.静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?
3.String、StringBuffer与StringBuilder的区别
1.静态内部类、内部类、匿名内部类,为什么内部类会持有外部类的引用?持有的引用是this?还是其它?
静态内部类:使用static修饰的内部类
内部类:就是在某个类的内部又定义了一个类,内部类所嵌入的类称为外部类
匿名内部类:使用new生成的内部类
因为内部类的产生依赖于外部类,持有的引用是类名.this
2.equals与==的区别:
==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相等
3.String、StringBuffer与StringBuilder的区别
String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象 StringBuffer和StringBuilder底层是 char[]数组实现的 StringBuffer是线程安全的,而StringBuilder是线程不安全的
4.final、finally、finalize 的区别
final:用来修饰类,方法和变量(成员变量或局部变量)。
finally: 作为异常处理的一部分,它只能用在
try/catch 语句中,并且附带一个语句块,表示这段语句 正常情况下会被执行(非正常情况:System.exit(0); System.kill();interrupted被打断),经常被用在需要释放资源的情况下。
finalize():
在
java.lang.Object
里定义的,也就是说每一个对象都有这么个方法。这个方法在
gc 启动,该对象被回收的时候被调用。其实 gc
可以回收大部分的对象(凡是
new
出来的对象,
gc
都能搞定, 一般情况下我们又不会用 new
以外的方式去创建对象),所以一般是不需要程序员去实现
finalize
的。 特殊情况下,需要程序员实现 finalize
,当对象被回收的时候释放一些资源,比如:一个
socket
链接,在 对象初始化时创建,整个生命周期内有效,那么就需要实现 finalize
,关闭这个链接。
1.1 final修饰类
当用 final
修饰类的时,表明该类不能被其他类所继承。当我们需要让一个类永远不被继承,此时就可以用 final
修饰,但要注意:
final
类中所有的成员方法都会隐式的定义为
final
方法。
1.2 修饰方法
使用 final
方法的原因主要有两个:
(1) 把方法锁定,以防止继承类对其进行更改。
(2) 效率,在早期的
java
版本中,会将
final
方法转为内嵌调用。但若方法过于庞大,可能在性能上 不会有多大提升。因此在最近版本中,不需要 final
方法进行这些优化了。
1.3 修饰变量
final 成员变量表示常量,只能被赋值一次,赋值后其值不再改变。类似于
C++
中的
const
。
当
final
修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果 final 修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的 内容是可以发生变化的。本质上是一回事,因为引用的值是一个地址,final
要求值,即地址的值不发生变化。
final 修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式
,一种是在变量声明 的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数 中对这个变量赋初值。
当函数的参数类型声明为 final
时,说明该参数是只读型的。即你可以读取使用该参数,但是无法改变 该参数的值。