热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Java修饰符之三】Java中static关键字的五种使用方法

static关键字五种用法的总结平时我们都会很经常的去使用static关键字去修饰变量呀,方法呀,都大概的知道被static所修饰之后,有

static关键字五种用法的总结



平时我们都会很经常的去使用static关键字去修饰变量呀,方法呀,都大概的知道被static所修饰之后,有一种“全局”的味道,那么我就在这里详细的总结一下static关键字的四种用法。有问题欢迎留言

  • 修饰成员变量
  • 修饰成员方法
  • 修饰代码块
  • 修饰内部类
  • 静态导包


修饰成员变量



注意:
首先声明一下,这里所修饰的是成员变量,而不是局部变量,局部变量是不允许被static修饰的。(了解成员变量和局部变量的概念和区别)

通常我们在开发过程中,用static去修饰一个成员变量,是为了声明一个全局变量,让它对该类的所有对象共享。或者配合final关键字声明一个全局的常量。被static所修饰的成员变量称为静态变量(或类变量),是属于类的范畴。没有被static修饰的变量称为实例变量,属于对象的范畴。

静态变量特性:

  • 全局共享,该类的所有实例对象都可以引用到同一个静态变量。
  • 别的类可以通过类名.变量名去调用该静态变量
  • 静态变量不同于实例变量,静态变量存放在内存的方法区中,而实例变量存放在堆中
  • 静态变量在类加载的时候被加载,在程序运行期间有且仅加载一次

代码测试:
以下是测试代码,我们从JVM内存模型来分析一下,静态变量和实例变量在内存中区别

public class Student {//实例变量String name;int age;//成员方法public String toString() {return "Student [name=" + name + ", age=" + age + "]";}public static void main(String[] args) {//声明两个Student类型的变量s1,s2,分别为这两个变量赋于两个Student实例对象的地址Student s1 = new Student();s1.name = "Tom";s1.age = 22;Student s2 = new Student();s2.name = "Jerry";s2.age = 31;}
}

此刻的内存模型为:
这里写图片描述
从上图和测试代码结合来看,我们可以看出,s1s2两个实例变量所指向的实例对象都存储在堆中。实例变量nameage都属于对象的数据,对象的变量应该交给对象自己去管理,所以实例变量是存储在堆的对象当中。

接下来,我们在稍微修改一下代码,用static修饰age变量,使其成为静态变量(类变量)

public class Student {String name;static int age; //使用static修饰符修饰age变量public String toString() {return "Student [name=" + name + ", age=" + age + "]";}public static void main(String[] args) {Student s1 = new Student();s1.name = "Tom";s1.age = 22;Student s2 = new Student();s2.name = "Jerry";s2.age = 31;}
}

此刻的内存模型为:
这里写图片描述
从图中内存模型中,我们可以看出,静态变量age不再交给对象管理,堆中Student对象的数据也不再含有age这个变量。因为静态变量是属于类的一部分,与对象无关,所以age变量会统一交给Student类去管理,既存储在方法区(静态区)中。这也印证了静态变量是属于该类所有对象所共享的,静态变量被改变,是对该类所有对象可见的。

补充:

  • Student类型的局部变量s1和s2是存储在虚拟机栈中的,所储存的值是所指向对象的地址,该变量称为”引用”或”对象的引用”
  • 堆中对象的方法空间所存放的值是方法区类信息中具体方法的地址,所以同类的不同对象,同一个方法都是指向同一个地址的,既方法区具体方法的地址。如s1对象和s2对象存放toString方法的空间实际存放的是方法区中Student类的toString方法的地址,他们所引用的都是同一片地址。
  • 方法区所存放的类的信息可以说是类的定义,实例化的实际流程就是根据方法区中类的信息去实例化出具体的对象,然后将这个对象的存放在堆中。


修饰成员方法



使用static来修饰方法,相比于修饰成员变量,修饰方法对于数据的存储方面并没有多大的变化,因为方法本身就是存放在类的定义当中的,既方法区类的信息中。但是静态方法还是有作用的,比如可以使用类名.方法名的方式操作方法,避免了要new对象的资源消耗,静态方法的应用在工具类中经常被使用到,同时在JDK8新特性(接口的增强)中,可以在接口中使用static去修饰的具体方法,从而使得接口拥有具体的方法。

public class Demo {public static int add(int a ,int b){return a + b ; }
}class Test {public static void main(String[] args) {System.out.println(Demo.add(1, 2));}
}

特性:

  • 可以使用类名.方法名去调用方法
  • 静态方法不允许直接调用非静态成员,因为在类的加载中,静态成员在类加载时优先级高于非静态成员(实例变量,非静态方法等)。所以总不能在静态方法已经被JVM加载识别的时候,方法体内存在着一个未知的东西(因为还没有被JVM所加载识别)。
  • 静态方法体内不允许使用this,super关键字。因为静态方法属于类的范畴,是通过类名.方法名进行调用的,不需要实例化出对象来调用,所以不存在对象这个概念.但thissuper是属于对象的概念范畴,this代表着当前对象,super代表当前对象的父类对象。


修饰代码块



static只允许修饰构造代码块(在类中,方法体外的代码块),被static修饰的代码块称为静态代码块。静态代码块的一大作用是帮助类进行的静态变量的初始化。在类加载的优先级与静态变量相同,谁先加载,只看实际代码位置。

public class Demo{static a ;static { a = 1;System.out.println(a);}
}

补充:
【Java学习笔记系列】继承方式下静态成员变量、普通成员变量、静态代码块、构造代码块、构造函数在JVM的加载顺序


修饰内部类



我们知道内部类分为四种,有成员内部类,静态内部类,局部内部类和匿名内部类。而静态内部类就是被static所修饰的内部类。我们这里要声明一下,只允许能被static修饰的类只有两种:

  • 顶级类下的内部类
  • 静态内部类下的内部类


public class OuterClass {//顶级类(top-level class)下的内部类能被static修饰public static class InnerClass {//静态内部类下的内部类能被static修饰publis static class InnerClassB{}}
}

特性:

  • 被static所修饰的内部类称为静态内部类
  • 静态内部类切断了与其外部类对象之间的联系。

如果对内部类不够了解并想了解静态内部类的详细特性,可以看我这篇博文:
【Java学习笔记系列】深入学习Java的内部类以及内部类相关知识点总结

静态导包



静态导包的方式使用的比较少,博主我也是在查看static的资料的情况下,才发现这种用法的,这里就不进行啰嗦了,大家可以到我下面列的参考网站查看静态导包的讲解。
[java]static关键字的四种用法


我的其他修饰符总结直链:
【Java修饰符之一】Java中Default关键字的两种使用方法
【Java修饰符之二】探讨Java中final的三种使用场景和总结
【Java修饰符之三】Java中static关键字的五种使用方法


参考资料:
[java]static关键字的四种用法
Java中的static关键字解析

在此谢谢查询和参考过的网站和博客的作者,感谢你们的知识!


以下是之前总结的两编关于修饰符的总结:
【Java修饰符笔记之一】Java中Default关键字的两种使用方法
【Java修饰符笔记之二】探讨Java中final的使用场景和总结


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java值传递机制的说明及示例代码
    本文对Java值传递机制进行了详细说明,包括形参和实参的定义和传递方式,以及通过示例代码展示了交换值的方法。 ... [详细]
author-avatar
性感让晚安回忆流淌_507
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有