教妹学Java(二十 七):this 关键字的用法(1)

简介: 教妹学Java(二十 七):this 关键字的用法

三妹开学了,学的计算机软件编程。她学校离我家很近,坐公交车也就 10 站路的距离, 每逢周末她都会来找我,让我辅导她学习 Java。作为一名拥有十余年编程经验的程序员,再加上父母给我们的这份血缘关系,我觉得义不容辞。


“二哥,今天我们要学习的内容是‘this 关键字’,对吧?”看来三妹已经提前预习了我上次留给她的作业。


“是的,三妹。this 关键字有很多用法。 ”我面带着朴实无华的微笑回答着她,“最常用的一个是,它可以作为一引用变量,指向当前对象。”


----正儿八经的分割线,正文开始------------


01、this 关键字有哪些用法


下面给出了 this 关键字的六种用法:


指向当前对象;

调用当前类的方法;

this() 可以调用当前类的构造方法;

this 可以作为参数在方法中传递;

this 可以作为参数在构造方法中传递;

this 可以作为方法的返回值,返回当前类的对象。

02、 指向当前对象


如果参数名和实例变量名产生了冲突,this 关键字可以解决这个问题。先来看一个没有 this 关键字的例子:


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class WithoutThisStudent {
    String name;
    int age;
    WithoutThisStudent(String name, int age) {
        name = name;
        age = age;
    }
    void out() {
        System.out.println(name+" " + age);
    }
    public static void main(String[] args) {
        WithoutThisStudent s1 = new WithoutThisStudent("沉默王二", 18);
        WithoutThisStudent s2 = new WithoutThisStudent("沉默王三", 16);
        s1.out();
        s2.out();
    }
}



在上面的例子中,构造方法的参数名和实例变量名相同,由于没有使用 this 关键字,所以无法为实例变量赋值。程序输出的结果如下所示:


null 0

null 0



从结果中可以看得出来,尽管创建对象的时候传递了参数,但实例变量并没有赋值。这是因为如果构造方法中没有使用 this 关键字的话,name 和 age 指向的并不是实例变量而是参数。


怎么解决这个问题呢?加上 this 关键字就好了。


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class WithThisStudent {
    String name;
    int age;
    WithThisStudent(String name, int age) {
        this.name = name;
        this.age = age;
    }
    void out() {
        System.out.println(name+" " + age);
    }
    public static void main(String[] args) {
        WithThisStudent s1 = new WithThisStudent("沉默王二", 18);
        WithThisStudent s2 = new WithThisStudent("沉默王三", 16);
        s1.out();
        s2.out();
    }
}



再来看一下程序的输出结果:


沉默王二 18

沉默王三 16

1

2

当然了,如果参数名和实例变量名不同的话,就不必使用 this 关键字,但我建议使用 this 关键字,这样的代码更有意义。


03、调用当前类的方法


我们可以在一个类中使用 this 关键字来调用另外一个方法,如果没有使用的话,编译器会自动帮我们加上。


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class InvokeCurrentClassMethod {
    void method1() {}
    void method2() {
        method1();
    }
    public static void main(String[] args) {
        new InvokeCurrentClassMethod().method1();
    }
}



在源代码中,method2() 在调用 method1() 的时候并没有使用 this 关键字,但通过反编译后的字节码可以看得到。


public class InvokeCurrentClassMethod {
    public InvokeCurrentClassMethod() {
    }
    void method1() {
    }
    void method2() {
        this.method1();
    }
    public static void main(String[] args) {
        (new InvokeCurrentClassMethod()).method1();
    }
}


这次看到了吧?


04、调用当前类的构造方法


this() 可用于调用当前类的构造方法——构造方法可以重用了。


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class InvokeConstrutor {
    InvokeConstrutor() {
        System.out.println("hello");
    }
    InvokeConstrutor(int count) {
        this();
        System.out.println(count);
    }
    public static void main(String[] args) {
        InvokeConstrutor invokeConstrutor = new InvokeConstrutor(10);
    }
}



在有参构造方法 InvokeConstrutor(int count) 中,使用了 this() 来调用无参构造方法 InvokeConstrutor()。来看一下输出结果:


hello

10



果然,无参构造方法也被调用了,所以输出了“hello”。


也可以在无参构造方法中使用 this() 并传递参数来调用有参构造方法,来看下面这段代码:


/**
 * @author 微信搜「沉默王二」,回复关键字 PDF
 */
public class InvokeParamConstrutor {
    InvokeParamConstrutor() {
        this(10);
        System.out.println("hello");
    }
    InvokeParamConstrutor(int count) {
        System.out.println(count);
    }
    public static void main(String[] args) {
        InvokeParamConstrutor invokeConstrutor = new InvokeParamConstrutor();
    }
}



来看一下程序的输出结果。


10

hello



注意,this() 必须放在构造方法的第一行,否则就报错了,见下图。


image.png

相关文章
|
9月前
|
缓存 安全 Java
Volatile关键字与Java原子性的迷宫之旅
通过合理使用 `volatile`和原子操作,可以在提升程序性能的同时,确保程序的正确性和线程安全性。希望本文能帮助您更好地理解和应用这些并发编程中的关键概念。
244 21
|
8月前
|
Java C语言
课时8:Java程序基本概念(标识符与关键字)
课时8介绍Java程序中的标识符与关键字。标识符由字母、数字、下划线和美元符号组成,不能以数字开头且不能使用Java保留字。建议使用有意义的命名,如student_name、age。关键字是特殊标记,如蓝色字体所示。未使用的关键字有goto、const;特殊单词null、true、false不算关键字。JDK1.4后新增assert,JDK1.5后新增enum。
168 4
|
7月前
|
存储 安全 Java
深入理解 Java 中的 instanceof 关键字
本文深入解析了 Java 中的 `instanceof` 关键字,探讨其在类型判断中的作用。作为二元操作符,`instanceof` 可用于检查对象是否为某类实例或实现特定接口,避免类型转换异常 (`ClassCastException`)。文章通过多态性下的类型判断、安全类型转换、接口实现检测及集合元素类型判定等实际应用场景,展示了 `instanceof` 的强大功能。掌握该关键字可提高代码健壮性,确保运行时类型安全。
559 0
|
11月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
10384 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
11月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
309 5
Java 并发编程——volatile 关键字解析
|
10月前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
1670 9
|
10月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
11月前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
3427 3
|
JavaScript 前端开发 Java
java中的this关键字
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。若我的文章对你有帮助,欢迎关注,持续更新中!🎉🎉🎉
194 9
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
258 8
下一篇
oss云网关配置