static变量和static代码块_static变量的作用

static变量和static代码块_static变量的作用

1. 概述

  • static 是一种修饰符
  • static 是Java中表静态的关键字
  • 它可以修饰成员变量、成员方法、代码块
  • 被static修饰的成员变量或成员方法,将不再依赖于对象的创建而去使用,而是依赖类的存在,成为类成员或类方法,是共享的(下面将会详细的解释)。

2. static修饰成员变量

2.1 常见的修饰符

  • public 修饰符
  • private 修饰符
  • 没有修饰符
  • static 修饰符(静态修饰符)

class Test { // public 修饰符 public int a; // private 修饰符 private int b; // 没有修饰符 int c; // static 修饰符 public static int d; } 12345678910

2.2 内存图分析讲解static修饰成员变量

class Test { public int a; public String b; public double c; public static int d; } Test t = new Test(); 1234567

以上述简单的测试类为例,画其底层的内存图(下图是我自己手画的图,天生手残,请大家多担待):

static变量和static代码块_static变量的作用

以上就是很简单的Java实例化对象从创建内存到给成员变量开辟内存空间,并默认初始化的底层内存图,我来解释以下上面的图:

  1. 在栈中开辟一块内存,以main标识的内存空间,为main方法的函数帧。
  2. 在main函数帧标识的内存中,开辟一块以t标识(实例化对象的名字)的局部变量内存,其中存放的是地址值(或称引用值),指向堆空间中保存成员变量内存的首地址。
  3. 堆空间开辟一块内存,用来存放成员变量,其开辟内存的个数于其成员变量的个数有关,以次Test为例,非static修饰的变量有3个,变在其中开辟三块内存空间,用来存放着三个变量,顺序为类中定义变量的顺序。将该内存地址的首地址赋给栈中t标识的那块内存。
  4. 因为成员变量在堆中开辟的内存,堆的机制,存在默认初始化,所以对成员变量赋予默认初始化的值,int,double,属于基本数据类型,所以直接将其默认值0,0.0写入对应的内存当中;成员变量c为字符型,为引用数据类型,所以其内存中存放的是地址值,指向堆中的另一块空间,并赋予默认值null,完成成员变量的初始化。
  5. 从图中可以很明显的看出,存放d,用static修饰的成员变量,其内存的开辟不在堆内存中开辟,而是在方法区中的静态区开辟(可以理解静态区就在方法区当中)。
  6. 静态区随类的加载而开辟,且其中的存放的静态成员变量是共享的,且仅有次一块内存。

2.3 static修饰的成员变量的特点

  • static修饰的成员变量不再是普通的成员变量,而是类成员变量
  • 其随着类的加载而加载,随着类的加载而开辟内存,不依赖于对象的存在
  • 其内存在静态区存放
  • 被类的所有对象所共享

2.4 简单的代码解释并说明如何使用

class Test { public int a = 10; public static int b = 20; } // 类已经加载,并没有实例化,此时静态区已经开辟,可以调用使用静态变量,并不依赖于对象存在,而是依赖于类的存在,使用时,直接类名.变量名,即可。 syso(Test.b); // 输出 20 // 实例化对象,此时才在堆空间中开辟一系列的内存,上述原理中已经阐述,此时才可以调用a的值。 Test t = new Test(); syso(t.a); // 输出 10 // 当然也可调用 b 的值 syso(t.b); // 输出 20 12345678910111213

3. static修饰成员方法

3.1 为什么使用static去修饰成员方法

用static修饰的成员变量是静态变量,也称类变量,它是随着类的加载而加载的,地址内存在静态区,不再依赖对象而存在。但是如何手动改变或设置或调用它的值呢,即操作static数据成员?

  1. 可以默认初始化,即开辟内存空间的时候,底层自动赋予它类型默认的初始值。
  2. 显示初始化。即在定义其的时候,给它一个值。

public static int a = 10; 1

但是如何手动的给它赋予值并且调用呢,这就引入了用static修饰的成员方法,类方法。

2.2 static修饰的成员方法的特点

  • 不再是普通的成员方法,而是类方法,随着类的加载而加载,不再依赖于对象,而是依赖于类。
  • 因为不再依赖于对象的存在,所以就和对象毫无关系,所以在类方法中不存在 this 引用(this表当前对象,随着对象的创建而加载),所以就不能调用非静态的成员变量和函数。
  • 只能访问静态成员和静态的成员方法
  • 类比对象优先
  • 静态只能访问静态

2.3 简单的代码解释并说明如何使用

class Test { // 一般的类中的成员变量都是私有的 private static String lib; // static 只能访问静态成员 和 静态方法 public static String getLib() { // 普通数据成员,依赖对象 // 不依赖对象 // 不存在 this.lib; 不存在 this 引用 return lib; } // 局部变量 public static void setLib(String lib) { // 通过类名.static成员 解决同名的问题 School.lib = lib; //static 不可以调用其它 非 static 的成员方法 } } // 在使用的时候,直接 类名.方法名 即可 // 如果要使用类,必须先把 .class 文件装入内存 当装入内存后,类立马开辟内存在方法区,形成类的对象 // 类成员 调用方法 // 类名 .成员名 School.setLib("1"); System.out.println("lib: " + School.getLib()); 1234567891011121314151617181920212223242526

3. static修饰代码块

3.1 概述静态代码块

在Java中的代码块,有局部代码块,构造代码块,静态代码块,三者执行顺序,作用,会单独出一篇博文来简单说明。所谓静态代码块就是用static修饰的代码块。

class Test { // 静态代码块 static { syso(...); } } 123456

  1. 静态代码块,随着类的加载而加载,指执行一次,且优于主函数的执行,即在main函数入口之前就执行。
  2. 静态代码块是由类调用的,在主函数之前就执行。
  3. 作用:对类和静态变量进行一系列的初始化
  4. 静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
  5. 可以由多个静态代码块

3.2 代码解释

// 先加载类,加载的同时会附带 static 成员分配内存,初始化, // static 代码块执行 【进行成员的初始化】 public class Test_45_Static代码块 { static { System.out.println("我是Test_45_static代码块"); } // 为什么 main 方法 要使用 static 修饰 // 底层直接打点调用 main 方法 public static void main(String args) { System.out.println("before"); // 实例化对象,便会输出构造代码块,即构造器中的内容 Student2 s2 = new Student2(); System.out.println("after"); } } /* * 规范的写法 * 静态代码块中 做 static初始化 * 额外的初始化 例如:连接数据库的初始化 * private static int count; * * static { * * } */ class Student2 { private int id; static int count = -1; public Student2() { System.out.println("我是构造器"); } static { //count = 0; System.out.println("我是Student2的static代码块"); count = 0; } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849

输出:

static变量和static代码块_static变量的作用

可以明显的看出,当类加载还未执行main函数的时候,主类中的static已经执行,之后执行main函数,从上至下顺序执行,当类进行实例化的时候,同样也是现执行类中的static代码块,再执行构造器中的代码块

4. 总结static关键字

  1. static静态方法 | 静态成员变量:

    类中的方法 | 成员变量,加上static修饰,就成了静态成员方法(类方法) | 静态成员变量(类变量)

  2. static成员方法和普通成员方法的本质区别在于没有this指针

    static成员方法只能引用类中的静态成员(属性、方法)

    static成员方法不能引用类中的非静态成员

  3. 类变量和类方法,都是随着类的加载而加载的,依赖于类,优于对象的,使用的时候 类名.变量名(方法名),被类的所有对象而共享的
  4. 普通成员方法既可以引用static成员,也可以普通成员
  5. 可以通过类名调用static成员方法,也可以通过对象名调用
  6. static方法之所以存在,就是为了操作static数据成员

距上次发文有挺长一段时间了,还是老样子,有疑议或者有想要补充的小伙伴,可以评论也可以私信我聊聊哈!码字不易,希望能有大家关注支持一下。

本文【static变量和static代码块_static变量的作用】由作者: 悲观锁 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4088.html

(0)
上一篇 2023-03-09 07:05:02
下一篇 2023-03-09 07:09:16

相关推荐

  • 字符串数组长度怎么算_字符串长度怎样自己数

    依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 \u0000 (0),最大值是\uffff(65535), 也就是一个字符以2个字节来表示,难道Java最多只能表示 65535个字符? char: The char data type is a single 16-bit Unicode character. It has…

    2023-03-09
    800
  • 现在上位机软件比较好用的有几款_单片机上位机软件

    上位机是指可以直接发出操控命令的计算机,屏幕上可以显示各种信号变化。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。 早期开发上位机主要是在PC上用VB,VC,DELPHI,现在也有人开始用C#,PYTHON,各有优缺点。 近年来移动技术的高速发展以及移…

    2023-03-13
    300
  • javajdk环境变量配置不成功_java安装后环境变量配置

    JDK的安装与环境变量的配置 1.jdk的安装: jdk的安装,傻瓜式安装,一路下一步 jdk中的两个文件夹 lib bin lib:存放的打包好的jar包 bin:所有可执行的文件 2.环境变量的配置 : 右键单击此电脑—属性—高级系统设置—高级—环境变量 在下方系统变量中–新建 新建后输入变量名称:JAVA_HOME 之后,找到java中jdk所在的文件…

    2023-03-09
    500
  • vc60安装程序正在更新您的系统(重装系统哪个软件好用)

    现在不管我们在那个行业,工作中都会使用到电脑,但是一般电脑使用久了就会出现一些小毛病,不是电脑太卡,就是反应超级慢,那这个时候要怎么办了?可以重装一下系统,但是问题又来了,现在网上一搜就会有很多从装系统的软件,但是到底哪个重装系统的软件比较好了,下面小编就给大家分享四个比较好用的电脑重装系统软件,有兴趣的朋友一起来看看吧! 一、老友装机大师 操作简单,无需任…

    2023-03-16
    200
  • web推送服务,微信服务号推送次数

    被折叠的订阅号图文打开率已经锐减至5%上下,服务号和订阅号合并的消息也在坊间流传,有一部分人为了提高图文打开率并获得更多更高的接口与权限,悄悄地把自己的订阅号升级为服务号,可服务号一个自然月只能推四次消息难免成为某些人心中的痛。今天遥望燕园要放个大招,教你突破服务号一个自然月仅能推送四次消息的限制。当然了,所谓的突破不是真正意义上的突破,但这个突破的意义还是…

    2023-03-20
    000
  • administrator账户默认密码(怎样取消administrator账户)

    很多用户想要关闭Windows 10 的开机密码,但不知道如何操作,本篇文章教大家如何操作。 方法一:设置 打开电脑左下角的开始菜单,找到齿轮图标,点击进入设置。如下图: 进入设置以后,在弹出的界面里找到帐户。如下图: 点击进入帐户,在弹出的界面左侧找到并点击登录选项,右侧界面会自动切换,在切换的界面里找到密码,点击密码会看到更改。如下图: 点击更改以后,会…

    2023-03-18
    100
  • 集合java一个集合包含另两个集合_java集合的方法有哪些

    今天我们就来简单的了解下java中的集合,有了解过得朋友都知道,也都用过,比如说做常用的List,还有Set、Map,而且像List和Set都是用于存储单列数据的集合,他们的父接口都是Conllection,List的特点是存储的值是有序且允许重复的,Set的特点是存储的元素是唯一、不可重复且无序的,而Map的特点则是用于存储双列数据的集合,存储的数据时无序…

    2023-03-09
    1100
  • matlab函数文件怎么写_matlab函数定义和调用

    众所周知,MATLAB分为脚本文件和函数文件。 它俩的区别是:脚本文件可以直接执行,而函数文件不能直接执行。 由此,有两种方法创建函数: 在单独的函数文件中创建函数 注意文件名称和函数名字要相同(例如:都为ffff) 创建名为ffff.m的函数文件: function y=ffff(x) y=x+1在脚本文件usefunc.m中使用函数ffff(x):y=f…

    2023-03-21
    100
  • 全栈工程师需要掌握哪些知识_全栈工程师需要学多久

    Web前端工程师可能大家知道是干嘛的,你知道Web全栈工程师是什么吗?Web全栈工程师也是前端开发工程师的一种,而且通过前端培训也是能成为Web全栈工程师的。那么,学web前端开发需要多久?Web全栈工程师需要掌握哪些技术呢? Web全栈工程师是什么? Web全栈开发工程师,主要职责是利用 HTML/CSS/Java/DOM/Flash等各种Web技术进行产…

    2023-03-18
    200
  • 操作系统的作用和地位,计算机系统的概念

    说到操作系统,它是一个与计算机科学相关的专业名词。详细的解释,我们一般人或许无法说出,但大家都熟知windows系统它就是操作系统的其中一个下属分支,说起操作系统,它的历史也是由来已久,自从1946年,我们人类历史上第一台电子计算机问世以来,就在促使操作系统的出现,虽然刚开始还没有操作系统这一说,但计算机的发展不得不催生出操作系统,有了它计算机才能实现越来越…

    2023-03-21
    000

发表回复

登录后才能评论
返回顶部
错说博客上线啦!