- this的引用
- 什么是构造方法?
- 构造方法的特点
- 1.构造方法是可以用户自己去定义的
- 2.构造方法可以初始化成员变量和重载
- 3.构造方法中可以通过this来简化代码
- this. 可以调用成员方法
- 总结
先来看一下下面这两段代码:
public class Fraction {
public double Chinese;
public double Math;
public double English;
public void SetFraction(double a, double b, double c) {
Chinese = a;
Math = b;
English = c;
}
public void PrintFraction(){
System.out.println(Chinese+" "+Math+" "+English);
}
public static void main(String[] args) {
Fraction fraction = new Fraction();
fraction.SetFraction(90.0, 91.5, 92.0);
fraction.PrintFraction();
}
}
public class Fraction {
public double Chinese;
public double Math;
public double English;
public void SetFraction(double Chinese, double Math, double English) {
Chinese = Chinese;
Math = Math;
English = English;
}
public void PrintFraction(){
System.out.println(Chinese+" "+Math+" "+English);
}
public static void main(String[] args) {
Fraction fraction = new Fraction();
fraction.SetFraction(90.0, 91.5, 92.0);
fraction.PrintFraction();
}
}
上面两端代码都是我对类里面的成员变量赋值所写的成员方法,其实不同点就只有一个地方,就只有SetFraction成员方法不同而已,一个是形参的名字不和成员变量相同,而另外一个是与成员变量相同看下图:
这两个成员方法都能给我的成员变量赋值吗?
答案是只有第一段代码的SetFraction成员方法能给成员变量赋值,第二段的不能。第一段代码的运行结果是90.0 91.5 92,而第二段代码的运行结果是0.0 0.0 0.0。
为什么?
因为第二段代码的SetFraction成员方法的形参是局部变量,我们知道程序在运行时,局部变量优先,那么在这个方法里面就都是局部变量,没有成员变量,所以无法给成员变量进行赋值。第二段代码运行的结果只是成员变量的默认值。
怎么解决第二段代码无法赋值的问题?
这个时候就要用到this这个关键字了。this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过this引用去访问。看下面这段代码:
public class Fraction {
public double Chinese;
public double Math;
public double English;
public void SetFraction(double Chinese, double Math, double English) {
this.Chinese = Chinese;
this.Math = Math;
this.English = English;
}
public void PrintFraction(){
System.out.println(Chinese+" "+Math+" "+English);
}
public static void main(String[] args) {
Fraction fraction = new Fraction();
fraction.SetFraction(90.0, 91.5, 92.0);
fraction.PrintFraction();
}
}
我们只需要在前面加this.就可以了,我是在主函数中创建了fraction这个对象,并通过fraction去调用SetFraction这个成员方法,而在前面加上this.代表的就是fraction. 。对象名+. 是可以访问成员变量的,因此代码运行的时候,前面的是成员变量,而后面的是局部变量。PrintFraction方法中的变量名前也可以加this.
什么是构造方法?构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
就比如说上面的那段代码,我是在主函数中创建了fraction这个对象,那么编译器就会自动调用一个不带参数的构造方法,构造方法的代码如下:
public Fraction(){
}
注意:
- 名字与类名相同,没有返回值类型,设置为void也不行
- 一般情况下使用public修饰
- 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
看一下下面这段代码:
public class Fraction {
public double Chinese;
public double Math;
public double English;
public void SetFraction(double Chinese, double Math, double English) {
this.Chinese = Chinese;
this.Math = Math;
this.English = English;
}
public void PrintFraction(){
System.out.println(Chinese+" "+Math+" "+English);
}
public Fraction(){
System.out.println("调用了构造方法");
}
public static void main(String[] args) {
Fraction fraction = new Fraction();
fraction.SetFraction(90.0, 91.5, 92.0);
fraction.PrintFraction();
}
}
我并没有调用public Fraction这个成员方法,我们来看一下运行结果
注意此时还是运行了public Fraction这个成员方法,由此我们可知在我们创建一个类变量时,如果用户自己定义了构造方法,就会调用用户定义的成员方法。如果用户没有定义构造方法,编译器才会自动为我们生成一个不带参数的构造方法。
前面说了在创建类成员编译器会调用构造方法,用户可以自己定义构造方法,那么我们就可以定义一个可以初始化成员变量的构造方法。看下面这段代码:
public class Fraction {
public double Chinese;
public double Math;
public double English;
public void PrintFraction(){
System.out.println(Chinese+" "+Math+" "+English);
}
public Fraction(){
System.out.println("调用了构造方法");
}
public Fraction(double Chinese, double Math, double English){
this.Chinese = Chinese;
this.Math = Math;
this.English = English;
System.out.println("调用了带3个参数的成员方法");
}
public static void main(String[] args) {
Fraction fraction = new Fraction(90.0,91.5,92);
fraction.PrintFraction();
}
}
通过上面的这段代码和运行结果,我们知道构造方法是可以发生重载。不知道大家还记不记得重载,这里带大家复习一下方法的重载:
- 方法名相同
- 参数列表不同(数据类型,顺序,个数的不同)
- 和返回值没关系
来看一下下面这段代码
public class Fraction {
public double Chinese;
public double Math;
public double English;
public void PrintFraction(){
System.out.println(Chinese+" "+Math+" "+English);
}
public Fraction(){
this(91.0,91.5,92.0);
}
public Fraction(double Chinese, double Math, double English){
this.Chinese = Chinese;
this.Math = Math;
this.English = English;
System.out.println("调用了带3个参数的成员方法");
}
public static void main(String[] args) {
Fraction fraction = new Fraction();
fraction.PrintFraction();
}
}
因此在主函数中创建对象时就不需要给实参了。运行结果如图所示:
看一下下面这段代码及运行结果:
public class Fraction {
public double Chinese;
public double Math;
public double English;
public void PrintFraction(){
System.out.println(Chinese+" "+Math+" "+English);
}
public Fraction(double Chinese, double Math, double English){
this.Chinese = Chinese;
this.Math = Math;
this.English = English;
this.PrintFraction();
}
public static void main(String[] args) {
Fraction fraction = new Fraction(90.0,91.5,92);
}
}
在主函数中我没有调用任何成员方法,只是我在创建变量时,编译器调用了我定义的构造方法,并通过this.PrintFraction调用了PrintFraction方法。
- this一共有三种方法。(1).this可以解决成员方法中形参与成员变量名字相同的问题 (2)构造方法中可以通过this来简化代码 (3)this. 可以调用成员方法
- 构造方法可以用户自己去定义的,如果用户定义了构造方法,编译器就不再提供构造方法了。只有用户没有定义构造方法,编译器才会提供一个没有参数的构造方法。
- 构造方法可以初始化成员变量和重载。
感谢你的观看,如果你正要学JAVA,可以关注一下我的专栏,感谢!如果文章中有错误或表达不当的地方,欢迎大佬指正!感谢!



