Java static 关键字详解

引言

在《Java编程思想》中有这样一段话:static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。

这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:方便在没有创建对象的情况下来进行调用(方法/变量)。

static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。

使用情况

1、static成员变量

静态变量属于类,在内存中只有一个复制,只要静态变量所在的类被加载,这个静态变量就会被分配空间。

2、static成员方法

静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法 (就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。

3、static代码块

static代码块在类中是独立于成员变量和成员函数的代码块的。注意:这些static代码块只会被执行一次。

4、静态类

通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。

单例模式的实现

比较常见的方式,双重检测

public class Singleton {
    private volatile static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

还有其他多种方式也可以实现单例模式,这里重点介绍一种,利用静态内部类进行实现,由于内部静态类只会被加载一次,故该实现方式时线程安全的。

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton() {
    }

    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}
原文地址:https://www.cnblogs.com/powercto/p/6717872.html