栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java】5000字超详细讲解this操作符和构造方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java】5000字超详细讲解this操作符和构造方法

文章目录
  • this的引用
  • 什么是构造方法?
  • 构造方法的特点
    • 1.构造方法是可以用户自己去定义的
    • 2.构造方法可以初始化成员变量和重载
    • 3.构造方法中可以通过this来简化代码
  • 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(){

    }

注意:

  1. 名字与类名相同,没有返回值类型,设置为void也不行
  2. 一般情况下使用public修饰
  3. 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
构造方法的特点 1.构造方法是可以用户自己去定义的

看一下下面这段代码:

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这个成员方法,由此我们可知在我们创建一个类变量时,如果用户自己定义了构造方法,就会调用用户定义的成员方法。如果用户没有定义构造方法,编译器才会自动为我们生成一个不带参数的构造方法。

2.构造方法可以初始化成员变量和重载

前面说了在创建类成员编译器会调用构造方法,用户可以自己定义构造方法,那么我们就可以定义一个可以初始化成员变量的构造方法。看下面这段代码:

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

通过上面的这段代码和运行结果,我们知道构造方法是可以发生重载。不知道大家还记不记得重载,这里带大家复习一下方法的重载:

  1. 方法名相同
  2. 参数列表不同(数据类型,顺序,个数的不同)
  3. 和返回值没关系
3.构造方法中可以通过this来简化代码

来看一下下面这段代码

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


因此在主函数中创建对象时就不需要给实参了。运行结果如图所示:

this. 可以调用成员方法

看一下下面这段代码及运行结果:

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方法。

总结
  1. this一共有三种方法。(1).this可以解决成员方法中形参与成员变量名字相同的问题 (2)构造方法中可以通过this来简化代码 (3)this. 可以调用成员方法
  2. 构造方法可以用户自己去定义的,如果用户定义了构造方法,编译器就不再提供构造方法了。只有用户没有定义构造方法,编译器才会提供一个没有参数的构造方法。
  3. 构造方法可以初始化成员变量和重载。

感谢你的观看,如果你正要学JAVA,可以关注一下我的专栏,感谢!如果文章中有错误或表达不当的地方,欢迎大佬指正!感谢!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1007050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号