怕什么真理无穷

导航

关于static之静态代码块和单例模式的简单理解

//3.静态代码块
class Example8{
    static{
        System.out.println("静态代码块执行了"); //静态代码块,在虚拟机加载(有且只加载一次)时便会执行,然后才去调用后面的main方法
    }
    public static void main(String[] args){ //
        Person p1=new Person();
        Person p2=new Person();//这里创建了两个对象,如果是非静态代码块,会分别执行一次,一共2次,但静态的代码块的类加且只加载一次,执行一次,所以只打印一次
    }
}
class Person{
    static String country;
    static{
        country="china";
        System.out.println("Person 类中的静态代码块也执行了,创建了两个对象,但类只会被加载一次,因此只打印一次!");
    }
}
/**静态代码块通常用于对类的成员变量进行初始化,只加载一次,因此静态代码块只执行一次*/
//4.单例模式
class Single{
    private static Single INSTANCE=new Single();//单例特性1:构造方法类用private修饰,外部就不能用new创建对象了 特性2:使用静态变量INSTANCE引用对象
    private Single(){}//私有化构造方法
    public static Single getInstance(){//提供一个方法供外部调用
        return INSTANCE;
    }
}

//以上也可以写为如下形式,多了个final,个人不知有何妙处
/*
class Single{
    public static final Single INSTANCE=new Single();//public允许外部调用,static让外部可以用类名.变量名调用,final禁止外部修改,INSTANCE唯一途径
    private Single(){}
        public static Single getInstance(){//提供一个方法供外部调用
        return INSTANCE;
    }
}
*/

class Example9{
    public static void main(String[] args){
        Single s1=Single.getInstance();
        Single s2=Single.getInstance();
        System.out.println(s1==s2);//正常情况,s1和s2是不可能相等的(至少对象名称不同),但单例模式则会相等,不论调用多少次,都是同一个对象
    }
}
/**
单例模式主要保证在整个程序运行期间类,只存在一个实例对象。比如世间只有一个月亮,就只能说是一个,说有两个就违背了事实
*/

 

posted on 2021-01-26 00:20  惭愧书生  阅读(377)  评论(0)    收藏  举报