static可以修饰,属性、方法、内部类、代码块
修饰属性 和 方法
静态属性(类变量)和 静态方法
- 会随着类的加载而加载(比对象创建早),存放在方法区的静态域中
- 可以通过
类.静态属性(方法)和对象.静态属性(方法)来访问 - 只被加载一次,当静态属性被修改,其他对象访问的静态属性也会被修改
注意:
- 静态方法中,只能调用静态方法或属性
- 静态的方法中不能访问this、super
- 非静态方法中,静态的、非静态的
属性和方法都能被访问 - 非静态属性和非静态方法不能通过
类.非静态属性和类.非静态方法()
class Demo {
static String location = "Africa";
public static void show() {
System.out.println(location); // 静态的属性和方法省略都是 Demo.location
}
}
static修饰什么样的属性和方法?
- 属性
- 多个对象共享的属性,不因对象改变而改变
- 常量
- 自动赋值
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;
}
}
- 方法
- 工具类的方法
- 操作静态属性的方法
单例设计模式
只想让某个类造一个对象
饿汉式:
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、缺省修饰
- 静态代码块
- 随着类的加载而
执行,且只执行一次。
- 非静态代码块
- 随着对象的创建而
执行,每创建一次对象,代码块就执行一次。
- 执行顺序
- 静态代码块整体上比非静态代码块先执行,代码块早于构造器
- 赋值顺序:默认初始化、显式初始化/代码块中赋值、构造器中初始化、
对象.的形式赋值