前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java学习笔记_零基础系列(十四)Java中的static关键字(上)

Java学习笔记_零基础系列(十四)Java中的static关键字(上)

原创
作者头像
牛仔码农
修改于 2021-08-10 10:13:46
修改于 2021-08-10 10:13:46
38300
代码可运行
举报
文章被收录于专栏:Java学习教程Java学习教程
运行总次数:0
代码可运行

✔上一篇Java零基础系列文章我们说到了Java种this关键字的使用,今天继续来说说Java中的static关键字,篇幅较多,分为上下两篇更新,这篇文章主要内容:

  1. Java中static关键字
  2. Java中static静态变量

Java中的static关键字

static是java语言中的关键字,表示“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。

在java语言中凡是用static修饰的都是类相关的,不需要创建对象,直接通过“类名”即可访问,即使使用“引用”去访问,在运行的时候也和堆内存当中的对象无关。

有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。

在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main()。因为在程序开始执行时必须调用main() ,所以它被声明为static。\

  • 声明为static的变量称为静态变量或类变量。可以直接通过类名引用静态变量,也可以通过实例名来引用静态变量,但最好采用前者,因为后者容易混淆静态变量和一般变量。静态变量是跟类相关联的,类的所有实例共同拥有一个静态变量。\
  • 声明为static的方法称为静态方法或类方法。静态方法可以直接调用静态方法,访问静态变量,但是不能直接访问实例变量和实例方法。静态方法中不能使用this关键字,因为静态方法不属于任何一个实例。

Java中static静态变量

java中的变量包括:局部变量和成员变量,在方法体中声明的变量为局部变量,有效范围很小,只能在方法体中访问,方法结束之后局部变量内存就释放了,在内存方面局部变量存储在栈当中。

在类体中定义的变量为成员变量,而成员变量又包括实例变量和静态变量,当成员变量声明时使用了static关键字,那么这种变量称为静态变量,没有使用static关键字称为实例变量,实例变量是对象级别的,每个对象的实例变量值可能不同,所以实例变量必须先创建对象,通过“引用”去访问,而静态变量访问时不需要创建对象,直接通过“类名”访问。

实例变量存储在堆内存当中,静态变量存储在方法区当中。实例变量在构造方法执行过程中初始化,静态变量在类加载时初始化。

那么变量在什么情况下会声明为静态变量呢?

请看以下代码,定义一个“男人”类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Man {
	//身份证号
	int idCard;
	//性别(所有男人的性别都是“男”)
	//true表示男,false表示女
	boolean sex = true;
	public Man(int idCard){
		this.idCard = idCard;
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ManTest {
	public static void main(String[] args) {
		Man jack = new Man(100);
		System.out.println(jack.idCard + "," + (jack.sex ? "男" : "女"));
		Man sun = new Man(101);
		System.out.println(sun.idCard + "," + (sun.sex ? "男" : "女"));
		Man cok = new Man(102);
		System.out.println(cok.idCard + "," + (cok.sex ? "男" : "女"));
	}
}

运行结果如下图所示:

图1:运行结果
图1:运行结果

我们来看一下以上程序的内存结构图:

图2:内存结构图
图2:内存结构图

“男人类”创建的所有“男人对象”,每一个“男人对象”的身份证号都不一样,该属性应该每个对象持有一份,所以应该定义为实例变量,而每一个“男人对象”的性别都是“男”,不会随着对象的改变而变化,性别值永远都是“男”,这种情况下,性别这个变量还需要定义为实例变量吗,有必要让每一个“男人对象”持有一份吗,这样岂不是浪费了大量的堆内存空间,所以这个时候建议将“性别=男”属性定义为类级别的属性,声明为静态变量,上升为“整个族”的数据,这样的变量不需要创建对象直接使用“类名”即可访问。

请看代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Man {
	//身份证号
	int idCard;
	//性别(所有男人的性别都是“男”)
	//true表示男,false表示女
	static boolean sex = true;
	public Man(int idCard){
		this.idCard = idCard;
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ManTest {
	public static void main(String[] args) {
		Man jack = new Man(100);
		System.out.println(jack.idCard + "," + (Man.sex ? "男" : "女"));
		Man sun = new Man(101);
		System.out.println(sun.idCard + "," + (Man.sex ? "男" : "女"));
		Man cok = new Man(102);
		System.out.println(cok.idCard + "," + (Man.sex ? "男" : "女"));
	}
}

运行结果如下图所示:

图3:运行结果
图3:运行结果

我们来看一下以上程序的内存结构图:

图4:静态变量内存图
图4:静态变量内存图

通过以上内容的学习我们得知,当一个类的所有对象的某个“属性值”不会随着对象的改变而变化的时候,建议将该属性定义为静态属性(或者说把这个变量定义为静态变量),静态变量在类加载的时候初始化,存储在方法区当中,不需要创建对象,直接通过“类名”来访问。如果静态变量使用“引用”来访问,可以吗,如果可以的话,这个访问和具体的对象有关系吗?

来看以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ManTest {
	public static void main(String[] args) {
		//静态变量比较正式的访问方式
		System.out.println("性别 = " + Man.sex);
		//创建对象
		Man jack = new Man(100);
		//使用“引用”来访问静态变量可以吗?
		System.out.println("性别 = " + jack.sex);
		//对象被垃圾回收器回收了
		jack = null;
		//使用“引用”还可以访问吗?
		System.out.println("性别 = " + jack.sex);
	}
}

运行结果如下图所示:

图5:静态变量使用“引用”访问
图5:静态变量使用“引用”访问

通过以上代码以及运行结果可以看出,静态变量也可以使用“引用”去访问,但实际上在执行过程中,“引用”所指向的对象并没有参与,如果是空引用访问实例变量,程序一定会发生空指针异常,但是以上的程序编译通过了,并且运行的时候也没有出现任何异常,这说明虽然表面看起来是采用“引用”去访问,但实际上在运行的时候还是直接通过“类”去访问的。静态方法是这样吗?

请看以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Man {
	//身份证号
	int idCard;
	//性别(所有男人的性别都是“男”)
	//true表示男,false表示女
	static boolean sex = true;
	public Man(int idCard){
		this.idCard = idCard;
	}
	//静态方法
	public static void printInfo(){
		System.out.println("-----" + (Man.sex ? "男" : "女") + "------");
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ManTest {
	public static void main(String[] args) {
		//静态变量比较正式的访问方式
		System.out.println("性别 = " + Man.sex);
		//创建对象
		Man jack = new Man(100);
		//使用“引用”来访问静态变量可以吗?
		System.out.println("性别 = " + jack.sex);
		//对象被垃圾回收器回收了
		jack = null;
		//使用“引用”还可以访问吗?
		System.out.println("性别 = " + jack.sex);
		//静态方法比较正式的访问方式
		Man.printInfo();
		//访问静态方法可以使用引用吗?并且空的引用可以吗?
		jack.printInfo();
	}
}

运行结果如下图所示:

图6:静态方法可以使用引用访问吗
图6:静态方法可以使用引用访问吗

通过以上代码测试得知,静态变量和静态方法比较正式的方式是直接采用“类名”访问,但实际上使用“引用”也可以访问,并且空引用访问静态变量和静态方法并不会出现空指针异常。实际上,在开发中并不建议使用“引用”去访问静态相关的成员,因为这样会让程序员困惑,因为采用“引用”方式访问的时候,程序员会认为你访问的是实例相关的成员。

总之,所有实例相关的,包括实例变量和实例方法,必须先创建对象,然后通过“引用”的方式去访问,如果空引用访问实例相关的成员,必然会出现空指针异常。所有静态相关的,包括静态变量和静态方法,直接使用“类名”去访问。虽然静态相关的成员也能使用“引用”去访问,但这种方式并不被主张。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java零基础学习之路(十)Java中static关键字
static是java语言中的关键字,表示“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。在java语言中凡是用static修饰的都是类相关的,不需要创建对象,直接通过“类名”即可访问,即使使用“引用”去访问,在运行的时候也和堆内存当中的对象无关。
挨踢小子部落阁
2023/03/15
5650
Java零基础学习之路(十)Java中static关键字
Java基础学习-static关键字
在类中,用static声明的成员变量为静态成员变量,或者叫做:类属性,类变量。 静态属性的访问形式: 对象名.属性 类名.属性 它为该类的公用变量,类属性,被该类的所有实例共享,在类被载入时被显式初始化 public class StaticDemo { String name = "zhangsan"; static int age = 30; public static void main(String[] args) { StaticDemo staticDe
FutureTester
2021/12/19
2980
Java学习笔记_零基础系列(十四)Java中的static关键字(下)
静态代码块在类加载时执行,并且只执行一次。开发中使用不多,但离了它有的时候还真是没法写代码。
牛仔码农
2021/08/13
3250
static关键字
   对于static关键字的用法,主要分为三个部分,分别是静态变量、静态方法和静态类。 1.静态变量 静态变量(静态域)不是类的某个具体对象所有,而是类的所有对象共有的,静态变量既能够被对象调用,也可以用类来调用。 package StaticTest_4_3; public class StaticTest { public static int count = 3; public static void main(String[] args) { StaticTest test1 =
Mister24
2018/05/14
7200
java static关键字
java中的static关键字和静态成员 在java中声明类的成员变量和成员方法时,可以使用static关键字把成员声明为静态成员。静态变量也叫类变量,非静态变量叫实例变量,静态方法也叫类方法,非静态方法叫实例方法。 类变量属于整个类,一个类可以创建多个对象,但类的每个静态变量在内存中只有一份拷贝为该类的所有对象共享。类变量(类方法)不用创建对象就可以直接通过类名访问。下面举例说明类变量与实例变量的区别: class UseBook{ String name
葫芦
2019/04/17
5500
java中static关键字的作用_java中static关键字的作用
简单来说,在Java语言中,static主要有5中使用情况:成员变量、成员方法、代码块,内部类和静态导包。
全栈程序员站长
2022/09/07
6820
java中static关键字的作用_java中static关键字的作用
Java中static、final关键字【详解】
静态成员变量(被static修饰,属于类、加载一次、内存中只有一份)。直接用 类名 访问即可,因为类只有一个,所以静态成员变量在内存区域中也只有一份,所有的对象都可以共享该变量。
寻求出路的程序媛
2024/03/25
5330
Java中static、final关键字【详解】
Java基础--static关键字
不管是平时阅读源代码,还是笔试、面试中,static关键字还是经常被问道,这篇文章主要来重新复习一下该关键字。
河岸飞流
2019/08/08
5040
Java基础--static关键字
Java学习笔记 static关键字作用和应用
1)static修饰成员变量 static变量称作静态变量、类变量。 静态变量和非静态变量的区别是: 一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。而非静态变量是实例对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
用户5513909
2023/04/25
2290
Java学习笔记   static关键字作用和应用
Java基础系列---static关键字
  今天在和同事讨论的时候谈到了关于static的问题,正巧自己有一些忘记了,就特来学习一番。
haoming1100
2018/12/12
4850
Java的static关键字 非常常用的操作
在Java中,将static列为一个关键字,用来修饰类层次的成员,被所有对象共享。
Designer 小郑
2023/08/01
1660
Java的static关键字 非常常用的操作
【IT领域新生必看】Java中的Static关键字详解:小白也能轻松掌握的神奇用法
在Java编程中,static关键字是一个非常重要的概念。它可以用于变量、方法、代码块以及嵌套类,提供了在内存管理和代码结构上的独特优势。对于初学者来说,理解并正确使用static关键字是掌握Java编程的重要一步。本篇文章将详细介绍static关键字的用法及其应用场景,帮助你全面理解这一关键概念。
E绵绵
2024/07/12
3200
static关键字详解
关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。
共饮一杯无
2022/11/28
4090
static关键字详解
java基础之static关键字
  我们创建类时会指出那个类的对象的外观与行为。用new 创建那个类的一个对象,只有执行了 new 后,才会正式生成数据存储空间,并可使用相应的方法。但是这带来了下面的不足之处。 1、只想用一个存储区域来保存一个特定的数据,无论要创建多少个对象,甚至根本不创建对象。 2、是我们需要一个特殊的方法,即使没有创建对象,也可以调用的方法。   为了解决上面的问题,我们使用static关键字进行修饰。
jiankang666
2022/05/13
2170
Java系列:关于关键字this和static
在C语言中,我们经常会遇到指针,也常常被指针所困扰,毕竟它经常惹程序员头疼。那么在Java中我们便方便多了,只是因为有了this.
小Bob来啦
2022/01/17
2250
Java系列:关于关键字this和static
Java中static关键字的作用
static关键字主要有两种作用: 第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。 第二,实现某个方法或属性与类而不是对象关联在一起 具体而言,在Java语言中,static主要有4中使用情况:成员变量、成员方法、代码块和内部类 (1)static成员变量: Java类提供了两种类型的变量:用static关键字修饰的静态变量和不用static关键字修饰的实例变量。静态变量属于类,在内存中只有一个复制,只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。对静态
程序员互动联盟
2018/03/16
1.2K0
Java下static关键字用法详解
  本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家。
哲洛不闹
2018/09/19
6640
Java下static关键字用法详解
浅谈java中static关键字修饰的几种用法
在java的关键字中,static和final是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。下面我们先来了解一下static关键字及其用法。
用户7886150
2021/01/31
3970
深入理解java中的static关键字
static关键字是摆在刚入行编程语言的小白们面前的一道难题,为什么要用static?使用它有什么好处?修饰方法和修饰变量有什么区别?本文将就java中static关键字的使用方法及注意事项进行深入探讨,一是为了方便自己以后查阅,二也为了与大家交流分享学习的经验。
用户7886150
2020/12/13
1.8K0
Java static 关键字
静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法。静态变量与实例变量不同,实例变量总是通过对象来访问,因为它们的值在对象和对象之间有所不同。
await
2021/09/09
3090
相关推荐
Java零基础学习之路(十)Java中static关键字
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验