a.使用new关键字产生对象会调用构造方法_还没弄明白Java中的this关键字吗,来看这篇就够了...

this关键字的作用:

1、区分成员变量和局部变量(当成员变量和局部变量重名时)

2、可在构造方法中调用同一个类的其他构造方法(但是规定this只能写在构造方法的第一行)

3、能调用构造方法,当然也能调用普通方法啦(在同一个类中的方法内部,其实不必要使用this来调用,直接写出方法名即可,但是有的人会认为,写出this会让代码看起来更规范。我认为这个完全没必要。这里看个人习惯吧。)~

我:你看,这不是很简单吗?

A:什么啊,就这?我知道啊,你这不是在给我说点没用的话嘛。

我:别气嘛,那我再给你扯点(绞尽脑汁的想)

4、this关键字还可以作为当前的对象的引用进行返回,我让你看看代码你就理解了

public class Student {
    public Student log2(){
        System.out.println("直接返回一个Student的引用");
        return this;
    }
}

就这么写。你看,多简单

A:没听懂,返回什么对象什么引用啊。。。

我:嗯。。。。好吧,那我再给你解释一下。再看一下代码!

public class TestMain {
    public static void main(String[] args) {
        Student student = new Student();
        Student student2 = student.log2();
        System.out.println(student == student2);
    }
}

34088e682b94497d2d1a6716f1efd2cd.png

你看,你 new 个对象(对象引用),然后去调用log2这个方法,就会再返回一个对象,此时这个对象和你new的那个是同一个。但是如果你直接return new Student(); 那此时这个对象就是一个新的对象,所以说,this能返回当前对象(引用)。懂了吧!

A:这样啊,那你这么说,我就知道了。

我:再给你掰扯点,别着急;

你知道如果有两个Student的对象时,他们都要去调用同一个方法,怎么才能知道,到底是哪个对象在调用这个方法呢?比如这样的代码

public class Student {
    public void log2(int i) {
        System.out.println(i); 
    }
}
public class TestMain {
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student();
        s1.log2(2);
        s2.log2(3);
    }
}

是不是觉得这是两个不同对象的引用啊,当然能区分是谁在调用了啊!

其实本质不是这样滴

你在写完代码后,编译器悄悄在帮助你做了一个工作,为了让你省心呢,多么贴心啊,我要是....

A:你倒是说啊,到底做了什么?

我:好吧;我说。。。

当你在调用方法的时候,其实编译器悄悄在你传的参数前边加了当前的对象,像这样

s1.log2(s1,2);
s2.log2(s2,3);

当然,如果你这么写代码,那编译器肯定会说:这点小事情,还是我替你做吧,就不麻烦小主人了,然后无情的给了你一个红波浪线;

A:真的假的啊,说的这么玄乎。

我:害,你还不信,看下边的代码,我们在方法上做个小改动

public class Student {
    public void log2(int i) {
        System.out.println(this + " " + i);
    }
}
public class TestMain {
    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student();
        System.out.println("s1的地址----->" + s1);
        System.out.println("s2的地址----->" + s2);
        s1.log2(2);
        s2.log2(3);
    }
}

为了能看清楚是不是这样,我们吧 s1 s2 指向的地址在主方法中打印出来,发现和方法中的 this 打印出来的地址一样

43938cac4fc968c28e9c7877b5f40a55.png

这就说明了,确实是将对象给传了进去。

A:啊,我懂了,我知道了,原来是这样啊,真神奇。我...我...

我:你怎么了,还有什么不懂得吗?

A: 区分变量我总是记不住到底指向的是谁....

我:这个啊,简单,你记住就远原则 "this." 这个this打点调用的是谁,谁就是成员变量。如果你的变量出现了同名的情况,如果不进行指向,默认就是使用你的局部变量。

总结:

由于我个人觉得,如果只是枯燥的堆叠概念,只讲述一些术语,不仅看起来无聊,看过之后还会忘得一干二净。所以笔记用这种方法展示出来,可能更能让人记忆更深刻。学习本来没有固定的方法,不管怎么学,学会了就行嘛!

如有错误,欢迎指出!一定及时改正

好的,让我来为你详细解释一下这个需求及设计思路。 首先,构造方法是一种特殊的方法,用于在创建对象时初始化对象的属性。在Java,每个类都必须至少有一个构造方法。如果有显式地定义构造方法,则默认生成一个无参构造方法。 在本实验,我们需要在Student类创建多个重载的构造方法。重载是指在同一个类定义多个同名方法,但它们的参数个数或类型不同。这样做的好处是可以根据不同的参数调用不同的构造方法,从而方便地初始化对象的属性。 现在,我们来看一下具体的实现步骤: 1. 在Student类创建多个重载的构造方法,包括无参的构造方法和一个参数的构造方法,以及两个参数的构造方法。 ```java public class Student { private String name; private int age; private int score; public Student() { // 无参构造方法 } public Student(String name) { this.name = name; } public Student(String name, int age) { this(name); // 调用一个参数的构造方法 this.age = age; } public Student(String name, int age, int score) { this(name, age); // 调用两个参数的构造方法 this.score = score; } } ``` 在上面的代码,我们创建了四个构造方法,分别为无参构造方法、一个参数的构造方法、两个参数的构造方法和三个参数的构造方法。其,一个参数的构造方法和两个参数的构造方法使用了this关键字调用其他的构造方法。 2. 在一个参数的构造方法使用this关键字调用无参构造方法,在两个参数的构造方法调用一个参数的构造方法。 在Java使用this关键字调用其他的构造方法非常简单。只需要在构造方法内部使用this关键字即可。例如,在一个参数的构造方法使用this关键字调用无参构造方法的代码如下: ```java public Student(String name) { this.name = name; } public Student() { this("unknown"); // 调用带一个参数的构造方法 } ``` 在上面的代码,我们先定义了一个带一个参数的构造方法,用于初始化学生的姓名。然后,在无参构造方法使用this关键字调用带一个参数的构造方法,从而完成了学生对象的初始化。 同样的,我们还可以在两个参数的构造方法调用一个参数的构造方法,代码如下: ```java public Student(String name, int age) { this(name); // 调用一个参数的构造方法 this.age = age; } public Student(String name, int age, int score) { this(name, age); // 调用两个参数的构造方法 this.score = score; } ``` 在上面的代码,我们先定义了一个带两个参数的构造方法,用于初始化学生的姓名和年龄。然后,在三个参数的构造方法使用this关键字调用带两个参数的构造方法,从而完成了学生对象的初始化。 3. 编写测试类,在main()方法调用两个参数的构造方法创建对象,演示构造方法的执行顺序。 最后,我们需要编写一个测试类来测试Student类的构造方法。具体的步骤如下: ```java public class TestStudent { public static void main(String[] args) { Student s = new Student("Tom", 18, 90); System.out.println(s.getName()); System.out.println(s.getAge()); System.out.println(s.getScore()); } } ``` 在上面的代码,我们创建了一个Student对象,并传入了三个参数,分别为姓名、年龄和分数。然后,我们通过调用对象的getName()、getAge()和getScore()方法来获取学生的信息,并打印出来。 运行上面的代码,输出结果如下: ``` Tom 18 90 ``` 从输出结果可以看出,我们成功地创建了一个学生对象,并正确地初始化了学生的姓名、年龄和分数。同时,我们也验证了构造方法的执行顺序,即在三个参数的构造方法调用了带两个参数的构造方法,再初始化学生的分数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值