static

153 阅读2分钟

static可以修饰,属性、方法、内部类、代码块

修饰属性 和 方法

静态属性(类变量)和 静态方法

  • 会随着类的加载而加载(比对象创建早),存放在方法区的静态域中
  • 可以通过 类.静态属性(方法)对象.静态属性(方法) 来访问
  • 只被加载一次,当静态属性被修改,其他对象访问的静态属性也会被修改

注意:

  • 静态方法中,只能调用静态方法或属性
  • 静态的方法中不能访问this、super
  • 非静态方法中,静态的、非静态的 属性和方法 都能被访问
  • 非静态属性和非静态方法不能通过类.非静态属性类.非静态方法()
    class Demo {
        static String location = "Africa";
        
        public static void show() {
            System.out.println(location); // 静态的属性和方法省略都是 Demo.location
        }
    }

static修饰什么样的属性和方法?

  • 属性
  1. 多个对象共享的属性,不因对象改变而改变
  2. 常量
  3. 自动赋值
class Demo {
    private int id; // 需要自动赋值
    private static int init = 0;
    private String pwd;
    
    public Demo() {
        id = init++;
    }
    
    public Demo(String password) {
        this();
        pwd = password;
    }
    
    public static int getInit() {
        return init;
    }
}
  • 方法
  1. 工具类的方法
  2. 操作静态属性的方法

单例设计模式

只想让某个类造一个对象
饿汉式:

public class SingletonTest1 {
    public static void main(String[] args) {
        Bank bank = Bank.getBank();
        bank.setName("中国银行");
        bank.setAddress("人民路79号");
        System.out.println(bank);
    }
}

// 饿汉式 一上来就new出对象(线程安全)
class Bank {
    private String name;
    private String address;

    // 1. 私有化类的构造器(避免在Bank外部调用构造器)
    private Bank() {

    }

    // 2. 内部创建类的对象
    private static Bank bank = new Bank();

    // 3. 提供返回本类实例对象的方法(必须是静态的)
    public static Bank getBank() {
        return bank;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Bank{" +
                "name='" + name + ''' +
                ", address='" + address + ''' +
                '}';
    }
}

懒汉式:(优先使用)线程不安全


public class SingletonTest2 {

}

// 懒汉式
class Order {

    // 1. 私有化
    private Order() {}

    // 2. 不初始化
    private static Order order = null;

    // 3. 提供返回本类实例对象的方法(必须是静态的)
    public static Order getOrder() {
        if (order == null) {
            order = new Order();
        }
        return order;
    }
}

static修饰代码块

代码块(初始化块)

代码块的作用:初始化类、对象
只能被static、缺省修饰

  1. 静态代码块
  • 随着类的加载而执行,且只执行一次。
  1. 非静态代码块
  • 随着对象的创建而执行,每创建一次对象,代码块就执行一次。
  1. 执行顺序
  • 静态代码块整体上比非静态代码块先执行,代码块早于构造器
  • 赋值顺序:默认初始化、显式初始化/代码块中赋值、构造器中初始化、对象.的形式赋值