基础关键字
一、staitc修饰函数的局部变量: 特点:有默认值0,只执行一次,运行一开始就开辟了内存,内存放在全局 (唯一)
staitc修饰全局方法和变量: 特点:只能在本源文件使用 可以通过类名.方法名/变量名 直接引用,而不需要new出一个类来(不依赖于类对象的存在而存在,要进行外置声明)
二、final 可以用来修饰类、方法、变量,分别有不同的意义,(死)
final 修饰的 class 代表不可以继承扩展,
final 的变量是不可以修改的,
final 的方法也是不可以重写的(override)
final定义的变量值不可变,方法不可覆写,类不可继承
三、finally 则是 Java 保证重点代码一定要被执行的一种机制。我们可以使用 try-finally 或者 trycatch-finally
来进行类似关闭 JDBC 连接、保证 unlock 锁等动作
总结
1,不要在 finally 中使用 return 语句。
2,finally 总是执行,除非程序或者线程被中断。
四、finalize()是Object中的方法,当垃圾回收器将要回收对象,当一个对象被虚拟机宣告死亡时会先调用它finalize()方法,让此对象处理它生前的最后事情(这个对象可以趁这个时机挣脱死亡的命运,用于释放对象占用的资源(比如进行I/0操作))
finalize 被设计成在对象被垃圾收集前调用,这就意味着实现了 finalize 方法的对象是个“特殊公民”,JVM 要对它进行额外处理。
finalize 本质上成为了快速回收的阻碍者,可能导致你的对象经过多个垃圾收集周期才能被回收。实践中 因为finalize拖慢垃圾收集,导致大量对象堆积,也是一种典型的导致 OOM 的原因。
1、有什么机制可以替换 finalize 吗?
Java 平台目前在逐步使用 java.lang.ref.Cleaner 来替换掉原有的 finalize 实现。Cleaner 的实现利用了幻象引用(PhantomReference),这是一种常见的所谓 post-mortem 清理机制。
利用幻象引用和引用队列,我们可以保证对象被彻底销毁前做一些类似资源回收的工作,比如关闭文件描述符(操作系统有限的资源),它比finalize 更加轻量、更加可靠。
五、super和this的区别
super.父类的成员。。
this:代表当前的对象
六、abstract和 interface
抽象类可以包含抽象方法。 抽象类无法new对象,即无法实例化。抽象类主要是为了被继承而存在的。
抽象类不能被final修饰。(抽象类存在的目的是为了继承,而最终类不可以被继承。)
abstract只能作为其他类的基类
抽象类只能单继承,接口可以多继承;
抽象类可以包含抽象方法和非抽象方法,接口所有方法方法都是抽象方法(JDK1.8之前);
抽象类和接口都可以实现多态。
七、Exception和Error
Error 都会导致程序(比如 JVM自身)处于非正常的、不可恢复状态,既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError 类都是 Error 的子类
Exception 又分为可检查(checked)异常和不检查(unchecked)异常
可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的以部分。
不检查异常就是所谓的运行时异常,类似NullPointerException、ArrayIndexOutOfBoundsException之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不在编译期强制要求
八、throws和throw
语法:
throw :用来抛出一个具体的异常类型,throw (异常对象);
throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。
public void doA(int a) throws Exception1,Exception3{......}
(1)使用位置不同
throw位于方法体内部,可以作为单独语句使用;
throws位于方法头部的参数列表后面,不能单独使用;
(2)内容不同
throw抛出一个具体的异常对象,而且只能是一个;
throws声明抛出的异常类,可以同时声明多个;
(3)作用不同
throw用于在程序中抛出异常,一旦执行说明一定有异常抛出,由方法体内部语句处理异常;
throws用于声明在该方法内可能抛出的异常类,如果抛出了异常,由该方法的调用者处理,层层上抛;