一. 构造方法
构造器也称之为构造方法(constructor),用于对象的初始化。构造方法具有如下特性:
- 通过new关键字调用;
- 构造器的返回值为对象在堆中的地址,但是不能在构造器中使用return语句;
- 如果我们没有定义构造器,则编译器会自动添加一个无参构造器;如果已定义,则编译器不会自动添加;
- 构造器的方法名必须和类名一致。
注意:
对象的创建并不是完全由构造方法来完成的,构造方法是创建JAVA对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该对象,但这个对象并不是完全由构造器负责创建的。对象的创建过程如下:
- 在堆中分配对象空间,并将对象成员变量初始化为0或null;
- 执行属性值的显示初始化;
- 执行构造方法;
- 返回对象的地址给相关的变量。
public class User {
int id;
String name;
String pwd;
public User(){}
public User(int id, String name){
this.id = id;
this.name = name;
}
public User(int id, String name, String pwd){
this.id = id;
this.name = name;
this.pwd = pwd;
}
public User(User user){
this.id = user.id + 1;
this.name = user.name;
this.pwd = user.pwd;
}
public static void main(String[] args){
User user1 = new User();
User user2 = new User(1, "WuJi");
User user3 = new User(2, "SanFeng", "123456");
User user4 = new User(user3);
}
}
二. 内存管理和垃圾回收机制
Java引入了垃圾回收机制(Garbage Collection),Java程序员可以讲更多的精力放到业务逻辑,而不是像C++程序员的内存管理工作,大大提高了开发效率。JAVA的内存管理很大层度上指的就是对象管理,包括对象空间的分配和释放:
- 对象空间的分配:使用new关键字创建对象即可;
- 对象空间的释放:将对象赋值null即可;垃圾回收机制负责回收所有“不可达”对象的内存空间。
任何一种垃圾回收算法一般要做2件基本事情:
- 发现无用对象;
- 回收无用对象占用的内存空间;
垃圾回收机制保证可以将无用对象进行回收,无用对象指的是“没有任何变量引用该对象”。JAVA垃圾回收器将通过算法发现无用对象,进行清除和整理。关于垃圾回收的常见算法有如下2个:
-
引用计数法
堆中每个对象都有一个引用计数,被引用一次,计数+1,被引用变量计数变为null,则计数-1。直到计数为0,则表示变为无用对象。有点是算法简单,缺点是“被循环引用的无用对象无法被识别”。
2. 引用可达法(根搜索算法)
程序把所有的引用关系看做一张图,从一个节点开始,寻找对应的引用节点,找到此节点后,继续查找这个节点的引用节点,当所有的引用节点寻找完毕后,剩余的节点则被认为是没有被引用到的节点,即无用节点。
三. 容易造成内存泄漏的操作
在实际开发中,经常会造成内存的崩溃,以下是几个极易造成内存泄漏的场景:
- 创建大量无用对象:在字符串拼接时使用了String,而不是StringBuilder或StringBuffer
- 静态集合类的使用:静态变量的生命周期和应用程序一致,因此,容器中存储的所有的对象也不能被释放。
- 各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭:IO流对象、数据库连接对象、网络连接对象属于物理连接,和硬盘或者网络连接,不使用时一定要关闭。
- 监听器的使用:释放对象时,没有删除相应的监听器。
注意:
- 程序员无权调用垃圾回收器;
- 程序员可以调用System.gc(),该方法知识同志JVM,并非运行垃圾回收器。尽量少用,会申请启动Full GC,成本高,会影响系统性能。