【Java概念】构造方法、this、super(6)

构造方法

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);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值