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

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

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

接上篇Java-static关键字(上),今儿继续写完,这篇文章主要内容如下:

  • Java static静态代码块
  • Java static静态方法

Java static静态代码块

静态代码块的语法格式是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
//静态代码块
static{
java语句;
}
}

静态代码块在类加载时执行,并且只执行一次。开发中使用不多,但离了它有的时候还真是没法写代码。

静态代码块实际上是java语言为程序员准备的一个特殊的时刻,这个时刻就是类加载时刻,如果你想在类加载的时候执行一段代码,那么这段代码就有的放矢了。

例如我们要在类加载的时候解析某个文件,并且要求该文件只解析一次,那么此时就可以把解析该文件的代码写到静态代码块当中了。

我们来测试一下静态代码块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StaticTest01 {
	//静态代码块
	static{
		System.out.println(2);
	}
	//静态代码块
	static{
		System.out.println(1);
	}
	//main方法
	public static void main(String[] args) {
		System.out.println("main execute!");
	}
	//静态代码块
	static{
		System.out.println(0);
	}
}

运行结果如下图所示:

图1:静态代码块运行结果

通过以上的测试可以得知一个类当中可以编写多个静态代码块(尽管大部分情况下只编写一个),并且静态代码块遵循自上而下的顺序依次执行,所以有的时候放在类体当中的代码是有执行顺序的(大部分情况下类体当中的代码没有顺序要求,方法体当中的代码是有顺序要求的,方法体当中的代码必须遵守自上而下的顺序依次逐行执行),另外静态代码块当中的代码在main方法执行之前执行,这是因为静态代码块在类加载时执行,并且只执行一次。

再来看一下以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StaticTest02 {
	int i = 100;
	static{
		System.out.println(i);
	}
}

编译结果如下图所示:

图2:静态代码块中访问实例变量编译报错

为什么编译报错呢?

那是因为i变量是实例变量,实例变量必须先创建对象才能访问,静态代码块在类加载时执行,这个时候对象还没有创建呢,所以i变量在这里是不能这样访问的。可以考虑在i变量前添加static,这样i变量就变成静态变量了,静态变量访问时不需要创建对象,直接通过“类”即可访问,例如以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StaticTest02 {
	static int i = 100;
	static{
		System.out.println("静态变量i = " + i);
	}
	public static void main(String[] args) {
	}
}

运行结果如下图所示:

图3:静态代码块中访问静态变量

代码修改为这样呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StaticTest02 {
	static{
		System.out.println("静态变量i = " + i);
	}
	static int i = 100;
}

编译报错了,请看下图:

图4:编译报错信息

通过测试,可以看到有的时候类体当中的代码也是有顺序要求的(类体当中定义两个独立的方法,这两个方法是没有先后顺序要求的),静态代码块在类加载时执行,静态变量在类加载时初始化,它们在同一时间发生,所以必然会有顺序要求,如果在静态代码块中要访问i变量,那么i变量必须放到静态代码块之前。

Java static静态方法

方法在什么情况下会声明为静态的呢?方法实际上描述的是行为动作,我认为当某个动作在触发的时候需要对象的参与,这个方法应该定义为实例方法,例如:每个玩篮球的人都会打篮球,但是你打篮球和科比打篮球最终的效果是不一样的,显然打篮球这个动作存在对象差异化,该方法应该定义为实例方法。

再如:每个高中生都有考试的行为,但是你考试和学霸考试最终的结果是不一样的,一个上了“家里蹲大学”,一个上了“清华大学”,显然这个动作也是需要对象参与才能完成的,所以考试这个方法应该定义为实例方法。

以上描述是从设计思想角度出发来进行选择,其实也可以从代码的角度来进行判断,当方法体中需要直接访问当前对象的实例变量或者实例方法的时候,该方法必须定义为实例方法,因为只有实例方法中才有this,静态方法中不存在this。

请看代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Customer {
	String name;
	public Customer(String name){
		this.name = name;
	}
	public void shopping(){
		//直接访问当前对象的name
		System.out.println(name + "正在选购商品!");
		//继续让当前对象去支付
		pay();
	}
	public void pay(){
		System.out.println(name + "正在支付!");
	}
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CustomerTest {
	public static void main(String[] args) {
		Customer jack = new Customer("jack");
		jack.shopping();
		Customer rose = new Customer("rose");
		rose.shopping();
	}
}

运行结果如下图所示:

图5:运行结果

在以上的代码中,不同的客户购物,最终的效果都不同,另外在shopping()方法中访问了当前对象的实例变量name,以及调用了实例方法pay(),所以shopping()方法不能定义为静态方法,必须声明为实例方法。

另外,在实际的开发中,“工具类”当中的方法一般定义为静态方法,因为工具类就是为了方便大家的使用,将方法定义为静态方法,比较方便调用,不需要创建对象,直接使用类名就可以访问。

请看以下工具类,为了简化“System.out.println();”代码而编写的工具类:

代码语言:java
AI代码解释
复制
public class U {
	public static void p(int data){
		System.out.println(data);
	}
	public static void p(long data){
		System.out.println(data);
	}
	public static void p(float data){
		System.out.println(data);
	}
	public static void p(double data){
		System.out.println(data);
	}
	public static void p(boolean data){
		System.out.println(data);
	}
	public static void p(char data){
		System.out.println(data);
	}
	public static void p(String data){
		System.out.println(data);
	}
}

运行结果如下图所示:

图6:测试工具类

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java零基础学习之路(十)Java中static关键字
static是java语言中的关键字,表示“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。在java语言中凡是用static修饰的都是类相关的,不需要创建对象,直接通过“类名”即可访问,即使使用“引用”去访问,在运行的时候也和堆内存当中的对象无关。
挨踢小子部落阁
2023/03/15
5650
Java零基础学习之路(十)Java中static关键字
原荐你知道么?static关键字有5种用法。
     说到static,静态变量和静态方法大家随口就来,因为他们在实际开发中应用很广泛,但他们真正在使用的时候会存在很多问题,而且它的使用不只那两种:       1.静态变量。       2.静态方法。       3.静态代码块。       4.静态内部类。       5.静态导入。 接下来我们看一下这些用法。 1.静态变量       静态变量属于类,内存中只有一个实例,当类被加载,就会为该静态变量分配内存空间,跟 class 本身在一起存放在方法区中永远不会被回收,除非 JVM 退出。(方
我叫刘半仙
2018/04/16
9680
原荐你知道么?static关键字有5种用法。
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学习笔记_零基础系列(十四)Java中的static关键字(上)
static是java语言中的关键字,表示“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。
牛仔码农
2021/08/10
3840
【IT领域新生必看】Java中的Static关键字详解:小白也能轻松掌握的神奇用法
在Java编程中,static关键字是一个非常重要的概念。它可以用于变量、方法、代码块以及嵌套类,提供了在内存管理和代码结构上的独特优势。对于初学者来说,理解并正确使用static关键字是掌握Java编程的重要一步。本篇文章将详细介绍static关键字的用法及其应用场景,帮助你全面理解这一关键概念。
E绵绵
2024/07/12
3240
Java的static关键字 非常常用的操作
在Java中,将static列为一个关键字,用来修饰类层次的成员,被所有对象共享。
Designer 小郑
2023/08/01
1700
Java的static关键字 非常常用的操作
Java学习笔记_零基础系列(十三)Java中的this关键字
this是java语言中的一个关键字,它存储在内存的什么地方呢,一起来看一段程序:
牛仔码农
2021/08/09
3650
详解static关键字在Java中的各种适应场景,这个很重要!
静态(static)关键字在Java的众多关键字中举足轻重!也是很多大厂面试官特别喜欢问的面试高频知识点,今天我们就一起学习,梳理,重温一下这个关键吧,之所以用重温修饰是因为在过往的文章中早已提到了static,无论是变量中还是方法中甚至于类中,static都是不可或缺的!
JavaBuild
2024/05/27
950
详解static关键字在Java中的各种适应场景,这个很重要!
深入理解static关键字
static 是我们日常生活中经常用到的关键字,也是 Java 中非常重要的一个关键字,static 可以修饰变量、方法、做静态代码块、静态导包等,下面我们就来具体聊一聊这个关键字,我们先从基础开始,从基本用法入手,然后分析其原理、优化等。
程序员Leo
2023/08/02
3730
深入理解static关键字
Java中static、final关键字【详解】
静态成员变量(被static修饰,属于类、加载一次、内存中只有一份)。直接用 类名 访问即可,因为类只有一个,所以静态成员变量在内存区域中也只有一份,所有的对象都可以共享该变量。
寻求出路的程序媛
2024/03/25
6050
Java中static、final关键字【详解】
java基础之static关键字
  我们创建类时会指出那个类的对象的外观与行为。用new 创建那个类的一个对象,只有执行了 new 后,才会正式生成数据存储空间,并可使用相应的方法。但是这带来了下面的不足之处。 1、只想用一个存储区域来保存一个特定的数据,无论要创建多少个对象,甚至根本不创建对象。 2、是我们需要一个特殊的方法,即使没有创建对象,也可以调用的方法。   为了解决上面的问题,我们使用static关键字进行修饰。
jiankang666
2022/05/13
2170
static关键字的用法和作用
在Java中,static 是一个关键字,用于声明静态成员。静态成员属于类,而不属于类的任何实例。当类被加载时,静态成员就会被初始化,并且在整个程序的生命周期内只会被初始化一次。
GeekLiHua
2025/01/21
1290
static关键字的用法和作用
Java基础--static关键字
不管是平时阅读源代码,还是笔试、面试中,static关键字还是经常被问道,这篇文章主要来重新复习一下该关键字。
河岸飞流
2019/08/08
5060
Java基础--static关键字
java中static的用法[通俗易懂]
编写程序模拟实现选民投票过程,一群选民进行投票,每一个选民只允许进行一次投票,并且当投票总数达到100时,就停止投票
全栈程序员站长
2022/09/08
5630
Java下static关键字用法详解
  本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家。
哲洛不闹
2018/09/19
6660
Java下static关键字用法详解
Java关键字final、static使用总结
一、final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。 final类不能被继承,没有子类,final类中的方法默认是final的。 final方法不能被子类的方法覆盖,但可以被继承。 final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 final不能用于修饰构造方法。
用户1112962
2018/07/03
8380
Java系列:关于关键字this和static
在C语言中,我们经常会遇到指针,也常常被指针所困扰,毕竟它经常惹程序员头疼。那么在Java中我们便方便多了,只是因为有了this.
小Bob来啦
2022/01/17
2310
Java系列:关于关键字this和static
Java关键字(三)——static
  我们说Java是一种面向对象编程的语言,而对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,对同类对象抽象出其共性,便是Java中的类,我们可以用类描述世间万物,也可以说万物皆对象。但是这里有个特殊的东西——static,它不属于对象,那么为什么呢?
IT可乐
2018/07/24
9790
static关键字详解
关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。
共饮一杯无
2022/11/28
4110
static关键字详解
一篇文章带你了解Java中的static关键字和静态变量、静态方法
前面几篇文章用Java带大家一起了解了几个游戏小项目,感兴趣的小伙伴可以点击文章观摩下,手把手教你用Java打造一款简单故事书(上篇)、手把手教你用Java打造一款简单故事书(下篇)、手把手教你用Java打造一款简单考试系统(上篇)、手把手教你用Java打造一款简单考试系统(下篇)、手把手带你用Java打造一款对对碰游戏(上篇)、手把手带你用Java打造一款对对碰游戏(下篇)、手把手带你用Java实现点灯游戏(上篇)、手把手带你用Java实现点灯游戏(下篇),接下来的几篇文章是关于Java基础的,希望对大家的学习有帮助,欢迎大家在讨论区留言。
Java进阶者
2021/01/22
5930
推荐阅读
相关推荐
Java零基础学习之路(十)Java中static关键字
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验