java中关键字this的使用

简介: java中关键字this的使用

Java中关键字this的使用

@[toc]

基础理解

this是什么?
  • 在Java中,this关键字比较难理解,它的作用和其词义很接近。
  • 它在方法内部使用,即这个方法所属对象的引用
  • 它在构造器内部使用,表示该构造器正在初始化的对象。

this 可以调用类的属性、方法和构造器

什么时候使用this关键字呢?

当在方法内需要用到调用该方法的对象时,就用this。

具体的:我们可以用this来区分属性和局部变量。

比如:this.name = name;


遇见问题思考3W(what、why、who):这个代码是什么?为什么有这个东西?如何去使用?


this关键字的具体使用

  1. this可以用来修饰属性、方法、构造器
  2. this修饰属性和方法:

    • this理解为:”当前对象的“或“当前正在创建的对象"(构造器中)
    • 很多情况下this都可以不写

总的来说:在类的方法中,可以使用”this.属性“或者”this.方法“的方式,调用当前对象的属性或者方法,但是通常情况下都选择了省略,特殊情况下,如果方法的形参和类的属性同名时,我们必须显示的使用“this.变量”的方式,表示此变量是属性而非形参


举例子如下

第一步:形参为了见名知意,和属性重名了,并不报错,如下代码

package ThisUse;
//this关键字的使用
public class A {
    public static void main(String[] args) {
        Person p1 = new Person();//默认的空参构造器
        p1.setAge(1);
        System.out.println(p1.getAge());//运行结果:0
    }
}
class Person{
    private int age;
    private String name;
    
    public void setAge(int age){
        age=age;
    }
    public int getAge(){
        return age;
    }
    public void setName(String name){
        name=name;
    }
    public String getName(){
        return name;
    }
}

第二步:发现运行结构是错的,相当于就近原则,代码中的name和age都用的是形参,这时候用this.属性来区分(用this来区分属性和局部变量),改进后如下代码

package ThisUse;
//this关键字的使用
public class A {
    public static void main(String[] args) {
        Person p1 = new Person(4);
        p1.setAge(1);
        System.out.println(p1.getAge());
    }
}
class Person{
    private int age;
    private String name;

    //构造器中用this为"当前正在创建的对象"
    
    public Person(int age){
        this.age=age;
    }
    public void setAge(int age){
        this.age=age;
    }
    public int getAge(){
        return age;
    }
    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return name;
    }
}

this调用构造器

  • 降低代码的冗余
  1. 可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其 他的构造器!
  2. 明确:构造器中不能通过"this(形参列表)"的方式调用自身构造器
  3. 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了 "this(形参列表)"
  4. "this(形参列表)"必须声明在类的构造器的首行!
  5. 在类的一个构造器中,最多只能声明一个"this(形参列表)"

练习题:关于this的使用

在这里插入图片描述

附加:快速构造set和get方法

idea快捷键:alt+insert或者直接右键也可以

  • 也可以直接建构造器:constructor
答案代码:

Boy

package LXT4;

public class Boy {
    private String name;
    private int age;

    public Boy(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void marry(Girl girl){
        System.out.println("我想娶:"+girl.getName());
    }
    public void shout(){
        if (this.age>=22){
            System.out.println("可以合法登记结婚了");
        }else {
            System.out.println("不可以合法登记");
        }
    }
}

Girl

package LXT4;

public class Girl {
    private String name;
    private int age;

    public Girl(){

    }
    public Girl(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Girl(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void marry(Boy boy){
        System.out.println("我想嫁给:"+boy.getName());
        boy.marry(this);//this是"当前对象",这里谁调marry谁就是this
    }

    //比较两个对象的大小,如果返回值是正数,当前对象大,如果返回值是负数,当前对象小,返回0,则当前对象(调用这个方法的对象)与形参对象一样大
    public int compare(Girl girl){
        if(this.age>girl.age){
            return 1;
        }else if (this.age<girl.age){
            return -1;
        }else {
            return 0;
        }
    }
}

BoyGirlTest

package LXT4;

public class BoyGirlTest {
    public static void main(String[] args) {
        Boy boy = new Boy("罗密欧",21);
        boy.shout();
        Girl girl = new Girl("朱丽叶",18);
        girl.marry(boy);

        System.out.println("-------");
//compare比较对象大小(比较两个对象的大小,如果返回值是正数,当前对象大,如果返回值是负数,当前对象小,
// 返回0,则当前对象(调用这个方法的对象)与形参对象一样大)
        Girl girl1 = new Girl("祝英台", 19);
        int compare=girl.compare(girl1);//用gilr(朱丽叶)去调用,girl1赋值给形参,
        if(compare>0){
            System.out.println(girl.getName()+"更大");
        }else if(compare<0){
            System.out.println(girl1.getName()+"更大");
        }else {
            System.out.println(girl1.getName()+"和"+girl.getName()+"一样大");
        }
    }
}
        System.out.println(girl.getName()+"更大");
        }else if(compare<0){
            System.out.println(girl1.getName()+"更大");
        }else {
            System.out.println(girl1.getName()+"和"+girl.getName()+"一样大");
        }
    }
}
目录
相关文章
|
7月前
|
缓存 安全 Java
Volatile关键字与Java原子性的迷宫之旅
通过合理使用 `volatile`和原子操作,可以在提升程序性能的同时,确保程序的正确性和线程安全性。希望本文能帮助您更好地理解和应用这些并发编程中的关键概念。
175 21
|
5月前
|
存储 安全 Java
深入理解 Java 中的 instanceof 关键字
本文深入解析了 Java 中的 `instanceof` 关键字,探讨其在类型判断中的作用。作为二元操作符,`instanceof` 可用于检查对象是否为某类实例或实现特定接口,避免类型转换异常 (`ClassCastException`)。文章通过多态性下的类型判断、安全类型转换、接口实现检测及集合元素类型判定等实际应用场景,展示了 `instanceof` 的强大功能。掌握该关键字可提高代码健壮性,确保运行时类型安全。
362 0
|
6月前
|
Java C语言
课时8:Java程序基本概念(标识符与关键字)
课时8介绍Java程序中的标识符与关键字。标识符由字母、数字、下划线和美元符号组成,不能以数字开头且不能使用Java保留字。建议使用有意义的命名,如student_name、age。关键字是特殊标记,如蓝色字体所示。未使用的关键字有goto、const;特殊单词null、true、false不算关键字。JDK1.4后新增assert,JDK1.5后新增enum。
107 4
|
9月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
253 5
Java 并发编程——volatile 关键字解析
|
8月前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
1414 9
|
8月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
9月前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
3154 3
|
10月前
|
JavaScript 前端开发 Java
java中的this关键字
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。若我的文章对你有帮助,欢迎关注,持续更新中!🎉🎉🎉
151 9
|
10月前
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
166 8
|
10月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
118 4