static 关键字介绍
大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!!
Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,(这块涉及到JVM的内存模型,静态成员在堆内存的永久带)即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问。当然,鉴于他作用的特殊性更推荐用类名访问~~
例如:
public class HelloWorld { // 定义静态变量,保存班级名称
static String className = "JAVA开发一班"; public static void main(String[] args) { // 访问静态变量,输出班级名称
System.out.println(HelloWorld.className );
HelloWorld helloWorld = new HelloWorld();
System.out.println(helloWorld.className) ;
}
}
使用 static 可以修饰变量、方法和代码块。
需要注意:
1、 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员,如果要想在静态方法中调用非静态变量,可以通过实例化对象,通过对象.属性访问对象的属性。
例如:
public class HelloWorld { // 定义静态变量score1
static int score1 = 86;
String name = "张三" ;
public static void main(String[] args) {
System.out.println(HelloWorld.score1);
System.out.println(HelloWorld.name); //此处的代码在idea会直接报错。在静态方法中不能访问非静态变量。可以通过实例化对象,通过对象访问。
HelloWorld helloWorld = new HelloWorld();
System.out.println(helloWorld.name);
}
}
静态代码块
我们知道,Java 中可以通过初始化块进行数据赋值
例如:
public class HelloWorld { String name ; //定义成员变量
{
name = "zhangsan"; //在初始化块中初始化成员变量的值。
}
}
在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块。如果使用 static 修饰初始化块,就称为静态初始化块。
需要特别注意:静态初始化块只在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
上面这段红字标注的很重要,解读一下,创建类的实例(new 类的时候),初始化块new一次就会执行一次,但是static修饰的只会执行一次,因为他是属于类成员,只在类加载的时候初始化一次,所以不管new多少次,static 修饰的代码块只会执行一次。(这块如果对jvm的内存模型不理解,可能感觉有点抽象。后面我们会有专门博客介绍jvm内存模型)
上面的说明的例子如下:
public class HelloWorld { String name; // 声明变量name
String sex; // 声明变量sex
static int age;// 声明静态变量age // 构造方法
public HelloWorld() {
System.out.println("通过构造方法初始化name");
name = "tom";
} // 初始化块
{
System.out.println("通过初始化块初始化sex");
sex = "男";
} // 静态初始化块
static {
System.out.println("通过静态初始化块初始化age");
age = 20;
} public static void main(String[] args) {
// 创建对象
HelloWorld hello = new HelloWorld();
HelloWorld h1 = new HelloWorld(); }
}
运行这个例子,我还想证明一个问题,构造方法,初始化块,静态代码块,执行的先后顺序,及上面初始化块每次实例化都会执行,static修饰的静态代码块只会执行一次。
执行结果如下:
通过静态初始化块初始化age
通过初始化块初始化sex
通过构造方法初始化name
通过初始化块初始化sex
通过构造方法初始化name
由上面的执行结果,我们可以看出,静态代码块最先执行,初始化块,构造方法依次。并且初始化块和构造方法每次实例化都会执行,静态代码块只会执行一次。
再深入一点,子类和父类,都含有静态代码块,代码块,构造函数,在new子类的过程中,上面子类父类的(静态代码块,代码块,构造函数)初始化顺序顺序是如何的?
package com.sysware.cloud.acl.controller; /**
* Created by tianwenqing on 2019/4/1.
*/
public class Parent{ /**
* 静态代码块
*/
static {
System.out.println("执行了父类静态代码块....");
} /**
* 代码块
*/
{
System.out.println("执行了父类代码块");
} private String name ;
private Integer age ; public Parent(){ System.out.println("执行了父类构造函数");
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}
子类:
package com.sysware.cloud.acl.controller; /**
* Created by tianwenqing on 2019/4/1.
*/
public class Parent{ /**
* 静态代码块
*/
static {
System.out.println("执行了父类静态代码块....");
} /**
* 代码块
*/
{
System.out.println("执行了父类代码块");
} private String name ;
private Integer age ; public Parent(){ System.out.println("执行了父类构造函数");
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}
测试类:
package com.sysware.cloud.acl.controller; /**
* Created by tianwenqing on 2019/4/1.
*/
public class Test { public static void main(String[] args) {
Child child = new Child();
System.out.println("第二次new........");
Child child1 = new Child(); }
}
输出结果如下:
如图可知初始化顺序为:先父类的静态代码块--》子类的静态代码块--》父类的代码块--》父类的构造函数--》子类的代码块--》子类的构造函数。
static 关键字介绍的更多相关文章
- Java中static关键字介绍
static关键字主要有两种作用: 第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关. 第二,实现某个方法或属性与类而不是对象关联在一起 具体而言,在Java语言中,static ...
- c/c++中static与extern关键字介绍
一.C语言中的static关键字 在C语言中,static可以用来修饰局部变量,全局变量以及函数.在不同的情况下static的作用不尽相同. (1)修饰局部变量 一般情况下,对于局部变量是存放在栈区的 ...
- Java中的static关键字和new关键字作用介绍
一.static关键字的作用 1.可以用于修改类的成员变量.代码块和类 通过static可以将类的成员声明为静态成员,静态的成员归属于整个类,而不是属于某个对象.无论通过类还是对象访问静态成员,操作的 ...
- C/C++中static关键字详解
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...
- C/C++中static关键字详解-zz
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值. 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见.用法1:函数内部声明 ...
- ava下static关键字用法详解
Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static ...
- (转)C/C++中static关键字
下面的转自http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html 静态变量作用范围在一个文件内,程序开始时分配空间,结束 ...
- 【转载】static关键字详解
上一篇博客中,因为一个static关键字没有设置好,导致浪费了大量的时间来寻找程序的错误,归根结底,就是大一的时候c语言没有学好. 现在总算知道了,你现在所学的每一个知识点在不就的以后可能及时你的救命 ...
- Java static 关键字详解
引言 在<Java编程思想>中有这样一段话:static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类 ...
随机推荐
- PHP开发者的路书
初学者 作为初学者,通常情况下,我们都会买一本PHP教材,或者在网上看免费教程,这当然是学习的好途径.因为,这些书籍和网上的免费教程,基本上都是由浅入深的渐进式教学方式,基础知识居多,高级知识占少量的 ...
- SpringBoot添加自定义消息转换器
首先我们需要明白一个概念:springboot中很多配置都是使用了条件注解进行判断一个配置或者引入的类是否在容器中存在,如果存在会如何,如果不存在会如何. 也就是说,有些配置会在springboot中 ...
- 【Maven】2.使用Nexus3搭建Maven私服+上传第三方jar包到本地maven仓库
参考文章: http://www.cnblogs.com/luotaoyeah/p/3791966.html --------------------------------------------- ...
- 51nod 1103 N的倍数
1103 N的倍数 一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数. 例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8, ...
- Win7上安装WMware虚拟机和Ubuntu操作系统
效果图: 问题拾遗: 一.如何划分一个新硬盘空间? 参考链接:如何新建磁盘空间 效果图: 我划分了20G的内存空间给Ubuntu的硬盘空间.一般来说15G就够用了. 二.VMware上拷贝Ubuntu ...
- NOI 8467 鸣人的影分身
http://noi.openjudge.cn/ch0206/8467/ 描述 在火影忍者的世界里,令敌人捉摸不透是非常关键的.我们的主角漩涡鸣人所拥有的一个招数——多重影分身之术——就是一个很好的例 ...
- BZOJ 2339 【HNOI2011】 卡农
题目链接:卡农 听说这道题是经典题? 首先明确一下题意(我在这里纠结了好久):有\(n\)个数,要求你选出\(m\)个不同的子集,使得每个数都出现了偶数次.无先后顺序. 这道题就是一道数学题.显然我们 ...
- bugfree 安装配置(Ubuntu16.04 amd 64 Desktop)
上面是我使用的版本! 1.首先搭建 xampp 下载XAMPP:https://www.apachefriends.org/download.html 注意:下载低版本的,不然之后会找不到mysql ...
- steam
1.steam 教育 Science(科学), Technology(技术), Engineering(工程), Arts(艺术), Maths(数学) 2. steam 平台 Steam英文原译为 ...
- Spring Boot入门第二天:一个基于Spring Boot的Web应用,使用了Spring Data JPA和Freemarker。
原文链接 今天打算从数据库中取数据,并展示到视图中.不多说,先上图: 第一步:添加依赖.打开pom.xml文件,添加必要的依赖,完整代码如下: <?xml version="1.0&q ...