创建对象方法调用顺序
- 1.静态代码块
- 2.构造代码块
- 3.构造器
- 4.先父类,再子类
对象创建
- new关键字
- 需要有相应构造器
- 根据class类在堆中为对象分配空间
- 调用相应的构造器来初始化对象
- 将在堆中分配的空间地址的传递给在栈中的引用
- 需要有相应构造器
- 反射
- 利用Class类的newInstance方法,创建对象。
- 底层调用无参构造器,所以需要确保有无参构造器
- 反序列化
- 将已经序列化的对象,反序列化到内存中创建对象
- 需要实现Serializable接口
- 克隆
- 克隆一个已存在的对象
- 原对象实现cloneable接口,并且重写clone方法
- 注意浅拷贝问题
构造器
概念
- 类中用来初始化对象的方法,构造器与类名相同,且没有返回值
特点:
- 名称与类名相同
- 方法没有返回值和返回值类型
- 只能和new一起使用
- 修饰符不能为abstract static final
- 可以存在return语句,但是后面不能跟返回值
- 调用其他构造器用this()关键字
- 构造器见不要互相调用
作用
- 初始化对象属性,不是创建对象
空构造器
- 没有参数的构造器
- 如果没有,编译时自动加入空构造
引用与内存分析
- 引用特点
- 引用存在栈中,对象存在堆中
- 同一时刻,一个引用只能指向一个对象
- 一个对象可以有多个引用,任意一个对其修改,其他引用也可见该变化
- java一切为值传递,不过引用传递拷贝的是地址值
this
- 作用
- 代表当前对象
- 注意点
- this(。。。)指代构造器,只能放构造器的第一行
- this。属性,调用成员属性
- this不能出现在被static修饰的内容中
单例模式
- 核心
- 对外只提供一个实例化对象
- 步骤
- 构造器私有
- 对象内部持有当前对象的引用
- 对外提供一个获取当前对象的方法
- 懒汉式单例
- 调用获取对象的方法时创建单例的实例化对象
public class Student {
private static Student student;
private Student () {
}
public static Student getInstance () {
if (student == null) {
student = new Student();
}
return student;
}
}
- 饿汉式单例
- 类加载时,就创建一个单例的实例化对象
public class Student {
private static Student student = new Student();
static {
student = new Student();
}
private Student () {
}
public Student getInstance () {
return student;
}
}
代码块
- 静态代码块
- 格式:static{}
- 位置:类内,方法外
- 执行时间:加载class文件时
- 其内不能使用成员变量
- 只在类加载时执行一次,其余不加载
- 构造代码块
- 格式{}
- 位置:类内,方法外
- 执行时间:构造器之前
- 可以使用成员变量,静态的和非静态的
- 在每次创建对象时加载
普通代码块
- 格式:{}
- 位置:方法内
- 每次方法被调用时加载
同步代码块
- synchronized(){}
垃圾回收
System.gc:通知jvm进行垃圾回收,但是jvm有自己内部的垃圾回收机制,所以何时回收不知道。
回收时,调用finalize方法