java 类与对象(二)

4.this引用

4.1 为什么要this引用

我们先看一段正确的代码

public class Date {//建一个日期类
    public int year;//年
    public int month;//月
    public int day;。。日
    //输出年,月,日的方法
    public void setDate(int y,int m,int d) {
        year = y;
        month = m;
        day = d;
    }
	//输出
    public void printDate(){
        System.out.println("今天是"+year+"年"+month+"月"+day+"日");
    }

    public static void main(String[] args) {
        Date date = new Date();//实例化一个对象
        date.setDate(2024,5,15);//给方法传参,输入日期
        date.printDate();//输出
    }
}


// 输出结果:
// 今天是2024年5月15日

如上段代码,其当输入日期的方法setDate中的形参与变量名字相同时,即:

public void setDate(int year, int month, int day){
	year = year;
	month = month;
	day = day;
}

这样的代码在运行不会出错,但结果就会变成类型对应的零值
错误结果

因为在这个方法中,参数与变量名相同,到底是谁给谁赋值?成员变量给成员变量?参数给参数?参数给成员变量?成员变量参数?估计我们自己都搞不清楚了。
这个时候就要用到关键字thisl了,用上this关键字就输出正常了,如:

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

正常输出

4.2什么是this引用

我们先来看看官方的说法:
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
这个什么意思呢?我来给大家解释一下,我们在调用方法时,如:

Date date = new Date();
date.setDate(2024,5,15);
Date date1 = new Date();
date1.setDate(2023,3,25);

我们实例化了两个对象,用“.”的方式完成了调用方法,即:

date.setDate(2024,5,15);
public void setDate(int year, int month, int day){
	this.year = year;
	this.month = month;
	this.day = day;
}

方法内部的this就代表调用这个方法的对象的名字。

4.3this 引用的特性

1.this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2.this只能在"成员方法“中使用。
3.在"成员方法”中。this只能引用当前对象,不能再引用其他对象。
4.this"成员方法“第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员,this负责来接收。
代码层表示

5.对象的构造及初始化

5.1.如何初始化对象

前面我们学过,如果我们定义了一个局部变量,没有初始化的话,程序会报错。

public static void main(String[] args) {
int a;
System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a

要想通过上述代码。只需要我们给a一个初始化的值即可。
而对象的话,我们每次输出值时,都运用了setDate方法,给了他一个值。

public static void main(String[] args) {
        Date date = new Date();//实例化一个对象
        date.setDate(2024,5,15);//给方法传参,输入日期
        date.printDate();//输出
    }

根据这个我们就有两个问题:
1.每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
2. 局部变量必须要初始化才能使用,为什么字段声明之后没有给值依然可以使用?

5.2构造方法

5.2.1 概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
看代码:

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

这个时候可能就有人要问了,这么写是要怎么调用呢?什么时候用呢?

构造函数的调用
其实在你实例化对象的时候,系统就会自动调用构造函数,

问:我们之前没有写这个构造函数,但是整个程序还是可以正常运行的,为什么?

答:因为在我们没有写构造函数的时候,系统就会调用系统自带的构造函数,所以不会报错

5.2.2特性

1.名字必须与类名相同
2.没有返回值类型,设置为void也不行
3.创建对象时有编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
4,构造方法可以重载(用户根据中自己的需求踢狗不同参数的构造方法)
5.如果用户没有显示定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
6.构造方法中,可以通过this调用其他构造方法来简化代码
7.this必须在构造方法中第一条语句,并且不能成环
8.绝大多数情况下使用public来修饰,特殊场景下会被private修饰
注:一旦用户定义,编译器就无法生成

5.3默认构造方法

在成员变量定义时,可以不用进行初始化,因为他们在对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:

数据类型默认值
byte0
char‘\u0000’
short0
int0
long0L
booleanfalse
float0.0f
double0.0
reteebcenull

5.4.就地初始化

在声明成员变量时,就直接给出了初始值。

public int year=2024public int month=5;
public int day=15;

但是整个需要注意的是,这个是在代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值