以下内容为学习臧圩人 系列文章的简单总结:
1、类的初始化顺序
- 没有继承关系:静态变量、静态初始化块->变量、初始化块->构造器。
- 涉及继承关系:父类静态变量、父类静态初始化块->子类静态变量、子类静态初始化块->父类变量、父类初始化块->父类构造器->子类变量、子类初始化块->子类构造器。
注意:顿号隔开的部分初始化顺序与它在代码中的先后位置有关。
Java虚拟机中的字符串池缓存字符串对象,对它的理解主要是对intern()方法的理解:
public native String intern();
从它的注释中我们可以看到:通过值比较(equals)判断str是否已经存在于字符串缓冲池上,如果是,则返回它的引用,否则新创建一个对象加入缓冲池,再将它的引用返回。
3、变量(属性)覆盖
private修饰的属性和方法,不会被子类继承,子类的同名属性是对父类相应属性的隐藏,而子类的同名方法是对父类相应方法的覆盖。所以对于:
ParentClass p = SubClass();
访问的是父类被覆盖的属性和子类覆盖后的方法。
对于静态属性和静态方法,推荐使用类名来访问,如果利用对象来访问,决定于这个对象的类型(上面规则的特例)。
final可以修饰变量(基本类型和对象)、方法参数、方法和类。
修饰基本类型,表示基本类型的值不可变,修饰对象,表示引用不可变,但指向的对象属性可以发生改变。final修饰变量和方法参数,表示只可以被赋值一次(JVM的默认值除外)。final修饰的变量具有更高效率,推荐使用。
final修饰方法,表示该方法不可以被重写,但能够被子类继承。
final修饰的类不能够被继承,它的所有方法被当作final的来处理,但它的属性可以被修改。
finally总会早于return, continue, break执行。
并且finally内部的return 结果会覆盖之前执行return的结果。
- 基本类型和基本类型变量被当作参数传递给方法时,是值传递。在方法实体中,无法给原变量重新赋值,也无法改变它的值。
- 对象和引用型变量被当作参数传递给方法时,在方法实体中,无法给原变量重新赋值,但是可以改变它所指向对象的属性。
来自《The Java Programming Language》2.6.5. Parameter Values一节中的这段话说明了一切:
在GBK编码方式下,一个汉字占2个byte,一个英文字母占一个byte。在Java中一个char类型占2个byte。所以char同时可以表示中文汉字和英文字母。
java.lang.StringBuffer提供了使用的方法反转字符串:
public StringBuffer reverse()
java.lang.StringBuilder也提供了与StringBuffer类似的方法,只不过StringBuilder的效率更高,但是它缺少StringBuffer的同步。
7、日期和时间的处理
8、聊聊基本类型
int型的值(不是int型的变量)可以赋值给所有数值类型的变量,包括char:
public class Test {
public static void main(String[] args) {
byte b = (int) 1;
short s = (int) 1;
int i = (int) 1;
long l = (int) 1;
float f = (int) 1;
double d = (int) 1;
char c = (int) 1;
}
}
1. 前期绑定:在程序运行之前进行绑定,由编译器和连接程序实现,又叫做静态绑定。比如static方法和final方法,注意,这里也包括private方法,因为它是隐式final的。
2. 后期绑定:在运行时根据对象的类型进行绑定,由方法调用机制实现,因此又叫做动态绑定,或者运行时绑定。除了前期绑定外的所有方法都属于后期绑定。
多态就是在后期绑定这种机制上实现的。
10、话说多线程
private Lock lock = new ReentrantLock();
public void testLock() {
// 锁定对象
lock.lock();
try {
// do something
} finally {
// 释放对对象的锁定
lock.unlock();
}
}
lock()方法用于锁定对象,unlock()方法用于释放对对象的锁定,他们都是在Lock接口中定义的方法。位于这两个方法之间的代码在被执行时,效果等同于被放在synchronized同步块中。一般用法是将需要在lock()和unlock()方法之间执行的代码放在try{}块中,并且在finally{}块中调用unlock()方法,这样就可以保证即使在执行代码抛出异常的情况下,对象的锁也总是会被释放,否则的话就会为死锁的产生增加可能。
自定义ThreadPool的思路,以及java.util.concurrent包提供的并发框架,更加详细可参考【这里 】
11、这些运算符你是否还记得?