Java中的构造方法(动力节点)

对象的定义和赋值操作:

// 会员类
public class Vip {

    // 类 = 属性 + 方法
    // 属性:描述的是状态。
    // 方法:描述的是行为。

    // 姓名
    String name; // 实例变量(对象变量)
    // 年龄
    int age; // 实例变量(对象变量)
    public void shopping(){
        System.out.println("正在购物!");
    }
}
//对象的使用和赋值

public class VipTest01 {
    public static void main(String[] args) {
        // 创建一个Vip对象
        Vip vip1 = new Vip();

        // 给name和age属性赋值
        vip1.name = "jack";
        vip1.age = 20;

        System.out.println("name = " + vip1.name);
        System.out.println("age = " + vip1.age);

        // 去购物
        vip1.shopping();

        // 再创建一个Vip对象
        Vip vip2 = new Vip();
        vip2.name = "lisi";
        vip2.age = 15;

        System.out.println("name = " + vip2.name);
        System.out.println("age = " + vip2.age);

        // 去购物
        // 实例方法需要使用“引用.”来调用。
        vip2.shopping();

    }
}

****如果要创建100个对象的话,那么给对象的属性依次赋值就很麻烦。或者是当我们已经指导对象属性的各个初始值时,如果在定义的时候就能给对象属性赋值就可以节约很多的步骤,代码会更加简介。

构造方法(也叫构造器)

  • 构造方法/Constructor/构造器
    1. 构造方法有什么作用?
  • 作用1:对象的创建(通过调用构造方法可以完成对象的创建)
  • 作用2:对象的初始化(给对象的所有属性赋值就是对象的初始化)
    1. 怎么定义构造方法呢?
  • [修饰符列表] 构造方法名(形参列表){
  •  构造方法体;
    
  • }
  • 注意:
  • 构造方法名必须和类名一致。
  • == 构造方法不需要提供返回值类型。==
  • 如果提供了返回值类型,那么这个方法就不是构造方法了,就变成普通方法了。
    1. 构造方法怎么调用呢?
  • 使用new运算符来调用。
  • == 语法:new 构造方法名(实参);==
  • 注意:构造方法最终执行结束之后,会自动将创建的对象的内存地址返回。但构造方法体中不需要提供“return 值;”这样的语句。
  • 4.在java语言中,如果一个类没有显示的去定义构造方法,系统会默认提供一个无参数的构造方法。(通常把这个构造方法叫做缺省构造器。)
  • 5.一个类中如果显示的定义了构造方法,系统则不再提供缺省构造器。所以,为了对象创建更加方便,建议把无参数构造方法手动的写出来。
  • 6.在java中,一个类中可以定义多个构造方法,而且这些构造方法自动构成了方法的重载(overload)。
    1. 构造方法中给属性赋值了?为什么还需要单独定义set方法给属性赋值呢?
  • 在构造方法中赋值是对象第一次创建时属性赋的值。set方法可以在后期的时候调用,来完成属性值的修改。
  • 8.构造方法执行原理?
  • 构造方法执行包括两个重要的阶段:
  • 第一阶段:对象的创建 在花括号 {} 前完成。
  • 第二阶段:对象的初始化在方法体中完成
    • 对象在什么时候创建的?
  • new的时候,会直接在堆内存中开辟空间。然后给所有属性赋默认值,完成对象的创建。(**这个过程是在构造方法体执行之前就完成了。)
    • 对象初始化在什么时候完成的?
  • *构造方法体开始执行,标志着开始进行对象初始化。构造方法体执行完毕,表示对象初始化完毕。
    1. 构造代码块?
  • 语法格式:
{}
  • 构造代码块什么时候执行,执行几次?
  •  每一次在new的时候,都会先执行一次构造代码块。
    
  •  构造代码块是在构造方法执行之前执行的。
    
    1. 构造代码块有什么用?
  • 如果所有的构造方法在最开始的时候有相同的一部分代码,不妨将这个公共的代码提取到构造代码块当中,这样代码可以得到复用。
    */

构造方法的应用:

public class Vip {

    String name; // 实例变量(对象变量)
    // 年龄
    int age; // 实例变量(对象变量)
//构造方法
    public Vip(){
    }

		public Vip(String name,int age){
			this.name = name;
			this.age = age;
		}
    public void shopping(){
        System.out.println("正在购物!");
}

public class VipTest01 {
    public static void main(String[] args) {
        // 创建一个Vip对象
        Vip vip1 = new Vip("zhangsan",15);
        System.out.println("name = " + vip1.name);
        System.out.println("age = " + vip1.age);

        // 去购物
        vip1.shopping();

        // 再创建一个Vip对象
        Vip vip2 = new Vip("lisi",15);
        System.out.println("name = " + vip2.name);
        System.out.println("age = " + vip2.age);
        vip2.shopping();

    }
}

this关键字的语法总结:

在这里插入图片描述

this(实参的应用);

上文中说到,构造方法可以构成方法重载;但是构造方法中也有更多相近的代码,如果重复写的话就很麻烦。比如下方代码块所示:

/**
* this(实参):
 *      1. 通过这种语法可以在构造方法中调用本类中其他的构造方法。
 *      2. 作用:代码复用。
 *      3. this(实参); 只能出现在构造方法第一行。
 */
 /*需求:定义一个日期类,代表日期。日期属性包括:年月日。
 * 提供两个构造方法,一个是无参数构造方法,当通过无参数构造方法实例化日期对象的时候,默认创建的日期是1970-01-01
 * 另一个构造方法三个参数,通过传递年月日三个参数来确定一个日期。注意属性要提供封装。
 */
 public class Date {
    /**
     * 年
     */
    private int year;
    /**
     * 月
     */
    private int month;
    /**
     * 日
     */
    private int day;

    public Date() {
        /*
        this.year = 1970;
        this.month = 1;
        this.day = 1;
        如果有100个或者更多的实例变量,这样的赋值语句就要写很多次,多个构造函数的话,次数还会再加N倍,因此为了提高代码复用性,可以用this(实参)。
         */

        // 不要这么写,这样会导致再创建一个新的对象。
        //new Date(1970,1,1);

        // 不会创建新对象。只是通过一个构造方法去调用另一个构造方法。
        this(1970,1,1);

        System.out.println("日期创建成功!~");
    }

    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    /**
     * 打印日期
     */
    public void display(){
        //System.out.println(this.year + "年" + this.month + "月" + this.day + "日");
        System.out.println(this.getYear() + "年" + this.getMonth() + "月" + this.getDay() + "日");
    }
}

留一个思考:
==比如说计算创建对象的个数,就可以把这个计数器放在构造代码块中。==但是,如果每次创建一个对象就要加一,说明这个计数的变量一定不能是实例变量,因为实例变量是一个对象一份,而这个计数的变量应该是所有的变量公用一个。
那么计数的变量count应该用什么关键字呐??

类体的变量分为两种:

  • 实例变量
  • 静态变量 用static关键字修饰。
  • 44
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alice要11点睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值