Java之static关键字详解

1、释义

static:表示”全局的””静态的”

修饰位置

  • 方法
  • 成员变量
  • 内部类

在内存中的存储位置

  • JDK7以下,存储在方法区(no-heap)中,方法区又称为永久代
  • JDK7开始,移除永久代,static成员存储在其对应的Class对象末尾(Java.lang.Class),Class对象存储在堆(heap)中,从而static存储在堆中

作用

  1. 在JVM加载类时,会直接加载static修饰的成员,存储到特定的空间(堆)

  2. static修饰的属性或方法,是该类所有实例共享的,不属于特定的对象,从而可以配置多个对象的公共属性

2、修饰变量

static修饰的变量称为”静态变量”,没有static修饰的称为”实例变量”

区别:

  1. 静态变量:在内存中只有一个内存地址,JVM在类加载时,为其分配内存,因此,静态变量是对象之间共享的;
  2. 实例变量:每创建(new)一个实例,就会为实例变量分配一次内存,因此,同一个实例变量,在不同对象之间是互不影响的。
  3. 静态变量可以直接通过”类名.变量名”访问,也可以通过”对象.变量名”访问(这种不推荐使用,在IDEA中也会提示红色下划线)。而实例变量只能通过”对象.变量名”访问

如:

public class StudyStatic {

    /** 静态变量 */
    public static int age;

    public static void main(String[] args) {
        //创建对象a
        StudyStatic a = new StudyStatic();
        //创建对象b
        StudyStatic b = new StudyStatic();
        System.out.println("StudyStatic类中,age的初始值为" + StudyStatic.age);
        a.age = 1;
        System.out.println("b.age赋值前,a.age的值为:" + a.age);    //a.age结果为1
        b.age = 2;
        System.out.println("b.age赋值后,a.age的值为:" + a.age);    //a.age结果为2
    }
}

结果:静态变量age的值是a、b对象之间共享的

Java之static关键字详解_第1张图片

 注意:在IDEA,类名.静态变量会出现红色下划线,提示”不应该通过类实例访问静态成员”

Java之static关键字详解_第2张图片

一般在下面3种情况下,会使用static变量:

  1. 需要对象之间共享的值
  2. 便于访问变量,如常量需要添加static修饰
  3. 配合static修饰的方法使用

3、修饰方法

        与变量类似,static修饰的方法称为静态方法,可以通过”类名.方法名”调用,也可以通过”对象.方法名”调用(IDEA会提示不应该这样使用)。

特点:

  1. static方法不需要创建对象,直接通过类名就可以使用
  2. 方法体中不能出现this和super关键字(this代表的是当前对象,只能出现在实例方法中,哪个对象调用实例方法,那么this代表的就是该对象,而static方法在类加载初始化时,就已经在内存中存在了,static方法不属于任何对象,所有this为null,故不能使用)
  3. 在同一个类中,static方法只能直接访问static变量,不能直接访问实例变量

4、修饰代码块

      在Java中,块代表的就是花括号”{}”,由static修饰的块称为静态代码块

所处位置

  •       静态代码块直接声明在类中

作用

      用来初始化静态成员变量,配置对象的公共属性

特点

  1. 静态代码块在类初始化时,就由JVM加载到内存中,因此静态代码块只会执行一次
  2. 静态代码块加载的优先级与静态变量、静态方法是同一级别的,根据代码书写的顺序,决定谁先加载

如:

public class RunTest {
    
    {
        System.out.println("我是静态代码块");
    }
    
}

5、修饰内部类

内部类推荐这篇文章,特别详细:Java中静态内部类和非静态内部类有什么区别?

特点

  1. 当内部类被static修饰,该类可以看成一个外部类,具有外部类所有的特征
  2. 静态内部类可以直接使用外部类的静态属性和方法

如: 

Java之static关键字详解_第3张图片

你可能感兴趣的:(Java基础,java)