1)子类的构造方法总是先调用父类的构造方法,如果子类没有显式的指明调用父类的哪一个方法,子类就会调用父类的无参数构造方法。如果在这时父类并没有无参数构造方法就会报错。显式super();
2)类成员访问权限,
类型 | 范围 |
---|---|
public | 随意访问 |
protect | 子类(同不同包都可以) |
fiendly(默认) | 同一包 |
private | 本类 |
3)sleep和wait的学习
java的多线程是抢占式的机制,而不是分时, 在抢占的机制下会有多个线程处于可运行的状态,但是只有一个线程运行
共同点:
- 都在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并且返回。
- wait()和sleep都可以使用interrupt打断线程的暂停状态,从而使线程立刻抛出interruptedException
例如,线程B如果想立刻停止A,则可以对线程A对应的thread实例调用intertupt。如果A处于sleep,wait join则A会立刻抛出异常,在catch处return即可结束
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。
不同点:
每个对象都有一个锁来控制同步访问,synchronized关键字可以和对象的锁交互,来实现线程的同步
sleep没有释放锁,而wait方法释放了,使得其他的线程可以使用同步控制块或者方法wait、notify和notifyall只能在同步控制方法或者同步控制块厘米昂hi用,但是sleep可以在任何地方使用
- sleep必须捕获异常,而wait.notify,notifyall不需要捕获异常
- sleep线程类thread的方法,导致此线程暂停执行指定时间,让出执行机会给别的线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁
wait是obj的方法,对此对象调用wait导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象打出notify方法后本线程才进入对象锁定池准备获得对象锁进入运行状态。
4)集合框架中的线程安全类
vector:比arraylist多一个同步化机制,但是效率低,不建议使用
statck:堆栈类,先进后出
hashtable:比hashmap多一个线程安全
enumeration:枚举,相当于迭代器
除了这些之外,其他的都是非线程安全的类和接口。
5)代码的执行顺序
静态块>main()>构造块>构造方法
静态块:用static申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
类似这里
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static void main(String[] args)
{
B t = new B();
}
}
输出的结果是:构造块 构造块 静态块 构造块
6)接口和抽象类在方法上的区别
元素 | 接口 | 抽象类 |
---|---|---|
普通方法 | 不可 | 可以包含 |
非抽象普通方法 | 必须抽象 | 可以 |
普通成员变量 | 不可 | 可以 |
静态方法 | 不可 | 可以 |
静态成员变量 | 访问类型是public static final | 可以 |
7)final修饰的后果
元素 | 后果 |
---|---|
方法 | 不允许被子类覆盖 |
类 | 不能被继承 |
变量 | 不能改变值 |
引用类型 | 不能再指向别的东西,但是可以改变其中的内容 |