递归调用内存图
方法参数的值传递
//在运行的时候自动执行
public class Main {
public static void main(String[] args) {
{
System.out.println(5);
}
}
}
public class Person {
int no;
String name;
public Person() {
System.out.println("无参构造方法执行了...");
}
public Person(int no, String name) {
this();
this.no = no;
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person(2017, "张三");
System.out.println(person);
}
}
static在属性上:类属性,静态属性
static在方法上:类方法(作为工具类使用)
静态代码块
类加载机制、字节码知识、JVM 指令重排、Java 序列化机制
一个类只能创建一个实例,设计一个类只能有一个对象,不能创建第二个对象。(线程池,数据库连接池)
实现步骤
实现方式
public class Main {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
Singleton singleton1 = Singleton.getInstance();
System.out.println(singleton);//cn.edu.zut.Singleton@1b6d3586
System.out.println(singleton1);//cn.edu.zut.Singleton@1b6d3586
}
}
//懒汉模式
class Singleton {
//只能有一个实例
private static Singleton singleton;
//私有化构造方法
private Singleton() {
}
public static Singleton getInstance() {
if (singleton == null) {
//收到编译器的影响,可能会先执行3,在执行2,指令集进行重新排序,加上volatile(多线程编程)
//首先在堆空间分配一个空间,然后在栈空间赋值一个引用,分配空间的时候会返回一个该空间的内存引用
//初始化空间
//把内存引用赋值给singleton
singleton = new Singleton();
}
return singleton;
}
}
public class Main {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
Singleton singleton1 = Singleton.getInstance();
System.out.println(singleton);//cn.edu.zut.Singleton@1b6d3586
System.out.println(singleton1);//cn.edu.zut.Singleton@1b6d3586
}
}
//饿汉模式
class Singleton {
//只能有一个实例
private static Singleton singleton = new Singleton();
//私有化构造方法
private Singleton() {
}
public static Singleton getInstance() {
return singleton;
}
}
public class Main {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
Singleton singleton1 = Singleton.getInstance();
System.out.println(singleton);//cn.edu.zut.Singleton@1b6d3586
System.out.println(singleton1);//cn.edu.zut.Singleton@1b6d3586
}
}
//静态内部类:延迟加载
class Singleton {
static class InnerClass {
private static Singleton singleton = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
//在调用这个的时候,InnerClass会进行加载
return InnerClass.singleton;
}
}
public class Main {
public static void main(String[] args) throws Exception {
Constructor
= Singleton.class.getDeclaredConstructor();
constructor.setAccessible(true);
Singleton singleton = constructor.newInstance();
Singleton singleton1 = Singleton.getInstance();
System.out.println(singleton);//cn.edu.zut.Singleton@1b6d3586
System.out.println(singleton1);//cn.edu.zut.Singleton@4554617c
}
}
class Singleton {
static class InnerClass {
private static Singleton singleton = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
//在调用这个的时候,InnerClass会进行加载
return InnerClass.singleton;
}
}
public class Main {
public static void main(String[] args) throws Exception {
Enum singleton = Enum.SINGLETON;
Enum singleton1 = Enum.SINGLETON;
System.out.println(singleton);//SINGLETON
System.out.println(singleton1);//SINGLETON
System.out.println(singleton.hashCode());//460141958
System.out.println(singleton1.hashCode());//460141958
Constructor
constructor.setAccessible(true);
Enum singleton2 = constructor.newInstance("SINGLETON", 0);
//java.lang.IllegalArgumentException: Cannot reflectively create enum objects
//不能对枚举类型进行实例化
System.out.println(singleton2);
}
}
enum Enum {
SINGLETON;
// 0: new #4 // class cn/edu/zut/Enum 分配空间
// 3: dup
// 4: ldc #7 // String SINGLETON 加载实例
// 6 : iconst_0
// 7: invokespecial #8 // Method "
// 10: putstatic #9 // Field SINGLETON:Lcn/edu/zut/Enum; 对静态属性进行赋值
// 13: iconst_1
// 14: anewarray #4 // class cn/edu/zut/Enum
// 17: dup
// 18: iconst_0
// 19: getstatic #9 // Field SINGLETON:Lcn/edu/zut/Enum;
// 22: aastore
// 23: putstatic #1 // Field $VALUES:[Lcn/edu/zut/Enum;
// 26: return
}
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Singleton singleton = Singleton.getInstance();
//序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("singleton"));
oos.writeObject(singleton);
oos.close();
//反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("singleton"));
Object obj = ois.readObject();
Singleton singleton1 = (Singleton) obj;
// System.out.println(singleton1);//cn.edu.zut.Singleton@378bf509
// System.out.println(singleton);//cn.edu.zut.Singleton@7f31245a
//添加Object readResolve() throws ObjectStreamException,接口中的替代方法,防止反序列化攻击
//枚举类型也可以防止反序列化攻击
System.out.println(singleton1);//cn.edu.zut.Singleton@7f31245a
System.out.println(singleton);//cn.edu.zut.Singleton@7f31245a
}
}
class Singleton implements Serializable {
private static final long serialVersiOnUID= -8122532461435652822L;
private static Singleton singleton = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return singleton;
}
Object readResolve() throws ObjectStreamException {
return singleton;
}
}