[转载] Java static关键字与static{}语句块

参考链接: Java中的静态块static block

目录直通车 

一、 类的加载特性与时机 

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赋的值。这是为什么呢,在内存里面发生了什么? 

 

给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静态导包 。有兴趣的朋友可以去了解一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Perl文件读写操作

本文转自 tiger506 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/tiger506/830771&#xff0c;如需转载请自行联系原作者

[转载] Java 语言中的实例初始化块 ( IIB) 详解

参考链接&#xff1a; Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB )。不过我觉得介绍的有点简单了&#xff0c;于是&#xff0c;再写一篇文章详细介绍下吧。 Java 语言中&#xff0c;存在三种操作&#x…

不用正则表达式,用javascript从零写一个模板引擎(一)

前言 模板引擎的作用就是将模板渲染成html&#xff0c;html render(template,data)&#xff0c;常见的js模板引擎有Pug,Nunjucks,Mustache等。网上一些制作模板引擎的文章大部分是用正则表达式做一些hack工作&#xff0c;看完能收获的东西很少。本文将使用编译原理那套理论来打…

[转载] Java静态绑定与动态绑定

参考链接&#xff1a; Java中的静态绑定与动态绑定 程序绑定的概念&#xff1a; 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说&#xff0c;绑定分为静态绑定和动态绑定&#xff1b;或者叫做前期绑定和后期绑定. 静态绑定&#xff1a; 在程序执行前方…

关于批量插入数据之我见(100万级别的数据,mysql)

2019独角兽企业重金招聘Python工程师标准>>> 因前段时间去面试&#xff0c;问到如何高效向数据库插入10万条记录&#xff0c;之前没处理过类似问题&#xff0c;也没看过相关资料&#xff0c;结果没答上来&#xff0c;今天就查了些资料&#xff0c;总结出三种方法&am…

各个OS关于查看磁盘和wwn号的方法

1,HP-UX几个命令1&#xff09;查看型号&#xff0c;和uname -a差不多model2&#xff09;查看光纤卡信息ioscan -funC fc3) 查看扫描出的磁盘信息ioscan -fucC disk4&#xff09;查看磁盘及其对应的路径ioscan -m dsf5) 查看划分过来的lunioscan -m lun6) 查看磁盘大小diskinfo …

[转载] Java是不是面向对象的程序

参考链接&#xff1a; 为什么Java不是纯粹的面向对象语言 转载自&#xff1a;https://blog.csdn.net/a21700790yan/article/details/80129053 Java——是否确实的 “纯面向对象”&#xff1f;让我们深入到Java的世界&#xff0c;试图来证实它。 在我刚开始学习 Java 的前面几…

极速理解设计模式系列:6.适配器模式(Adapter Pattern)

四个角色&#xff1a;目标抽象类角色(Target)、目标对象角色(Adapter)、源对象角色(Adaptee)、客户端角色(Client) 目标抽象类角色&#xff08;Target)&#xff1a;定义需要实现的目标接口 目标对象角色&#xff08;Adapter)&#xff1a;调用另外一个源对象&#xff0c;并且转换…

[转载] Java之继承

参考链接&#xff1a; Java多重继承 Java之继承 继承是面向对象程序的一个基本特征&#xff0c;通过继承可以实现父子关系&#xff0c;以及代码的复用。通过继承实现的类称为子类&#xff0c;被继承的类称为父类&#xff0c;所有直接或间接被继承的类都称为父类。 Java类体…

Spark(二): 内存管理

2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎&#xff0c;内存管理方案是其非常重要的模块&#xff1b; Spark的内存可以大体归为两类&#xff1a;execution和storage&#xff0c;前者包括shuffles、joins、sorts和agg…

[转载] 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

参考链接&#xff1a; Java继承类的对象创建 本文发表于2016年6月&#xff0c;写于作者学生时期。文中使用到的技术和框架可能不是当下最佳实践&#xff0c;甚至很不“优雅”。但对于刚接触JavaEE和Spring的同学来说&#xff0c;还是能有很多收获的&#xff0c;大牛轻拍 我们…

多播、组播、广播优缺点分析

2019独角兽企业重金招聘Python工程师标准>>> 单播、多播和广播单播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“广播”&#xff08;Broadcast&#xff09;这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究…

[转载] Java重载、覆盖与构造函数

参考链接&#xff1a; Java中的继承和构造函数 /** * 拷贝构造函数---Copyf t2 new Copyf(t1);就不会在调用默认构造函数了。 * 复制clone和引用 * 重载是在同一个类&#xff08;范围&#xff09;中&#xff0c;覆盖是子类对父类而言。 重载不关心返回值类型。 静态方法不能被…

LOFTERD18B542F16FF685FD684F427B4…

2019独角兽企业重金招聘Python工程师标准>>> 验证 转载于:https://my.oschina.net/jinhengyu/blog/1572124

[转载] Java获取一个类继承的父类或者实现的接口的泛型参数

参考链接&#xff1a; Java中的接口和继承 泛型的作用就不多介绍了&#xff0c;如果你想具备架构设计能力&#xff0c;那么熟练使用泛型是必不可少的。 不多说了&#xff0c;先定义泛型父类和泛型接口&#xff1a; package cn.zhh; public class Parent<T1, T2> { …

PHP系列(一)PHP流程控制结构

while(){} do{ }while(); for( 表达式1; 表达式2;表达式3 ){ 语句或语句序列; } if(){} if(){ }elseif{} <?php $i0; while(true) { if($i>100) break; echo ".$i.<br>"; $i; } ?> <?php echo "<table border1800>"; echo &quo…

[转载] Scala继承与Java的区别

参考链接&#xff1a; Java中将final与继承一起使用 在之前的笔记Java静态属性和方法的继承问题中&#xff0c;通过具体的实验证明&#xff0c;在子类中重写父类的字段时并没有覆盖父类的字段&#xff0c;只是隐藏了父类的字段。而在scala中则不同&#xff0c;scala子类的同名…

Source Map调试压缩后代码

在前端开发过程中&#xff0c;无论是样式还是脚本&#xff0c;运行时的文件可能是压缩后的&#xff0c;那这个时候调试起来就很麻烦。 这个时候&#xff0c;可以使用Source Map文件来优化调试&#xff0c;Source Map是一个信息文件&#xff0c;里面储存着原代码位置信息&#x…

[转载] Python3十大经典错误及解决办法

参考链接&#xff1a; Python中的关键字2 ◆ ◆ ◆ ◆ ◆ 接触了很多Python爱好者&#xff0c;有初学者&#xff0c;亦有转行人。不论大家学习Python的目的是什么&#xff0c;总之&#xff0c;学习Python前期写出来的代码不报错就是极好的。下面&#xff0c;严小样儿为大家罗…

两台电脑间大量数据拷贝的快捷方法

可能大家会遇到需要将一台电脑里的数据拷贝到另外一台电脑&#xff0c;最常用的方法是用u盘或移动硬盘等存储设备来拷贝&#xff0c;这样速度慢&#xff0c;而且可能拷贝多次才能将数据拷贝完。现提供一种方法&#xff0c;就是通过windows 的文件共享来实现。通过千兆网线直接连…