@TOC


注意:jdk8之前静态变量在方法区中的静态域中,jdk8之后在堆中







注意:String数组args中的参数是在执行这个程序的时候把后面的参数传进去的



程序运行
idea中传实参





注意:代码块的调用顺序优于构造器(即代码块 构造器1 代码块 构造器2…)
注意:





静态>普通>构造器,父>子




注意:构造器不能用static(如果我们将构造函数设置为静态,则无法初始化对象变量),

package com.bijing.static_.single_;
public class SingleTon {
public static void main(String[] args) {
GirlFriend girlFriend = GirlFriend.gf();
GirlFriend girlFriend2 = GirlFriend.gf();
System.out.println(girlFriend);
System.out.println(girlFriend2);//和上面同一个对象
}
}
class GirlFriend {
private String name;
private static GirlFriend girlFriend = new GirlFriend("aa");
private GirlFriend(String name) {
this.name = name;
}
public static GirlFriend gf() {
return girlFriend;
}
@Override
public String toString() {
return "GirlFriend{" +
"name='" + name + '\'' +
'}';
}
}
可能我只想使用一个静态的属性,但是饿汉模式会加载的时候创建一个对象(一般是重量级的),如果对象又不使用会造成资源的浪费

对比:和饿汉模式相比,饱汉模式第二步是声明了一个静态的对象的引用,然后提供一个静态方法get**,如果引用指向null就创建一个对象并return,因为是静态的所以每次new一个对象=get**的时候都是同一个对象。
package com.bijing.static_.single_;
public class SingleTon02 {
public static void main(String[] args) {
Cat cat = Cat.getCat();
Cat cat1 = Cat.getCat();
System.out.println(cat);
System.out.println(cat == cat1);
}
}
class Cat {
private static Cat cat;
private String name;
private Cat(String name) {
this.name = name;
}
public static Cat getCat() {
if (cat == null) {
cat = new Cat("喵喵");
}
return cat;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
'}';
}
}
下面的这段代码可以有多个线程同时调用,从而破坏了单例模式,所以饱汉模式是线程不安全的
public static Cat getCat() {
if (cat == null) {
cat = new Cat("喵喵");
}
return cat;
}


final修饰

