静态 static 和 最终 final
static (静态的)
static可以用来修饰 属性,方法,代码块,内部类
static修饰属性时,该属性变为静态属性
实例变量:该变量属于对应的实例,需要new一个实例之后才能通过相应的方法或是直接调用该属性,每一个实例都有其特有的实例变量值,不同实例修改的属性不会互相影响。
静态变量:该变量属于一整个类,当类被加载的时候,该变量也被加载,可以通过“类名.静态变量”的方式去调用。当有实例改变过静态变量的值的时候,其他变量调用该静态变量时得到的值也是改变过的值。例如Math.PI, System.out
tips:静态变量早于实例对象的创建,并且因为类只加载一次,所以静态变量也只有一份存在静态方法区中。
静态变量 | 实例变量 | |
---|---|---|
实例对象 | 可调用 | 可调用 |
类 | 可调用 | 不可调用 |
总而言之,判断时根据变量的生命周期来判断,晚创建的可以调用早创建的。
static修饰方法时,该属性变为静态方法
非静态方法:当被调用时加载
静态方法:当类生成时就被加载
静态方法 | 非静态方法 | |
---|---|---|
实例对象 | 可调用 | 可调用 |
类 | 可调用 | 不可调用 |
tips:在静态方法中只能调用静态变量,不能调用实例所拥有的非静态变量,而且不能使用this,super等关键字,因为this和super都是基于对象实现的。
什么时候使用static关键字?
修饰属性:当该属性被共同使用,多个对象实例共享的时候
修饰方法:操作静态属性的方法,一般定义为静态方法,工具类中的方法,一般也定义为static,这样就不需要定义工具类的实例,可以直接通过类名调用其方法,例如Math.Random()
优势:使用方便,类内分享
劣势:生命周期过长,占用空间久
final(不变的,最终的)
final 可以修饰类,变量,方法
final修饰类:该类不可被继承 例如String,System类
final修饰方法:该方法不能被重写 例如 getclass()方法
final修饰变量:该变量变为常量
修饰属性(全局变量):全局常量 --- 可以赋值的位置(显式初始化,构造器初始化,代码块初始化)如何去理解呢?因为类创建完成,属性的内存空间就需要被创建完毕,又因为该属性由final修饰不可以改变,所以必须在类创建的时候就给其赋值,类是通过构造器去创建的,所以在赋值顺序在构造器以前的赋值方式,都是可以给final修饰的变量赋值的。变量赋值顺序 代码块
class TestFinal{
//方式1
final int i = 1;
//方式2
final int a;
public TestFinal(){
a = 1;
}
//方式3
final int b;
{
b = 1;
}
}
修饰局部变量:局部常量 --- 最重要注意修饰方法参数的时候,表明该变量在方法中不能再二次赋值,只能被调用
private static void test(final int a) {
//a++; 错误的,final修饰不能被修改只能被调用
System.out.println(a);
}