一、final与static的区别
1.1、static
静态方法随着类的加载而加载到方法区中,但是在方法区中不执行只存储,在方法被调用的时候到栈内存执行。静态方法先于对象存在,所以习惯上是通过类名来调用静态方法。
一旦用了static,这样的内容就不再属于对象自己,而是属于类的,只在类当中保存唯一一份;本类对象共享同一份static数据,
(1)多个对象共享static数据
如果一个成员变量使用了static修饰,那么这个数据就不属于某一个对象了,而是属于类的,多个对象共享一个数据(也就是多个对象的这个数据变量是一样的,而且一个对象修改了这个数据,其他对象的这个数据也被修改);
应用:static countNumber 计数器(每创建一个对象就将计数器变量值加1,而且在类的构造方法【带参数但是不包含ID参数】中为ID成员变量赋值为计数器)
(2)静态方法属于类,不属于对象;
没有static的方法只能通过对象来调用,static的方法既可以通过对象来调用(这种情况在Javac编译之后变成类名.静态方法),也可以通过类名来调用(推荐);
对于本类中的静态方法,可以省略类名称;
注意事项:
1、静态方法不能直接访问非静态(因为在内存中先有的静态内容,后有的非静态内容——“先人不知道后人,但是后人知道先人”);
2 、静态方法中不能使用this,因为this代表调用该方法的当前对象,但是静态方法与对象毫无关系;
3、通过类名称访问静态成员变量的时候,全程和对象没有关系,只和类有关系;
4、静态内容总是先于非静态内容执行;
(3)static变量的内存图:

(4)静态代码块:
public class 类名称{ static{...}}
特点:当第一次调用本类时,静态代码块执行唯一的一次,之后再调用就不执行了;
典型用途:用来一次性地对静态成员变量进行赋值(比如JDBC部分);
2、final关键字:
一旦使用final修饰,就表明不可改变;
final关键字可以修饰:类、成员方法、成员变量、局部变量;
修饰类的时候:public final class 类名称{ }表明当前这个类不能有任何的子类(太监类)
修饰成员方法的时候:修饰符 final 返回值类型 方法名称(参数列表){ } 当一个方法被final修饰的时候,表明这个方法是最终的方法,也就是不能被覆盖重写;
对于类和方法来说,abstract与final不能够同时使用,因为矛盾。
修饰成员变量的时候:对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可改变的。注意⚠️:(1)由于成员变量具有默认值(0/null),所以用了final之后必须手动赋值,不会再给默认值了。(2)对于final的成员变量,要么使用直接赋值方法,要么通过构造方法赋值,二者选其一。
修饰局部变量的时候:一旦使用final修饰局部变量,那么这个变量就不能进行更改,也就是“一次赋值,终生不变”。对于基本类型来说,不可变说的是变量当中的数据不能进行更改;对于引用类型来说,不可变说的是变量当中的地址值不可改变。
二、final/finally/finalize的区别
finally通常和try catch搭配使用,是不管是否发生了异常,都必须执行的代码模块,保证资源被释放(比如关闭I/O流、释放连接)。
finalize是object类中的一个方法,子类可以重写finalize()方法实现对资源的回收。垃圾回收只负责回收内存,并不负责资源的回收,资源回收要由程序员完成,Java虚拟机在垃圾回收之前会先调用垃圾对象的finalize方法用于使对象释放资源(如关闭连接、关闭文件),之后才进行垃圾回收,这个方法一般不会显示的调用,在垃圾回收时垃圾回收器会主动调用。
待更。。。
网友评论