java的static和final关键字

在做面试题的时候,发现经常遇到static和final相关的问题,虽然不是很难,但有时候总是容易搞混,现在再重新记录一下。

static关键字

在java中,被static修饰的变量叫做静态变量(类变量),方法叫做静态方法。这些实例和方法被类的所有实例所共享。
常常容易搞混的是静态变量和实例变量,那么这两者的区别在于:
1.静态变量实质是一个全局变量,在类加载的时候,在内存中分配一个内存空间存放该静态变量,那么该类的所有实例都可以操作这个内存空间,即所有实例共享此静态变量。可以直接通过类名来访问,也可以用类实例来访问但不推荐。
2.对于实例变量,每创建一个实例,就会为实例变量分配一个内存,而这些实例变量在内存中是互不影响的。

static方法不能调用非静态成员:在Java中,静态方法不能调用非静态方法、以及应用非静态成员变量,因为在java中,被static修饰的方法和类变量,是先于实例变量存在的,那么当类没有初始化时,就不存在实例变量,也就没有分配内存了。

非静态方法可以调用静态方法:实例化后的方法,通过对象自身可以引用静态方法。

在static方法中不能使用this:因为this是类对象的自身引用,需要类初始化类对象之后才能引用,即实例化后分配内存之后才可以使用this。
static方法必须是实现的,即不能被abstract修饰。
所有java的main方法必须是static的,这样在未初始化才能被外部调用。
Note:类未实例化时,需要访问类的内部方法的时候,可以使用java的反射机制:

final关键字

1.final修饰的方法不能被重写
2.final修饰的变量不能被修改
3.final变量只能被赋值一次。

对于被static和final同时修饰的变量,可以理解为全局变量,通过类名可以直接访问,方法则不能被重写,可以直接访问。

你可能感兴趣的:(java的static和final关键字)