final与static的区别
一、final关键字
定义
- final实例字段必须在构造对象时初始化。即在构造器执行完成之前,将字段赋予初值,否则将不能再修改这个字段。
- 每创建一个实例,就会为实例变量分配一次内存。
具体使用
-
final修饰数据类型(包括类),则应用后的值在实例化后不可再更改。
-
final修饰类中的方法,则该方法不可被重写,例如父类的方法使用final修饰,继承该类不能对父类中final修饰的方法。
-
final修饰类,则该类不可以被继承
二、static关键字
定义
static关键字修饰类的成员与方法都会随着类的加载而分配和加载进内存,而非静态字段与方法只有在实例化时才对成员和方法分配内存。并且static关键字修饰类的成员和方法只加载一次,后面类的实例化都是使用类加载是分配的内存空间
具体使用
- static修饰的成员值是可以修改,修饰的方法可以重写(子类重写的方法也要用static修饰)
- static修饰方法,改方法不可以访问非静态变量,只能访问静态成员
重点:静态成员和静态方法,本质上属于类,不属于该类的实例;尽管可以使用实例进行调用,但小编强烈建议采用类名进行调用
三、final与static的区别
- final修饰的成员(赋值后不可更改),方法(子类继承后不可更改)、类(该类不可被继承)。static修饰的成员(可以被修改)、方法(可以被重写)。
- 加载的时间点不同:final是在new实例时才会被分配和加载内存(每一次实例都会);static是在声明类时间进行的,声明实例时不会再分配和加载,而是所的实例都共用(被static修饰的成员和方法)。