1、构造方法定义
快捷键 :Alt+insert
一个类中定义的方法如果同时满足以下三个条件,该方法称为构造方法
(1)方法名与类名相同
(2)在方法名的前面没有返回值类型的声明
(3)在方法中不能使用return语句返回一个值,但是可以单独写return语句来作为方法的结束
package test;
public class test1 {
public test1() {
System.out.println("无参数构造方法被调用");
}
}
package test;
public class test2 {
public static void main(String[] args) {
test1 t1=new test1();
}
}
有参的构造方法实现对属性的赋值
package test;
public class test1 {
String breakfast;
public test1(String a) {
breakfast = a;
}
public void eat() {
System.out.println("今天早上吃" + breakfast);
}
}
package test;
public class test2 {
public static void main(String[] args) {
test1 t1 = new test1("面包和牛奶");
t1.eat();
}
}
2、构造方法重载
构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,可以通过调用不同的构造方法来为不同的属性进行赋值
package test;
public class test1 {
String breakfast;
int milk;
public test1(String a, int b) {
breakfast = a;
milk = b;
}
public test1(String a) {
breakfast = a;
}
public void eat() {
System.out.println("今天早上吃" + breakfast + ",牛奶喝了" + milk + "ml");
}
}
package test;
public class test2 {
public static void main(String[] args) {
test1 t1 = new test1("面包和牛奶");
test1 t2 = new test1("面包和牛奶", 200);
t1.eat();
t2.eat();
}
}
在Java中的每个类都至少有一个构造方法,如果在一个类中没有 定义构造方法,系统会自动为这个类创建一个默认的构造方法,这个默认 的构造方法没有参数,在其方法体中没有任何代码,即什么也不做
package test;
public class test {
public static void main(String[] args) {
test1 person = new test1();
}
}
package test;
public class test1 {
public test1() {
}
}
成员变量和局部变量的名称冲突,在方法中将无法访问成员变量
为了解决这个问题,Java中提供了一个关键字this来指代当前对象,用于在方法中访问对象的其它成员
package test;
public class test1 {
String breakfast;
int milk;
//测试用例test1_1
public test1(int milk) {//访问类的成员变量
this.milk = milk;
}
public test1() {
System.out.println("eat");
}
//测试用例test1_2
public test1(String breakfast) { //构造方法(注意 不能在普通成员方法使用 必须在第一行 不能相互调用)
this();
this.breakfast = breakfast;
}
public void eating() {
System.out.println("Have breakfast every day");
}
//测试用例test1_3
public void eat() { //访问类的成员方法
this.eating();
int milk=200;
System.out.println("今天早上吃" + breakfast + ",牛奶喝了" + this.milk + "ml");
System.out.println("今天早上吃" + breakfast + ",牛奶喝了" + milk + "ml");
}
}
package test;
public class test1_1 {
public static void main(String[] args) {
test1 t1 = new test1();
}
}
package test;
public class test1_2 {
public static void main(String[] args) {
test1 t1=new test1("牛奶面包");
test1 t2=new test1();
t1.eating();
t2.eating();
}
}
package test;
public class test1_3 {
public static void main(String[] args) {
test1 t1=new test1("面包牛奶");
t1.eat();
}
}
垃圾回收
1、一个对象在成为垃圾后会暂时地保留在内存中,当这样的垃圾堆积到一定程度时, Java虚拟机就会启动垃圾回收器将这些垃圾对象从内存中释放,从而使程序获得更 多可用的内存空间。
2、除了等待Java虚拟机进行自动垃圾回收外,还可以通过调用System.gc()方法来通知 Java虚拟机立即进行垃圾回收。
3、当一个对象在内存中被释放时,它的finalize()方法会被自动调用,因此可以在类中通 过定义finalize()方法来观察对象何时被释放。
4、一个对象在成为垃圾后会暂时地保留在内存中,当这样的垃圾堆积到一定程度时,Java虚拟机就会启动垃圾回收器将这些垃圾对象从内存中释放,从而使程序获得更多可用的内存空间。
package test;
public class test1 {
@Override
protected void finalize() throws Throwable{
System.out.println("垃圾回收");
}
public static void main(String[] args) {
test1 t1 = new test1();
test1 t2 = new test1();
t1=null;
t2=null;
System.gc();
int i;
for (i=1;i<100;i++){
}
}
}