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的构造器。打印结果如下

总结一下类初始化的顺序:
- 静态变量、静态代码块初始化
- 构造函数(有父类、先初始化父类成员变量)
- 自定义构造函数
参考文章:https://www.cnblogs.com/dolphin0520/p/3799052.html
Java基础--static关键字的更多相关文章
- java基础—static关键字
一.static关键字
- java基础--static关键字的使用
一.static关键字的作用 使类成员完全独立于该类的任何对象.通常情况下,类成员必须通过它的类的对象访问,但是被static修饰的成员,能够被自己访问,而不必引用特定的实例. 一旦一个成员被声明为s ...
- Java基础-synchronized关键字的用法(转载)
synchronized--同步 顾名思义是用于同步互斥的作用的. 这里精简的记一下它的使用方法以及意义: 当synchronized修饰 this或者非静态方法或者是一个实例的时候,所同步的锁是加在 ...
- java中static关键字的作用
java中static关键字主要有两种作用: 第一:为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 简单来说,在Java语言中,s ...
- Java的static关键字
本文参考:Java的static关键字 通过static关键字可以满足两方面的需要.一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象.另一种情形是,希 ...
- java的static关键字 – Break易站
本文内容来自:java的static关键字 – Break易站 (原文网站阅读体验更好) 通过static关键字可以满足两方面的需要.一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多 ...
- Java面向对象-static关键字、静态方法与普通方法、静态成员变量
Java面向对象-static关键字.静态方法与普通方法 static关键字的基本作用:方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者变量不需要依赖于 ...
- Java 静态static关键字,main函数,对象的初始化过程,对象调用成员,单例模式的设计,静态代码块(6)
Java 静态static关键字,静态代码块详情参考:static的使用原理讲解http://www.cnblogs.com/itcqx/p/5519464.html main函数: java Mai ...
- 面试官:兄弟,说说Java的static关键字吧
读者乙在上一篇我去系列文章里留言说,"我盲猜下一篇标题是,'我去,你竟然不知道 static 关键字'".我只能说乙猜对了一半,像我这么有才华的博主,怎么可能被读者猜中了心思呢,必 ...
随机推荐
- LDoc使用总结
LDoc使用总结 安装 按照下面的安装就可以了 http://www.cnblogs.com/ZhYQ-Note/articles/6022525.html 使用 参考:官方的说明文档 https:/ ...
- SKF密码设备研究
SKF介绍 SKF接口是国密标准中智能密码钥匙的C语言应用开发接口标准,目前很多国内密码密码设备厂商都为其产品提供了SKF接口的开发包.开发者可以通过统一的SKF接口开发密码应用,访问来自不同设备供应 ...
- 福州大学软件工程1916|W班 第10、11次作业成绩排名
作业链接 项目Alpha冲刺(团队) 事后诸葛亮(团队) 评分细则 博客评分标准 本次作业包括现场Alpha答辩评分(映射总分为100分)+博客分(总分130分)+贡献度得分,其中博客分由以下部分组成 ...
- 【RabbitMQ学习之一】RabbitMQ入门
环境 win7 rabbitmq-server-3.7.17 Erlang 22.1 RabbitMQ使用Erlang语言开发消息中间件.RabbitMQ基于AMQP(高级消息队列协议)协议,更适合业 ...
- Maven 教程(9)— Maven坐标详解
原文地址:https://blog.csdn.net/liupeifeng3514/article/details/79544532 Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种j ...
- python 在cmd时执行celery -A tasks worker --loglevel=info报错:failed to create process怎么解决
在cmd命令前加 : python -m 命令(如:python -m celery -A tasks worker --loglevel=info) -m: 将库中的python模块用作脚本去运行, ...
- Linux内核中的IS_ERR()实现
1.前言 对于任何一个指针来说,必然有三种情况:一种是有效指针,一种是NULL,也就是空指针,一种是错误指针,也就是无效指针,在Linux内核中,所谓的错误指针就是指其已经到达了内核空间的最后一个pa ...
- javascript 函数的暂停和恢复
javascript 异步编程从来都是一个难题,最开始我们用 callback,但随之触发了回调地狱,于是"发明" Promise 解决 callback 嵌套过深的问题.然而由于 ...
- FLASK-SQLALCHEMY如何使用or和and条件进行组合查询
FLASK-SQLALCHEMY如何使用or和and条件进行组合查询 http://www.cherishlau.site/2018/03/29/flask-sqlalchemy-use-or-and ...
- Background Suppression Network for Weakly-supervised Temporal Action Localization [Paper Reading]
研究内容:弱监督时域动作定位 结果:Thumos14 mAP0.5 = 27.0 ActivityNet1.3 mAP0.5 = 34.5 从结果可以看出弱监督这种瞎猜的方式可以PK掉早些时候的一些全 ...