Java基础 -- 关键字Static和Final

时间:2023-03-29 07:56:38
Java基础 -- 关键字Static和Final


Java基础 -- 关键字Static和Final
Java基础 -- 关键字Static和Final

Java基础 -- 关键字Static和Final


1. Static

  • java static关键字可以用在变量、方法、代码块和嵌套类上
    1.静态变量
    2.静态方法
    3.静态代码块
    4.静态内部类

1.1 修饰成员变量

  • 被static 修饰的成员变量叫静态变量
    1.运行时,Java 虚拟机只为静态变量分配一次内存,加载类过程中完成静态变量的内存分配。
    2.在类的内部,可以在任何方法内直接访问静态变量。
    3.在其他类中,可以通过类名访问该类中的静态变量。
  • 没有被 static 修饰的成员变量叫实例变量
    1.每创建一个实例,Java 虚拟机分配一次内存
    2.在类的内部,可以在非静态方法中直接访问实例变量。
    3.在其他类中,通过实例对象调用。
  • 提高代码的可读性

1.2 修饰方法

  • 被static 修饰的方法叫静态方法
    1.静态方法,属于类,而不属于类的对象。
    2.静态方法中无法使用this,super。
  • 没有被static 修饰的方法叫成员方法
    1.可直接访问所属类的静态变量、静态方法、实例变量和实例方法。

1.3 代码块

  • 静态代码块在类加载的时候执行一次,是最早被执行的
  • 构造代码块在每一次创建对象时执行,始终在构造方法前执行。
  • 构造方法在新建对象时调用( 就是new的时候 )。

1.3.1 代码块01

  • 执行顺序:静态代码块 → main → 构造代码块 → 构造方法
    Java基础 -- 关键字Static和Final
public class Demo01 {

    static{
        System.out.println("父类静态代码块开始执行!");
    }
    {
        System.out.println("父类构造代码块开始执行!");
    }
    public Demo01(){
        System.out.println("父类构造方法开始执行!");
    }
    public static void main(String[] args) {
        System.out.println("父类开始运行main");
        new Demo01();

    }
}

1.3.2 代码块02

  • 执行顺序:父类静态代码块 → 子类静态代码块 → main → 父类构造代码块 → 父类构造方法 → 子类构造代码块 → 子类构造方法
    Java基础 -- 关键字Static和Final
public class Demo02 extends Demo01{
    static{
        System.out.println("子类静态代码块开始执行!");
    }
    {
        System.out.println("子类构造代码块开始执行!");
    }
    public Demo02(){
        System.out.println("子类构造方法开始执行!");
    }
    public static void main(String[] args) {
        System.out.println("子类开始运行main");
        new Demo02();
    }
}

2. Final

  • final关键字可用于修饰类,方法,变量(成员变量,局部变量,静态变量)
    1.被final修饰的类是一个最终类,不可以被继承。
    2.被final修饰的方法是一个最终方法,不可以被覆盖,但是可以被继承。
    3.被final修饰的变量只能是一个常量,只能赋值一次。

2.1 初始化

final修饰的属性又叫常量一般用 XX_XX_XX来命名

class A{
    //一、在定义时
    public final double TAX_RATE1 = 0.08;
    public final double TAX_RATE2;
    public final double TAX_RATE3;
    //二、在构造器中
    public A(){
        TAX_RATE2=1.1;
    }
    //三、在代码块
    {
        TAX_RATE3 = 1.8;
    }
}
 
//若final修饰的属性是静态的,则初始化
class B{
    //一、在定义时
    public static final double TAX_RATE1=99.9;
    public static final double TAX_RATE2;
    //二、在静态代码块
    static{
        TAX_RATE2=3.3;
    }
}

2.2 思考

  • 为什么当final修饰的属性为静态时,不可在构造器中初始化?
    构造器在创建对象的时候才会被调用,而静态变量的初始化在类加载时就要给值。
  • 为什么在静态方法里不能操作类成员变量?
    因为静态方法先加载,还没有实例化对象,哪来的这个属性。调用成员方法时,成员变量和方法已经是一个对象的了。

3. 类属性值的Null和非空判断

  • Utils Code

import java.util.Collection;


public class AttributeValidate {
   private static final String NOT_NULL_FAILURE_MESSAGE = "does not accept null args";
   private static final String NOT_EMPTY_FAILURE_MESSAGE = "does not accept empty args";

   public static void notNull(Object... args_) {
      if (args_ == null)
         throw new IllegalArgumentException(NOT_NULL_FAILURE_MESSAGE);

      for (Object arg : args_) {
         if (arg == null)
            throw new IllegalArgumentException(NOT_NULL_FAILURE_MESSAGE);
      }
   }

   public static void notEmpty(Object... args_) {
      if (args_ == null)
         throw new IllegalArgumentException(NOT_EMPTY_FAILURE_MESSAGE);

      for (Object arg : args_) {
         if (arg == null)
            throw new IllegalArgumentException(NOT_EMPTY_FAILURE_MESSAGE);
         if (arg instanceof Collection<?>) {
            if (((Collection<?>) arg).size() == 0)
               throw new IllegalArgumentException(NOT_EMPTY_FAILURE_MESSAGE);
         }
      }
   }
}

  • Test Code
 AttributeValidate.notNull(。。。。。。);

4. Awakening

         在一秒钟内看到本质的人和花半辈子也看不清一件事本质的人,自然是不一样的命运。
Java基础 -- 关键字Static和Final