Java static关键字详细解析

 更新时间:2022年08月25日 10:35:33   作者:haoyuhua​​​​​​​  
这篇文章主要介绍了Java static关键字详细解析,java中的static关键字主要用于内存管理,可以用在变量、方法、代码块和嵌套类中。更多相关介绍,需要的小伙伴可以参考一下

static目的

java中的static关键字主要用于内存管理。

static范围

使用范围:java static关键字可以用在变量、方法、代码块和嵌套类中。

作用范围:static关键字属于类,而不是类的实例。

静态(static)修饰

  • 变量、方法:称为类变量/方法、静态变量/方法;修饰变量或方法,表示这个变量/方法属于这个类,而不属于单个对象
  • 代码块:称为静态代码块;修饰代码块,表示该代码块为静态代码块
  • 嵌套类:称为静态内部类;修饰内部类,表示该类为静态内部类。可用于实现单例模式。
  • 可用于修饰import,进行静态导包,导入类中所有静态方法。最常见的使用场景是在JUnit进行单元测试时。

静态变量

类的成员变量可以分为以下两种:

  • 静态变量(或称为类变量),指被 static 修饰的成员变量。
  • 实例变量,指没有被 static 修饰的成员变量。

静态变量与实例变量的区别如下:

1)静态变量

  • 运行时,Java 虚拟机只为静态变量分配一次内存,加载类过程中完成静态变量的内存分配。
  • 在类的内部,可以在任何方法内直接访问静态变量。
  • 在其他类中,可以通过类名访问该类中的静态变量。

2)实例变量

  • 每创建一个实例,Java 虚拟机就会为实例变量分配一次内存。
  • 在类的内部,可以在非静态方法中直接访问实例变量。
  • 在本类的静态方法或其他类中则需要通过类的实例对象进行访问。

静态变量在类中的作用如下:

  • 静态变量可以被类的所有实例共享,因此静态变量可以作为实例之间的共享数据,增加实例之间的交互性。
  • 如果类的所有实例都包含一个相同的常量属性,则可以把这个属性定义为静态常量类型,从而节省内存空间。例如,在类中定义一个静态常量 PI。
  • 静态变量的好处:它能使程序存储器高效(即它节省内存)。

静态方法

同成员变量,成员方法也可以分为以下两种:

  • 静态方法(或称为类方法),指被 static 修饰的成员方法。
  • 实例方法,指没有被 static 修饰的成员方法。

静态方法与实例方法的区别:

静态方法,属于类,而不属于类的对象。

  • 它通过类直接被调用,无需创建类的对象。
  • 静态方法中,不能使用 this 关键字,也不能直接访问所属类的实例变量和实例方法;
  • 静态方法中,可以直接访问所属类的静态变量和静态方法。
  • 同this 关键字,super 关键字也与类的实例相关,静态方法中不能使用 super 关键字。

实例方法,可直接访问所属类的静态变量、静态方法、实例变量和实例方法。

静态方法与静态变量好处:

  • 属于类级别,无需创建对象就即可直接使用,使用方便。
  • 全局唯一,内存中唯一,静态变量可以唯一标识某些状态。
  • 类加载时候初始化,常驻在内存,调用快捷方便。

静态方法与静态变量缺点:

  • 静态方法不能调用非静态的方法和变量。 
  • 不能使用this和super关键字。

静态方法与静态变量适用场景:

  • 静态方法,最适合工具类中方法的定义;比如文件操作,日期处理方法等。
  • 静态方法,适合入口方法定义;比如单例模式,因从外部拿不到构造函数,所以定义一个静态的方法获取对象非常有必要。
  • 静态变量适合全局变量的定义;举例:用一个布尔型静态成员变量做控制标志。

静态代码块

定义:静态代码块,是 Java 类中的 static{ } 修饰的代码。

作用:用于类初始化时,为类的静态变量赋初始值,提升程序性能。

静态代码块的特点如下:

静态代码块,有点类似于一个方法,但不可以存在于任何方法体内。

静态代码块,可以置于类中的任何地方,类中可以有多个静态初始化块。

Java 虚拟机在加载类时执行,将只需要进行一次初始化的操作放在 static 代码块。

类中含多个静态代码块,Java虚拟机将按它们在类中出现的顺序依次执行,且都执行一次。

同静态代码块与静态,不能直接访问类的实例变量和实例方法,需通过类的对象访问。

静态类

java中一个类要被声明为static的,只有一种情况,就是静态内部类(内嵌类)。如在外部类声明为static的,程序会编译都不会通过。

  • 1、静态内部类,跟静态方法一样,只能访问静态成员变量和方法,不能访问非静态方法和属性。
  • 2、普通内部类,可以访问任意外部类的成员变量和方法。
  • 3、静态内部类,可以声明普通成员变量和方法,而普通内部类不能声明static成员变量和方法。 
  • 4、静态内部类,可以单独初始化。

可用于实现单例模式。

public class StaticSingleton {
    /**
     * 只有当显式调用getInstance()方法之后,这里的静态内部类SingletonHolder才会被加载
     * 从而将INSTANCE初始化
     * 因此,通过静态内部类实现的单例模式是懒汉式的
     */
    private static class SingletonHolder {  // 通过静态内部类持有实例
        private static final StaticSingleton INSTANCE = new StaticSingleton();
    }

    private StaticSingleton() { }   // 用private隐藏构造方法

    public static StaticSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

static变量存储在方法区(Method Area)

方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间。

静态变量(static)、常量(final)、类信息(构造方法、接口定义)(Class)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关。

到此这篇关于Java static关键字详细解析的文章就介绍到这了,更多相关Java static关键 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中List集合对象去重及按属性去重的8种方法

    Java中List集合对象去重及按属性去重的8种方法

    这篇文章主要介绍了Java中List集合对象去重及按属性去重的8种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一地的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • springBoot启动时让方法自动执行的几种实现方式

    springBoot启动时让方法自动执行的几种实现方式

    这篇文章主要介绍了springBoot启动时让方法自动执行的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • RocketMQ NameServer保障数据一致性实现方法讲解

    RocketMQ NameServer保障数据一致性实现方法讲解

    这篇文章主要介绍了RocketMQ NameServer保障数据一致性实现方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java创建数组的3种方式代码举例

    Java创建数组的3种方式代码举例

    数组是相同类型数据的有序集合,数组描述的是若干个相同类型的数据按照一定的先后次序排列组合而成,其中每一个数据称为数组的元素,可以通过下标进行访问,这篇文章主要给大家介绍了关于Java创建数组的3种方式,需要的朋友可以参考下
    2024-01-01
  • 浅谈Java中ArrayList线程不安全怎么办

    浅谈Java中ArrayList线程不安全怎么办

    本文主要介绍了Java中ArrayList线程不安全怎么办,主要有三种解决的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • resty的缓存技术设计及使用

    resty的缓存技术设计及使用

    这篇文章主要为大家介绍了resty缓存技术的设计及使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Java实现蓝桥杯G将军的示例代码

    Java实现蓝桥杯G将军的示例代码

    这篇文章主要介绍了Java实现蓝桥杯G将军的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 【面试】Spring事务面试考点吐血整理(建议珍藏)

    【面试】Spring事务面试考点吐血整理(建议珍藏)

    本文是小编给大家收藏整理的Spring事务面试考点,非常不错,值得收藏,感兴趣的朋友参考下吧
    2019-04-04
  • SpringBoot异步与事务一起使用的问题解决

    SpringBoot异步与事务一起使用的问题解决

    本文主要介绍了SpringBoot异步与事务一起使用的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java编程Iterator迭代器设计原理及实现代码示例

    Java编程Iterator迭代器设计原理及实现代码示例

    这篇文章主要介绍了Java编程Iterator迭代器设计原理及实现代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10

最新评论