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()+"一样大");
        }
    }
}
目录
相关文章
|
4月前
|
Java 开发者
Java中的并发编程:深入理解synchronized关键字
在Java并发编程的领域中,synchronized关键字是实现线程同步的基础工具之一。本文将深入剖析synchronized的作用机制,探讨其在多线程环境下确保数据一致性的重要性,并通过实际案例展示其应用。同时,文章还将比较synchronized与Lock接口的不同之处,以助于开发者更好地选择适合自己场景的同步策略。
|
4月前
|
存储 安全 Java
Java面试题:深入探索Java内存模型,Java内存模型中的主内存与工作内存的概念,Java内存模型中的happens-before关系,volatile关键字在Java内存模型中的作用
Java面试题:深入探索Java内存模型,Java内存模型中的主内存与工作内存的概念,Java内存模型中的happens-before关系,volatile关键字在Java内存模型中的作用
38 1
|
4月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
46 0
|
4月前
|
存储 SQL Java
Java实现关键字模糊查询的高效方法及实践
实现关键字模糊查询的方法有多种,每种方法都有其适用场景。在选择合适的方法时,应考虑实际需求、数据量大小、性能要求等因素。正则表达式适用于处理简单文本或小数据集;数据库模糊查询适用于存储在RDBMS中的数据;而第三方库,则适合需要进行复杂搜索的大型项目。选用合适的工具,可以有效提升搜索功能的性能和用户体验。
95 6
|
4月前
|
算法 Java API
多线程线程池问题之synchronized关键字在Java中的使用方法和底层实现,如何解决
多线程线程池问题之synchronized关键字在Java中的使用方法和底层实现,如何解决
|
4月前
|
缓存 安全 Java
Java面试题:解释volatile关键字的作用,以及它如何保证内存的可见性
Java面试题:解释volatile关键字的作用,以及它如何保证内存的可见性
77 4
|
4月前
|
安全 Java
Java面试题:解释synchronized关键字在Java内存模型中的语义
Java面试题:解释synchronized关键字在Java内存模型中的语义
46 1
|
4月前
|
设计模式 缓存 安全
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
58 1
|
4月前
|
存储 安全 Java
(二) 彻底理解Java并发编程之 Synchronized关键字实现原理剖析
Synchronized 关键字(互斥锁)原理,一线大厂不变的面试题,同时也是理解 Java 并发编程必不可少的一环!其中覆盖的知识面很多,需要理解的点也很多,本文会以相关书籍和结合自己的个人理解,从基础的应用范围到底层深入剖析的方式进行阐述,如果错误或疑问欢迎各位看官评论区留言纠正,谢谢!
|
4月前
|
存储 缓存 Java
(一) 玩命死磕Java内存模型(JMM)与 Volatile关键字底层原理
文章的阐述思路为:先阐述`JVM`内存模型、硬件与`OS`(操作系统)内存区域架构、`Java`多线程原理以及`Java`内存模型`JMM`之间的关联关系后,再对`Java`内存模型进行进一步剖析,毕竟许多小伙伴很容易将`Java`内存模型(`JMM`)和`JVM`内存模型的概念相互混淆,本文的目的就是帮助各位彻底理解`JMM`内存模型。
115 0