1. static 关键字
1.1 类变量
类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它的时候,取到的都是相同的值;同样,任何一个该类的对象去修改它的时候,修改的也是同一个变量。简单来说,就是共享变量。
class A{
public static int num = 10;// 类变量/静态变量/静态属性
}
类变量的一些特性:
- 类变量可以通过 类名.类变量名(推荐) 或者 对象名.类变量名 来访问;
- 类变量是该类的所有对象共享的,而实例变量(非类变量)是每个对象独享的;
- 类变量在类加载的时候就初始化了,即只要加载了类,就可以使用类变量;
- 类变量的生命周期是随类的加载开始,随着类消亡而销毁。
1.2 类方法
类方法也叫静态方法.
class B{
public static void hello(){
System.out.println("hello");
}
}
静态方法如何在本类中或在外部类引用:
class C{
public static void hello(){
System.out.println("hello");
}
public void say(){
hello();
}
}
class D{
public void speak(){
C.hello();
}
}
1.2.1 静态方法特性
- 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区。类方法中没有this的参数,普通方法中隐含着this的参数
- 静态方法,只能访问静态的成员;费静态的方法,可以访问静态成员和费静态成员(必须遵守访问权限);
- 类方法可以通过类名调用,也可以通过对象名调用;
- 普通方法需要通过对象名调用,不可以通过类名调用;
1.3 加载顺序
创建一个子类对象时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:
- 父类的静态代码块和静态属性(二者优先级一样,按定义顺序执行);
- 子类的静态代码块和静态属性(二者优先级一样,按定义顺序执行);
- 父类的普通代码块和普通属性初始化(二者优先级一样,按定义顺序执行);
- 父类的构造方法;
- 子类的普通代码块和普通属性初始化(二者优先级一样,按定义顺序执行);
- 子类的构造方法。
2. final关键字
2.1 final使用场景
- 当不希望类被继承时,可以使用 final 修饰;
final class A{}//此时该类不可以被其他类继承
- 当不希望父类的某个方法被子类**覆盖/重写(override)**时,可以使用 final 修饰;
class B{
public final void hello(){}//该方法可以访问,但不可以被重写
}
- 当不希望类的某个属性的值被修改,可以使用 final 修饰;
class C{
public final double TAX_RATE = 0.08;//常量
}
- 当不希望某个局部变量被修改,可以使用 final 修饰;
class D{
public void cry(){
final double NUM = 0.01;//此时,NUM 被称为局部
}
}
2.2 使用注意事项
- final修饰的属性称为常量,一般用大写字母命名,命名格式为 XX_XX_XX;
- final修饰的属性必须赋初值,且不能被修改。赋值可以在如下位置之一:
- 定义时:public final double TAX_RATE = 0.08;
- 在构造器中
- 在代码块中
- 如果final修饰的属性是静态的,则初始化的位置只能是
- 定义时
- 在静态代码块
- 不能在构造器赋初值
- final类不可被继承,但是可以实例化对象;
- 如果类中含有final方法,则该方法不可被重写,但是可以被继承;
- 如果一个类已经是final类,则没必要将方法修饰成final方法;
- final 和 static 往往搭配使用,效率更高,不会导致类的加载(底层编译器做了优化处理)。