构造方法
package cn.hncu.program.construct;
import java.util.Calendar;
import org.junit.Test;
/**
* 项目名:构造方法、this、super
* 时间 :2017-9-11 上午8:57:23
*/
public class Construct {
/*
* <1>【创建一个对象】:new对象,调用构造方法创建堆内存内容,栈内存中创建引用。
*/
@Test
public void t1(){
MyDate date = new MyDate();
date.showString();//通过对象访问成员方法
}
/*
* <2>【初始化】:成员变量初始化、构造器初始化、static初始化
* 1.在一个类中,成员变量首先进行初始化,其次构造器才开始初始化。---初始化顺序
* 2.Java 尽自己的全力保证所有变量都能在使用前得到正确的初始化。
* 3.static类型的成员变量初始化仅发生一次,在Class 对象首次载入的时候。---static成员变量初始化
* 4.static初始化块:
*/
@Test
public void t2(){
//两次生成的随机数是相同的,这是因为:static初始化仅发生一次,在Class 对象首次载入的时候。
new Initialization().showStatic();//0.8631562390021554
new Initialization().showStatic();//0.8631562390021554
System.gc();
}
/*
* <3>【对象创建过程】:
* 1.类型为MyDate的对象首次创建时,或者首次访问其类的static方法/static字段时,
* Java解释器必须首先找到MyDate.class(在事先设置好的路径里找)。
* 2.找到MyDate.class(它会创建一个Class对象),它的所有static初始化模块都会运行。
* 因此static初始化仅发生一次,在Class对象首次载入的时候。
* 3.创建一个new MyDate()时,MyDate对象的构建进程首先会在堆内存(Heap)里为一个MyDate对象分配足够多的存储空间。
* 4.在堆内存中为所有的基本数据类型设置默认值。
* 5.进行字段定义的时候所发生的所有初始化都会执行。
* 6.执行构建器(继承的时候比较复杂)。
*
* <4>【子类继承父类时的构建器创建】:
* 1.一个子类继承父类后,如果父类含有一个有参构造方法,子类不写任何的构造方法,编译期会出错。
* 2.这是因为,在父类中,父类的有参构造方法覆盖了空参构造方法,从而创建子类的时候无法调用父类的
* 空参构造方法,因此编译期会出错。不管是继承抽象类还是普通类都会出错,因此子类必须自己写
* 与父类参数相同的有参构造方法。
*/
}
/*
* 构造方法演示:
*/
class MyDate{
private int year;
private int month;
private int day;
/*
*【构造方法】:
*1.名称和类名完全相同,没有返回类型。
*/
public MyDate(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
public MyDate(MyDate d){
this(d.year, d.month, d.day);
}
/*
* 【构造方法】:
* 1.空参构造方法,当不写构造方法的时候,Java会自动帮我们添加一个默认的构造方法。
* 但当我们自己写了有参构造方法,Java不会帮我们添加了,因此此时要使用默认构造方法得自己手动添加。
* 2.默认构造方法:空参、空方法体---仅仅是开内存并初始化所有成员变量。
* 3.构造方法 执行了两步:1)开内存(堆内存)并初始化所有成员变量,2)执行构造方法内部的代码。
* 4.由系统调用,构造方法是回调用方法。
* 5.构造方法调用构造方法由this调用。--this(1970, 1, 1);
* 【关于构造方法说明】:
* 6.构造方法在一个对象被new时执行。
* 7.一个类可以定义多个构造方法,构造方法可以被重载。
* 8.构造方法必须与类同名,方法可以与class同名。
*
*/
public MyDate(){
this(1970, 1, 1);
//super();---9.【super】是调用父类里的构造方法,但是super和this必须都在第一行,因此不能同时出现。
}
/*
* 【this】:
* 1.this指代的是 当前对象。
* 2.this.year指代当前对象中的成员变量。---当前对象就是当前类所对应的类--即当前类MyDate
* 3.this语句只能放在构造方法的第一行。
*
*/
public void setYear(int year){
this.year = year;
}
public void showString(){
System.out.println(year+","+month+","+day);
}
@Override
public String toString() {
return "MyDate [year=" + year + ", month=" + month + ", day=" + day
+ "]";
}
}
class Initialization{
/*
* 【static成员变量】
*/
public static double d = Math.random();
/*
* 【static块】:
* 要给静态变量赋值,同时无法用一行赋值代码即要写多行代码,这时通常用静态块来完成。
*/
static{
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
year = (int) (year + d);
}
public void showStatic(){
System.out.println(d);
}
}