专栏首页开发杂记Java基础--static关键字

Java基础--static关键字

不管是平时阅读源代码,还是笔试、面试中,static关键字还是经常被问道,这篇文章主要来重新复习一下该关键字。

一、static用途

static方便在没有创建对象的时候调用方法或者变量。 static关键字可以用来==修饰类的成员方法、类的成员变量==。也可以==编写代码块==来优化程序性能。 被static关键字修饰的方法或者变量,不依赖对象来访问,只要类被加载了,就可以通过==类名.Method/Field==的形式来访问。

  • static方法 static方法一般被称之为静态方法,由于静态方法不依赖于对象,就没有this的说法,因此在静态方法中是不能调用类的非静态方法/成员变量。 如果在不想创建对象的情况下调用某个方法,可以将该方法定义成static方法,典型的例如main方法。
  • static变量 static变量一般称之为静态变量,它与非静态变量的区别在于,静态变量被所有的对象共享,在内存只有一个副本,它当且仅当类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static成员变量的初始化顺序按照定义的顺序进行初始化。
  • static代码块 static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。看一下实际的例子会更清楚。

由于静态代码块仅在类加载时执行一次,可以利用该特性做一下代码层面的优化。 二、静态变量的生命周期

  • 加载:java虚拟机在加载类的过程中为静态变量分配内存
  • 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享
  • 销毁:类被卸载时,静态变量被销毁,并释放内存空间。==static变量的生命周期取决于类的生命周期== 三、一道题看自己是否掌握 看一下下面会打印出什么 public class Father { Person person = new Person("Father"); static { System.out.println("Father 静态代码块"); } public Father() { System.out.println("Father 构造方法"); } public static void main(String[] args) { new Son(); } } public class Son extends Father { Person person = new Person("Son"); static { System.out.println("Son 静态代码块"); } public Son() { System.out.println("Son 构造方法"); } } public class Person { static { //不加\n会跟构造方法中打印到一行 System.out.print("person 静态代码块\n"); } public Person(String str) { System.out.println("person " + str); } }

简单分析一下类的加载过程,首先加载Father类 ,执行Father的静态代码块,接着执行new Son(),由于Son没有被加载,开始加载Son类,发现Son继承自Father,但是Father类已经被加载过了,所以只需要加载Son类,先执行Son静态代码块。在加载完只有,开始调用构造器来生成对象。在生成对象的时候必须先初始化父类的成员变量,因此会执行Father中的Person person = new Person("Father"),此时Person类还没有被加载过,那么先加载Person类,就要先执行person中的静态代码块,接着执行父类的构造器,完成了父类的初始化,然后就来初始化自身了,因此会接着执行Son中的Person person = new Person(),最后执行Son的构造器。打印结果如下

总结一下类初始化的顺序:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • zTree设置异步加载后展开

    河岸飞流
  • iframe内存释放

    Ext 核心开发人员Jack的回答是,TabPanelItem在关闭时并不会对自定义到tab中的元素做特殊处理,这部分工作必须在控件外来完成。另一方面, 相关资...

    河岸飞流
  • gitlab启用https

    河岸飞流
  • 浅谈动态类型领域中 Python 的变量、对象以及引用。

    写这篇文章源自上次和一位读者的交流,在给他回答问题的时候我发现由于之前有学习 C 和 Java 这种静态编译类型语言的背景,使他在学习 Python 的时候还是...

    Rocky0429
  • Ambarella展示了新的机器人平台和AWS人工智能编程协议

    Ambarella公司总部位于加州圣克拉拉,以芯片闻名。近日,它宣布了一个新的机器人平台,该平台基于其用于人工智能处理的CVflow架构。此外,它还与亚马逊网络...

    AiTechYun
  • 那些你可能不知道的 ocr 图片文字识别工具

    有时候网上看到一张图片,比如电影截图,里面有台词,想把台词复制出来,这时候你可能会照着图片中的文字,手动打出来,但如果文字太多或者一篇文章,这样你会崩溃的,这时...

    苏生不惑
  • synchronized 关键字

    synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。

    崔笑颜
  • 浅析XSS的几种测试方法

    0x00 背景 最近看到一个好玩的xss社区,准备通过几个经典的关卡来剖析一下XSS,本文仅提供经典案例。 试玩链接:http://tr.secevery...

    用户1467662
  • 超可爱!这款打卡小程序,竟然还能养宠物

    不知从何时起,「打卡风」四起,打开朋友圈,各种打卡动态精彩纷呈,除了上班不想打卡外,其他卡无不被大家玩得不亦乐乎。

    知晓君
  • 战胜拖延症!用这 4 款时间管理小程序,开启高效人生

    每天戴领带上班(2009 年)、学习汉语(2010 年)、只吃自己杀死的动物的肉(2011 年)、每天写代码(2012 年)、每天跟除 Facebook 员工之...

    知晓君

扫码关注云+社区

领取腾讯云代金券