static && final
分类:
文章
•
2022-10-08 09:03:33
研究问题:
- 两者区别与使用范围
- static内存图解
要点:
- final定义一个常量,不能被改变。且定义的方法不能被继承。
- final static定义一个全局静态常量,不可改变
- 在静态方法中一定不能调用非静态成员,但在非静态方法中可以调用静态成员Static和finanl区别:
一、static :
什么情况下我们要使用static呢?
1、只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创 建对象。
2、我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。
为满足这两方面的要求,可使用static(静态)关键字。
下面我先举个例子:
一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一起。所以尽管从未创建那个类的一个对象,仍能调用一个static方法,或访问一些static数据。
为了将数据成员或方法设为static,只需在定义前置和这个关键字即可。
二、final:
final可修饰类、域(变量和常量)、方法 (而static不修饰类)
1、final修饰类,表示该类不可被继承。
2、final修饰变量
程序中经常需要定义各种类型的常量,如:3.24268,”201”等等。这时候我们就用final来修饰一个类似于标志符名字。
3、修饰方法:
final修饰的方法,称为最终方法。最终方法不可被子类重新定义,即不可被覆盖。
如父类定义了public void fly(){ ….}
则子类就不能定义
public void fly(){。。。。。。}
但注意覆盖与重载的区别。不能被覆盖并不是不能被重载,如你还可以定义
public void fly(int i){…..},
- static内存图解
- Static
类中定义了实例变量ia和静态变量sa,并初始化10和20,在主类的主方法中通过StaticAttribute类的对象fun1将ia和sa值改为100,1000;同理,fun2将ia和sa值改为200,2000;由于sa为静态变量,属于整个类,只有有一个对象改变了它的值,所有的对象对应的sa的值都会发生变化,因此fun1、fun2以及StaticAttribute引用的sa得到的值都是2000。
-
- 易错点:没有区分构造方法与静态初始化器在内存中的位置
构造方法—-方法区。
静态初始化器—-静态初始化器与类构造方法对静态变量sn进行初始化,利用构造方法改变sn的值,再把sn的值给非静态变量n。静态初始化器是在它所属的类加载到内存时由系统调用执行,而构造方法是在系统用new运算符产生新对象时自动执行,每执行一次都要对构造方法进行操作。
- final
由于采用不同的初始化形式,fi2值保持不变。而fi1通过构造方法每次递增1。