static关键字


定义

  1. static:静态的
  2. 是一个修饰符,用于修饰类的成员变量、类的成员方法,另外可以编写static代码块来优化程序性能。
  3. 被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。

一、修饰变量

  1. 我们通常把static修饰的变量成为静态变量或类成员。
  2. 静态变量独立于该类的对象,只要该类被加载可以通过【类名.静态变量名】 来调用
  3. 类的所有实例共享一个static变量,在内存中只有一个副本,即一个实例对静态变量进行更改后,其他的实例调用此变量时,使用的是更改过后的静态变量。
  4. 静态变量当且仅当在类初次加载时被初始化;而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象所拥有的副本互不影响。
  5. 静态变量的初始化顺序按照定义的顺序

二、修饰方法

  1. static修饰的方法一般称作静态方法
  2. static修饰成员方法最大的作用,就是可以使用【类名.方法名】的方式操作方法,避免了先要new出对象的繁琐和资源消耗。
  3. 静态方法是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都必须依赖具体的对象才能够被调用。
  4. 虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。

三、 修饰代码块

  1. static关键字修饰的代码块称为静态代码块,不在任何方法体内,可以用来优化程序性能。
  2. static块可以置于类中的任何地方,类中可以有多个static块。
  3. 当JVM加载类时,就会执行静态代码块,无需等待实例化,会按照static块的顺序来依次执行每个static块,并且只会执行一次。
    static优化性能例子:
class Person{
    private Date birthDate;
 
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
 
    boolean isBornBoomer() {
        Date startDate = Date.valueOf("1946");
        Date endDate = Date.valueOf("1964");
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}

isBornBoomer是用来判断一个人是否是1946-1964年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成下面这样效率会更高:

class Person {
    private Date birthDate;
    private static Date startDate, endDate;
 
    static {
        startDate = Date.valueOf("1946");
        endDate = Date.valueOf("1964");
    }
 
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
 
    boolean isBornBoomer() {
        return birthDate.compareTo(startDate) >= 0 && birthDate.compareTo(endDate) < 0;
    }
}

因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。


一个static修饰的类中,不能使用非static修饰的成员变量和方法,这很好理解,因为static修饰的方法是属于类的,如果去直接使用对象的成员变量,它会不知所措(不知该使用哪一个对象的属性)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值