静态static关键字理解

静态是指使用static关键字修饰的成员,其中包括静态变量,静态方法,静态代码块、内部类(普通类不允许被声明成静态的)且在类加载时就在JVM开辟的五大内存之一的方法区中被初始化。
静态变量与非静态变量:
static 修饰的变量、在类加载的时候,就已经开辟了一块内存空间来存它了,而且它是唯一的,在内存里也是只有一个,且静态变量数据是共享给该类的所有对象使用,既可以通过对象来访问,也可以通过类名来访问
非静态变量是对象所拥有的,在创建对象的时候被初始化,每次new就开辟一块内存空间,通过类的对象(实例)去访问。
创建一个静态变量:private static int DEFAULT_INITIAL_CAPACITY = 1 << 4;
创建一个普通变量:private int capacity=16;

静态方法与非静态方法:
static方法一般称作静态方法。静态方法不依赖于任何对象就可以进行访问(通过类名直接访问),因此对于静态方法来说,是没有this属性的,因为它不依附于任何对象,因此在静态方法中不能访问类的非静态成员变量和非静态成员方法,而非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
HashMap中的静态方法:

点击查看代码
//Returns k.compareTo(x) if x matches kc (k's screened comparable class), else 0.
static int compareComparables(Class<?> kc, Object k, Object x) {
        return (x == null || x.getClass() != kc ? 0 :
                ((Comparable)k).compareTo(x));
    }

静态代码块:
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

点击查看代码
public class Outer {
  static {
        System.out.println("静态代码块1 count=" + count);
    }
}

静态内部类:被static修饰的内部类可以直接作为一个普通类来用,访问方式为(new 外部类名.内部类的方法() ),不需要创建一个外部类的实例,而普通内部类的引用需要创建一个外部类的实例。

点击查看代码
public class Outer {
    static class Inner {
        // 静态内部类
    }
}

P.S. static不能直接修饰类,普通类不允许被声明成静态的,只能修饰 属性、方法、代码块、内部类!!!
错误用法:

点击查看代码
//错误用法,直接修饰了类;
public static class Outer{
xxx
}
posted @ 2023-03-07 15:52  destiny-2015  阅读(19)  评论(0编辑  收藏  举报