static关键字及单例模式

用static修饰的属性、方法是属于类本身的,可以直接通过类名.属性``类名.方法调用。

类属性作为该类各个对象之间共享的变量。 在设计类时, 分析哪些属性不因对象的不同而改变 ,将这些属性设置为类属性。相应的方法设置为类方法。

如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可以调用类方法 ,从而简化了方法的调用。

关于静态方法,有几个注意点:

  • 静态方法体中,不可以使用this、super
  • 静态方法不能被重写
  • 在静态方法中,只能访问静态属性和静态方法,不能够访问非静态方法和非静态属性

static的应用——单例模式

在java中,因为可以直接new一个对象赋值给属性,所以和php相比,java的单例模式分为了两种:饿汉式(PHP没有)、懒汉式

// 饿汉式
class Db
{
    static Db instance = new Db();

    private Db () {}

    static Db getInstance ()
    {
        return instance;
    }
}

为什么称为饿汉式,因为它太饿了,上来就new。

// 懒汉式
class Db
{
    static Db instance = null;

    private Db () {
        // ...
    }

    static Db getInstance ()
    {
        if (instance == null) {
            instance = new Db();
        }

        return instance;
    }
}