static关键字详解

112 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

1、static的用法

static可以修饰类,那就是静态类,可以修饰方法,被修饰的方法就叫静态方法,也可以修饰变量,那就是静态变量

  • 静态类与普通类的区别
    • 1、静态类不需要依赖于外部对象,也就是我们要实例A对象不需要依赖于外部Main这个对象,可以直接new出来。但是实例非静态类B的话就需要先实例化Main这个外部对象,然后在new B对象
    • 2、静态内部类可以有静态变量和静态方法,但是普通内部类不能,本质上还是因为静态内部类不需要依赖于外部类,但是普通内部类存在的前提是外部类要存在
public class Main {


    public static void main(String[] args) {
   
        A a = new A();

        B b = new Main().new B();
    }


    // 静态内部类 A
    public static class A{
    }

    // 普通类 B
    public class B{}
}
  • 静态方法与普通方法的区别 普通方法可以直接调用普通方法或者静态方法,但是静态方法只能直接调用静态方法,不能直接调用普通方法

image.png

  • 静态变量与非静态变量的区别

    • 1、非静态方法可以直接访问静态变量和非静态变量,但是静态方法可以直接访问静态变量,无法直接访问非静态变量

    • 2、静态变量在类初次被加载的时候就会被初始化好,但是普通变量只有该对象被初始化的时候才会被加载

public static void c() {
    System.out.println(name);
    // 先初始化Main这个对象,然后再访问这个普通变量
    Main main = new Main();
    System.out.println(main.address);
}

image.png

2、static原理

image.png

java中的对象一般都是放在区的,对象中的属性是跟着对象走的,所以属性也会在堆中,但是静态变量不是,静态变量有一个专门的地方存放,那就是 方法区 ,静态变量的生命周期是随着类的加载一直到类被卸载。

静态变量是共享的,在内存中独一份。但是普通变量不是,这个对象有几个,那么这个属性就会有几个,多个属性之间不会影响,普通变量会随着这个对象被GC回收而一起回收掉,但是静态变量不会,除非你把这个类给回收了,记住这里是类不是对象

3、static的作用

  • 1、特定情况下初始化资源

比如在一个对象被初始化之后就需要初始化一些数据,这时候可以使用静态代码块来实现

public class Main {

    private static List<Integer> list = new ArrayList<Integer>();
    
    static {
        list.add(1);
        list.add(2);
    }
    
 }
  • 2、提升性能

比如有些只需要初始化一次的资源,比如要判断某个数字是否在1~9之间,这时候每次来判断都需要初始化 start end二个对象,使用之后还要回收这二个对象,但是我们发现吗,其实这二个对象只需要初始化一次就可以了,不需要每次来检验都初始化一遍

public static  boolean isBelong(Integer num) {
    Integer start = new Integer(1);
    Integer end = new Integer(9);
    return num >= start && num <= end;
}

修改后

public class MyUtil {

    private static Integer start,end;

    static {
        start = new Integer(1);
        end = new Integer(9);
    }


    public static boolean isBelong(Integer num) {
        return num >= start && num <= end;
    }
    
}