Java static关键字与static{}语句块

Java static关键字与static{}语句块目录直通车一、类的加载特性与时机1、 类加载的特性2、类加载的时机二、static的三个常用1、修饰成员变量2、修饰成员方法3、 静态块(static{})一、类的加载特性与时机在进入static之前,先补一下关于类的脑。1、 类加载的特性在JVM的生命周期里,每个类只会被加载一次。类加载的原则:延迟加载,能少加载就少加载,因为虚拟机的空…

大家好,又见面了,我是你们的朋友全栈君。

目录直通车

一、 类的加载特性与时机

1、 类加载的特性

2、 类加载的时机

二、 static的三个常用

1、 修饰成员变量

2、 修饰成员方法

3、 静态块(static{})


一、 类的加载特性与时机

在进入static之前,先补一下关于类的脑。

1、 类加载的特性

在JVM的生命周期里,每个类只会被加载一次。

类加载的原则:延迟加载,能少加载就少加载,因为虚拟机的空间是有限的。

2、 类加载的时机

1)第一次创建对象要加载类.

2)调用静态方法时要加载类,访问静态属性时会加载类。

3)加载子类时必定会先加载父类。

4)创建对象引用不加载类.

5) 子类调用父类的静态方法时

    (1)当子类没有覆盖父类的静态方法时,只加载父类,不加载子类

    (2)当子类有覆盖父类的静态方法时,既加载父类,又加载子类

6)访问静态常量,如果编译器可以计算出常量的值,则不会加载类,例如:public static final int a =123;否则会加载类,例如:public static final int a = math.PI。

二、 static的三个常用

1、 修饰成员变量

2、 修饰成员方法

同C++是一样的概念。但是在JVM里面,JVM也会划分一个暂称静态存储区,用于存放方法的定义。实际上从更大的角度而言,它存放的是各种类的定义,当我们通过new来生成对象时,会根据这里定义的类的定义去创建对象。

下面观察两段代码的输出结果,加了static和没有加static的区别:

public class Person {
    String name;

    int age;
    
    public String toString() {
        return "Name:" + name + ", Age:" + age;
    }
    
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "zhangsan";
        p1.age = 10;
        Person p2 = new Person();
        p2.name = "lisi";
        p2.age = 12;
        System.out.println(p1);
        System.out.println(p2);
    }

    /**输出结果
     * Name:zhangsan, Age:10
     * Name:lisi, Age:12
     */
}
public class Person {
    String name;
    // 给age加上static
    static int age;
    /* 其余代码不变... */

    /**输出结果
     * Name:zhangsan, Age:12
     * Name:lisi, Age:12
     */
}

结论:通过运行结果,可以看到 age都为12,只保存了最后一次给age赋的值。这是为什么呢,在内存里面发生了什么?

Java static关键字与static{}语句块

给age属性加了static关键字之后,Person对象就不再拥有age属性了,age属性会统一交给Person类去管理,即多个Person对象只会对应一个age属性,一个对象如果对age属性做了改变,其他的对象都会受到影响。

3、 静态块(static{})

(1) static关键字还有一个比较关键的作用,用来形成静态代码块(static{}(即static块))以优化程序性能。

(2) static块可以置于类中的任何地方,类中可以有多个static块。

(3) 在类初次被加载的时候执行且仅会被执行一次(这是优化性能的原因!!!),会按照static块的顺序来执行每个static块,一般用来初始化静态变量和调用静态方法。

下面通过两段代码,说明 static{} 为什么能优化程序性能。

实例

/**
 * 每次调用isBornBoomer的时候
 * 都会生成startDate和birthDate两个对象,造成了空间浪费
 */
class Person{
    private Date birthDate;
     
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer() {
        Date startDate = Date.valueOf("1997");
        Date endDate = Date.valueOf("2019");
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}

 

/**
 * 这里使用了static块
 * 只需要进行一次的初始化操作
 * 节省内存空间,优化性能
 */
class Person{
    private Date birthDate;
    private static Date startDate,endDate;

    static{
        startDate = Date.valueOf("1997");
        endDate = Date.valueOf("2019");
    }
     
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer() {
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}

注意:强调一下static块是会按照顺序执行,与main入口函数无关。

static还有一个不常用的用途,叫做 static静态导包 有兴趣的朋友可以去了解一下。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160518.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm下载和安装教程_pycharm下载官网

    pycharm下载和安装教程_pycharm下载官网python,pycharm下载安装使用

    2022年8月27日
    9
  • 10种不同画法画平行线怎么画_平行线的标准画法

    10种不同画法画平行线怎么画_平行线的标准画法数学活动《平行线的画法》活动目标:1、通过活动探究巩固熟悉平行线的判定方法,能正确地画出已知直线的平行线,并能用平行线的判定方法说明依据。2、采用多种方法画平行线,让学生从不同的角度来寻求解决问题的方案.让学生在动手操作中进一步学会画平行线,培养一定的操作技能。3、通过观察、动手操作、推断、交流等数学活动,发展空间观念,体验知识来源于生活,又服务于生活。活动重点:运用所学的知识熟练的画出平行线。活…

    2022年9月20日
    2
  • pycharm激活码2021 3月最新注册码

    pycharm激活码2021 3月最新注册码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    52
  • java导出pdf模板_java模板导出PDF[通俗易懂]

    java导出pdf模板_java模板导出PDF[通俗易懂]本次完善综合特点:一对一,点对点的给对应的地方写值,比如模板里面放了个name标识,在程序里把“张三”赋给name,那么输出的pdf里面name的地方就变成了张三,准确方便快捷支持中文,可以使用自己下载的字体。支持图片:图片的大小范围可以在模板随意调,生成出来的图片不会超过范围。而且不需要根据坐标去算,程序里面自动计算的。支持多页模板,即使是好几页的模板,只要每个变量对应的范围确定好了,生成出来的…

    2022年5月10日
    42
  • oracle11g下载地址_如何安装oracle10g数据库

    oracle11g下载地址_如何安装oracle10g数据库OracleDatabase10gRelease2(10.2.0.1.0)Enterprise/StandardEditionforMicrosoftWindows(32-bit)http://download.oracle.com/otn/nt/oracle10g/10201/10201_database_win32.ziphttp://download.ora

    2022年8月30日
    4
  • 用KCPTun进行加速

    用KCPTun进行加速来源:https://blog.csdn.net/Crapefruit/article/details/86669794VPS端在命令行键入:mkdirkcptuncdkcptunwget

    2022年8月4日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号