Java 语言中关键字“static”的理解和应用详解

接触Java编程语言的初学者们,都是熟悉static这个关键词的,至少混个脸熟了已经。涉及到它的概念、或解释,我们都是知道它表示“静态”、甚至了解“静态存储区”。它可以应用到:

  • 属性
  • 方法
  • 代码块
  • 还可以做“静态导入”
  • 内部类
    一、static修饰的属性,我们亦称之为“静态变量”“类变量”:
    这样的变量属于“类”,不再属于该类型的“对象”们;该类的所有对象,都共享该静态变量的值(也就是都可以访问它、修改它、共享它)。可以使用“类名”直接“引用”、调用、访问静态变量,无需实例化对象在访问。并且,重要的一点是,不可以将非静态变量赋值给静态变量。这些都是老生常谈的技术理论了。我们直接写个代码、再配一张简单的图形,更容易说明、理解。
public class Computer{
	static double screenSize = 15.6;  //屏幕尺寸我们定义为了static
	String color;
	double cpu_freq;
	public void turnOn(){
		System.out.println("I am Started");
	}
}

这里我们定义了一个类Computer,三个属性,其中“屏幕尺寸”属性我们定义为了static,那么在内存中,它与其他两个属性的存在情况会有怎样的实质性区别呢?见下图:
静态成员不放在堆内存中
由此可见:

  • 静态属性分配在静态存储区内,而不是分配在堆内存中;
  • 静态属性事实上是描述了该类的所有对象的共同特征,而非静态属性描述的是每个对象独有的特征,属性相同,值不一定相同的;
  • 静态属性其实在类的第一次加载到JVM中时即分配了静态存储区,以后每次运行不再重新分配空间,依然在使用这个静态存储区,知道JVM停止前,静态存储区的变量一直存在、不会失效。

二、static修饰的方法,亦称为“类方法”“静态方法”
该方法对于类的所有对象来说,已经是共有共享的了,普通方法,我们称之为“实例方法”,是需要实例对象才能引用、调用的方法。而类方法是直接可以通过“类名”来直接调用的;

  • 一般工具类中的方法都定义为静态方法,这样方便方法的使用;
  • 静态方法不可以直接访问非静态变量或非静态方法,静态方法只能访问静态成员,这是因为静态方法在实例化对象之前就可以被类调用了,而此时的非静态成员们还不存在哦~;
  • 静态方法中不可以使用this关键字,更不可以被非静态方法覆盖;
package com.guducoffee.lesson11;
public class StaticDemo02{
	public static void method02(int loops,String msg){
		for(int i=0;i<loops;i++){
			System.out.println((i+1)+"."+msg);
		}
	}
	public static void main(String[] args){
		method02(4,"孰能生巧,巧能生精");
		StaticDemo02.method02(3,"三观要正");
	}
}

运行结果如下:
在这里插入图片描述
三、静态导入,这个更容易理解,见代码示例:
我们希望在下面的示例中导入上面的类中的静态成员,我们可以在import语句中如下实现:

package com.guducoffee.lesson11.subPackage;
import static com.guducoffee.lesson11.StaticDemo02.*;
public class StaticImportDemo {
	public static void main(String[] args) {
		method02(4, "厚德载物");
	}
}

通过“import static com.guducoffee.lesson11.StaticDemo02.*;”可以自动的将指定包中的类中的静态方法导入当前类,并进行正常调用。如这里我们在类StaticImportDemo 中的静态方法中直接调用了StaticDemo02类中的method02()方法、并可以正常运行。
在这里插入图片描述
四、static代码块,静态代码块是类的组成部分之一。
静态代码块就是“一个类中由static关键字修饰的、不包含在任何方法体中的代码块”。

  • 它不属于任何对象(实例),是类的成员;
  • 当类被载入时,静态代码块被执行,并且只被执行一次,即在实例化前就可以运行、执行;
  • 静态块经常用来进行类属性的初始化动作;
    如下示例代码:
public class StaticBlock {
	public StaticBlock() {
		System.out.println("我被调用了!");
	}
	static {
		for(int i=0;i<5;i++) {
			System.out.println("学会了Java,走遍天下都不怕!");
		}
	}
	public static void main(String[] args) {
		StaticBlock b1 = new StaticBlock();
		StaticBlock b2 = new StaticBlock();
		StaticBlock b3 = new StaticBlock();
	}
}

我们来看看运行结果,更清楚看到静态代码块的执行时机了!显然,先于构造方法的调用执行而执行了!只要类被加载了,它就运行了。
在这里插入图片描述
以上,供初识java童鞋们参考、应用!咕嘟咖啡的杨老师愿意跟大家共同探索各种java技术话题!

咕嘟咖啡的杨老师的技术课堂:第二篇-Java面向对象编程
咕嘟咖啡的杨老师的技术课堂:第三篇-Java编程语言高级特性
咕嘟咖啡的杨老师的技术课堂:第一篇-Java编程语言基础
咕嘟咖啡的杨老师的技术课堂:JavaSE-JavaWeb课程项目实战演练

热门文章

暂无图片
编程学习 ·

Linux安全原理简介

Linux安全原理简介介绍在设置Linux计算机的所有阶段,安全性应是首要考虑之一。要在计算机上实施良好的安全策略,需要对Linux的基础知识以及所使用的某些应用程序和协议有充分的了解。Linux的安全性是一个非常重要的主题,并且有许多有关此主题的完整书籍。我不能在本教程中介…
暂无图片
编程学习 ·

leetcode:208. 实现 Trie (前缀树)

链接:https://leetcode-cn.com/problems/implement-trie-prefix-tree/ 实现一个前缀树(节点),一个前缀树节点需要保存它可能的26个孩子的信息,以及这个节点是不是一个单词的结尾。 C++代码: class Trie {Trie * children[26];bool isWord = false; public:/** Initialize…
暂无图片
编程学习 ·

我为什么放弃学术选择创业:这不仅仅关乎人工智能

本文由 Stratifyd 创始人& CEO 汪晓宇(Derek Wang)所写,受福布斯技术委员会(Forbes Technology Council)邀约,原文发布在:https://www.forbes.com/。作为一名公司创始人,我经常进行自我反省,确保我所运营的公司始终坚持公司创立之初的信念。对于我和我的联合创始人…
暂无图片
编程学习 ·

现代化程序开发笔记(13)——Git与Monorepo

本系列文章以我的个人博客的搭建为线索(GitHub 仓库:Evian-Zhang/evian-blog),记录我在现代化程序设计中的一些笔记。在这篇文章中,我将简要介绍代码版本管理利器Git,同时谈一谈Monorepo的工作方式。 代码版本管理工具 作为开发者,我们通常会遇到两种写代码的场景:一种…
暂无图片
编程学习 ·

使用john软件进行账户弱口令检测实验

使用john软件进行账户弱口令检测实验 前言 在生产环境中,服务器账号的密码能够不被黑客入侵破解是尤为重要的,关系着业务正常运行的安全,所以在创建完账户的密码后,我们需要进行弱口令的检测,排查出是否有容易被破解的密码存在。 本次实验使用的破解密码软件是john-1.8.0版…
暂无图片
编程学习 ·

nat表中的dnat snat的使用(iptables)

nat表中的dnat snat的使用- snatiptables -t nat -A POSTROUTING -o enp6s0 -j SNAT --to-source 172.25.254.33- dnatiptables -t nat -A PREROUTING -i enp6s0 -j DNAT --to-dest 170.25.254.22从enp6s0进来的所有数据都转给170.25.254.11,即给enp6s0(172.25.254.33)的所有…
暂无图片
编程学习 ·

mysql(一)认知了解

文章目录mysql(一)数据库(database)什么是mysql系统特性应用场景 mysql(一) 官网 中文的 数据库(database)数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据库是以一定方式储…
暂无图片
编程学习 ·

小甲鱼python听课笔记p11-p15

p11 7.1 列表1 = 打了激素的数组列表可以存放不同类型的数,还可以创建空列表append():向列表里面添加数据末尾添加一个元素但是只能一次插入一个数据extend():扩张的方式来扩展列表末尾添加多个元素,但要求已列表的格式添加[x,x,x,x]用一个列表来扩展另一个列表,所以他…
暂无图片
编程学习 ·

Java 基础 A类集合存的数据B类调用

1.新建一个Callback抽象类public interface Callback {Map<String, Object> a() ; }2. b继承Callbackpublic class b implements Callback{@Overridepublic Map<String, Object> a() {Map<String,Object> map=new HashMap<>();map.put("china&q…
暂无图片
编程学习 ·

其实AQS并不难

不啰嗦,直接上干货 文章目录上锁解锁总结条件队列 newConditionCLH队列的数据结构扩展 interrupted 上锁ReentrantLock reentrantLock = new ReentrantLock(true);或者ReentrantLock reentrantLock = new ReentrantLock();看构造函数://无参的构造函数,默认为非公平锁public…
暂无图片
编程学习 ·

计算机基础————存储单位and数制位

存储单位 最小存储单位:bit 存储0或者1的空间 基本存储单位:byte 1Byte=8bit 1KB=2^10Byte=1024Byte 1MB=210KB=1024KB GB=1024MB TB=1024GB 数制位 二进制:每一位由0-1组成,满2进1 权为2 101011110 十进制:每一位0-9组成,满10进1 权为10 95 八进制:每一位…
暂无图片
编程学习 ·

C语言指针笔记

C语言指针 一.地址与指针变量 程序在执行过程中需要有内存来存储需要用到的数据和程序代码,它们都占据一些内存单元,地址是这些内存单元的编号,同时包括它所指向的数据的类型信息。因此,可以把地址形象化地称为"指针"。 但不要把地址和指针混为一个概念,地址是数…
暂无图片
编程学习 ·

Java数据结构--循环队列

一、简介 1.1 概念队列简称队–他同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除; 在队列中把插入数据元素的一端称为队尾,删除数据元素的一端称为队头; 向队尾插入元素称为进队和入队,新元素入队后成为新的队尾元素;从…
暂无图片
编程学习 ·

GUI学生管理系统--创建项目

这里写自定义目录标题实现步骤步骤一:创建Java项目步骤二:在项目文件中创建文件夹步骤三: 在lib文件夹中加入数据库启动包步骤四:在images中添加图片步骤五:在help文件夹中添加所需使用到的帮助文件 实现步骤 在上次实训结束以后,我们完成了数据库表数据的插入,完成了建…
暂无图片
编程学习 ·

01初识HTML

网站建站的流程 整个网站的开发流程 1.访问网站,是通过域名去访问,也就是网址,需要注册域名 2.网址不好记忆,不会直接输入网址,通过网址去访问服务器,租用空间 3.网站建设(确定网站主题,搜集资料,规划网站,制作页面) 4.网站推广 5.网站维护web标准HTML是用于描述页面…
暂无图片
编程学习 ·

java如何遍历Map

1.利用map.keySet()普通遍历public static void main(String[] args) {Map<Integer,String> map=new HashMap<>();map.put(1,"努力");map.put(2,"勤奋");map.put(3,"懒惰");for(Integer key:map.keySet()){System.out.println("…
暂无图片
编程学习 ·

uni-app app平台微信支付

一、App平台支付流程 流程:支付平台功能申请 -> manifest.json 里配置支付参数 -> uni-app 里调用 API 进行支付 二、微信App支付功能申请到 微信开放平台 申请移动应用并开通支付功能,申请应用后可以获取 AppID 和 AppSecret 值 应用接入 微信商户平台,选择 App 支付…
暂无图片
编程学习 ·

微信小程序优化注意点(用户体验,数据逻辑优化)

1.对于列表请求数据,使用二维数组,以分页的页码做一维下标,以条数做二维下标,每次setData只setData当前页的数据,其他页的数据不用。因为每次setData的数据量大小有限制,官网也有说明;可以参考2.对于列表中删除某一项,会存在状态不对的情况。例如:左滑删除,一页数据有…
暂无图片
编程学习 ·

Flutter ubuntu 环境搭建

准备 首先下载 Android Studio、Android SDK、Flutter SDK我这里是下载到 ~/Document/android 即 /home/chen/Documents/android 目录下检查配置 到 Flutter 的 bin 目录,执行 ./flutter doctor 检查环境搭建是否正确 这里提示未配置 ANDROID_SDK_ROOTLinux 环境变量 /etc/pro…