04.(Java基础)-01Static关键字的有哪些作用

本文深入探讨Java中静态成员的使用方式与优化技巧,包括静态变量、静态方法、静态代码块以及静态内部类,通过具体示例展示如何提高程序性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Static 关键字主要有两个作用:

  •  1.为特定的数据类型或对象分配单一的存储空间,而不用去考虑创建了多少个实例对象,用static修饰的在内存中只有一份它与创建的实例的对象多少没有关系。
  •  2.在不创建类的实例对象的情况下就可以通过类来直接调用方法或使用类中的属性。

注意:
        由于static方法使用前不需要创建任何对象;所以对于static方法不能简单地调用其非static方法或域而没有指定某个命名对象,来直接访问非static方法和域。也就是说在同一个类中存在一个static字段和一个非static字段,一个static方法和非static方法。static方法可以调用static字段,但不可以调用非static字段。非static方法可以调用static和非static字段。

Static主要有四种使用情况:
      成员变量,成员方法,代码块,内部类

       1.static 变量
              

         static变量也称作静态变量(可以理解为全局变量),静态变量和非静态变量的区别是:静态变量属于类(Class,只有唯一一个),在内存中只有一个(所有的实例都指向这一个),它当且仅当对应的类初次加载时会被分配空间。而非静态变量是对象所拥有的,在创建实例对象的时候被初始化,只有创建new实例对象后才会被分配,存在多个副本,各个对象拥有的副本互不影响。

  static成员变量的初始化顺序按照定义的顺序进行初始化。


      2.static方法

     static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this和super的,因为它不依附于任何对象,既然都没有对象,就谈不上this      和super了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用.


     3.static代码块    

      static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个      static块,并且只会执行一次。

   为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次(static代码块只会执行一次)。下面看个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
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两个对象,造成了空间浪费,如果改成这样效率会更好:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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代码块中进行。


      4.static内部类

      static内部类是指被声明了static的内部类。它可以不依赖外部类的实例而被实例化(外部类.内部类  inner = new  外部类.内部类()),而通常的内部类需要在外部类实例化后才能实例化。





  

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值