Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文秒杀Java中this关键字

一文秒杀Java中this关键字

作者头像
润森
发布于 2019-11-24 12:37:49
发布于 2019-11-24 12:37:49
45300
代码可运行
举报
文章被收录于专栏:毛利学Python毛利学Python
运行总次数:0
代码可运行

最近,我在草神极客时间的群,(业余草)大神都叫草神,作为号主,我觉得草哥还行。

草神丢出来了一段Java代码,这个程序的结果是什么?为什么会这样?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.xttblog.demo;

class SuperClass {
    void method() {
        System.out.println("SuperClass::method");
    }
    void fun() {
        System.out.println("SuperClass::fun");
        this.method();
    }
}

class SubClass extends SuperClass {
    void method() {
        System.out.println("SubClass::method: Begin");
        super.fun();
        System.out.println("SubClass::method: End");
    }
}

class Test {
    public static void main(String[] args) {
        SubClass a = new SubClass();
        a.method();
    }
}

其实很容易知道,陷入了一个死循环。

在这里插入图片描述 运行的结果的顺序其实很简单,关键就是要理解this到底指着谁,this表示对当前对象的引用,也就是subclass对象

在这里插入图片描述

如果在new一个Superclass对象,bug就解决了

在这里插入图片描述

但是你真正了解过this

this原理:

  • 代表的是当前对象。
  • this就是所在函数的所属对象的引用。
简单说,哪个对象调用了this关键字所在的函数,this就代表哪个对象。

this有下面3中用法

引用成员变量

表示对当前对象的引用!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author: 毛利
 */
public class Person1 {
    private  int age;
    private String name;
    void Sayhello(Integer age ,String name){
        //将局部变量的值传递给成员变量
        this.name = name;
        this.age = age;
        System.out.println("我的名字是" + this.name + ",年龄是" + this.age);
    }

    public static void main(String[] args) {
        Person1 p = new Person1();
        p.Sayhello(20,"maoli");
    }
}

这个应该人人都知道

表示用类的成员变量,而非函数参数

方法名来初始化对象,毛利到底 是19还是20呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author: 毛利
 */
class Person {
    private int age = 19;
    public Person(){
        System.out.println("初始化年龄:"+age);
    }
    public int GetAge(int age){
        this.age = age;
        return this.age;
    }
}

public class test1 {
    public static void main(String[] args) {
        Person maoli = new Person();
        System.out.println("maoli's age is "+maoli.GetAge(20));
    }
}

Java中this这个关键字可以实现类属性的调用,类方法的调用,表示当前对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
初始化年龄:19
maoli's age is 20
毛利当然是20,奔2的人

这个例子和草神的bug一样的道理

形参与成员名字重名,用 this 来区分:

可以看到,这里 age 是 GetAge 成员方法的形参,this.age 是 Person 类的成员变量。

还有就是注意:this不能用在static方法中!

这跟jvm联系到一起

在静态函数是存在与类(class)一级,并不是对象(object)的一部分,所以也就没有this指针。因此,在静态方法中使用this是错误的。

在这里插入图片描述 当静态方法加载进内存进栈时,如果在静态方法中有this 和 super 关键字时,this和super也被加载到了内存,但是这个时候并没有对象的引用,this和super没有初始化,所有编译会报错。

this参数类型的构造器

如果为this提供了参数列表,那么即意味着对符合该参数列表的构造器的调用。 通过this关键字调用构造器有以下几条规范:

  • 不能在普通方法中调用,只能在构造器中调用。
  • 一个构造器中只能调用一次。
  • 只能在构造器的第一行调用。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author: 毛利
 */
public class test {
    public test(int a, int b, int c) {
        // 构造器的调用必须在一个构造器的第一行
        this(a, b);
        //this(a);   //此行报错,意味着在一个构造器里面只能调用一次构造器。
        System.out.println(b);
    }

    public test(int a, int b) {
        this(a);
        System.out.println("a="+a);
    }

    public test(int a) {
        System.out.println("调用成功!");
        System.out.println(a);
    }

    public static void main(String[] args) {
        new test(1, 2, 3); //调用成功,意味着虽然一个构造器中只能调用一次其它构造器,但却可以通过“一个调一个”的方式调用多个构造器。
    }
}

代码运行如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
调用成功!
1
a=1
2
其实this主要要三种用法:

1、表示对当前对象的引用!

2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分

3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[JAVA进阶]一文理解面向对象编程(超详细2w字巨作!)
我们在程序之中要干某种事,需要某种工具来完成,这样更符合人类的思维习惯,编程更简单,更好理解。
钮祜禄.爱因斯晨
2025/07/13
430
[JAVA进阶]一文理解面向对象编程(超详细2w字巨作!)
庖丁解牛,洞悉 Java 面向对象的精妙架构
我们在程序之中要干某种事,需要某种工具来完成,这样更符合人类的思维习惯,编程更简单,更好理解。
钮祜禄.爱因斯晨
2025/06/11
800
庖丁解牛,洞悉 Java 面向对象的精妙架构
【JavaSE】this 关键字基本使用
4) 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句)
兮动人
2021/12/31
2570
【JAVA杂货铺】一文带你走进面向对象编程|构造方法调用 | 代码块分类| 期末复习系列 | (中3)
通过构造对象进行构造方法的调用,对应自己想调用的构造方法,看构造方法的参数个数进行传参.
ImAileen
2024/01/18
1400
【JAVA杂货铺】一文带你走进面向对象编程|构造方法调用 | 代码块分类| 期末复习系列 | (中3)
一篇文章带你了解this关键字和单例模式
前面的文章给大家介绍了Java诸多基础知识,感兴趣的小伙伴记得前往噢:Java基础入门篇——for循环、Java基础入门篇——While循环、Java基础入门篇——Switch条件语句、Java基础入门篇(七)——结构语句和if语句、Java基础入门篇(六)——Java运算符、Java基础入门篇(五)——Java变量类型的转换和运算符。接下来开始我们今天的内容吧~
Java进阶者
2021/01/22
3050
Java基础学习-this关键字
(*******有了this之后,可以将构造方法的参数跟成员变量保持一致*******)
FutureTester
2021/12/19
2510
【JAVA杂货铺】一文带你走进面向对象编程的构造方法 | Java| 面向对象编程 | (中)
ImAileen
2024/01/18
1120
【JAVA杂货铺】一文带你走进面向对象编程的构造方法 | Java| 面向对象编程 | (中)
初识Java对象
1面向对象编程:当你要实现一个功能的时候,不关心具体步骤,而是找一个已经具备该功能的人来帮我做
一只胡说八道的猴子
2020/09/27
6390
初识Java对象
Java系列:关于关键字this和static
在C语言中,我们经常会遇到指针,也常常被指针所困扰,毕竟它经常惹程序员头疼。那么在Java中我们便方便多了,只是因为有了this.
小Bob来啦
2022/01/17
2460
Java系列:关于关键字this和static
【JavaSE】封装基本使用
1. 基本介绍 面向对象编程有三大特征:封装、继承和多态。 2. 封装介绍 [在这里插入图片描述] 3. 封装的理解和好处 [在这里插入图片描述] 4. 封装的实现步骤 (三步) [在这里插入图片描述] 5. 快速入门案例 [在这里插入图片描述] package com.xdr630.encap; public class Encapsulation01 { public static void main(String[] args) { Person person = new
兮动人
2022/01/01
1190
【IT领域新生必看】解锁 `final` 关键字的秘密:Java 编程中的终极武器
在编程的世界里,关键字是语言设计者赋予开发者的强大工具,每个关键字都有其独特的用途和重要性。对于Java程序员来说,final 是一个极其重要且常用的关键字。它不仅有助于提高代码的安全性和稳定性,还能优化性能,帮助开发者编写更高效的代码。但是,final 关键字的用途和使用场景可能让初学者感到困惑。今天,我们将深入探讨Java中的 final 关键字,揭示它的真正威力,并展示如何在实际编程中巧妙地运用它。
E绵绵
2024/07/12
2050
ECMAScript中类与继承详解(Java对比学习)
如果声明一个一个类的时候没有声明构造函数,那么会默认添加一个空的构造函数,构造函数在new实例化一个对象的时候会被调用
coder_koala
2019/07/30
4600
java之this关键字
说明:新建一个对象时,根据传的参数的不同(类型或者个数),java会调用相应的构造方法。在构造方法中,通过this(参数),又会调用其它的构造方法。
西西嘛呦
2022/05/10
1430
java之this关键字
深入理解Java中this关键字的使用
Java提供了一个this关键字,this关键字总是指向调用该方法的对象。根据this出现的位置的不同,this作为对象的默认引用有两种情形。
本人秃顶程序员
2019/04/17
2.5K0
深入理解Java中this关键字的使用
Java基础:五、this关键字、static含义(4)
如果只有一个peel()方法,如何知道是被a还是b所调用的呢?因为编译器会把“所操作对象的引用”作为第一次参数传递给peel()。所以上述两个方法的调用就变成了这样:
桑鱼
2020/03/17
3240
Java之路:this关键字的用法
最经常使用this关键字的情况,是在对象的一个属性被方法或构造器的参数屏蔽时,需要调用这个被屏蔽的属性,如下:
全栈程序员站长
2022/07/02
2030
Java之路:this关键字的用法
Java中this和super的用法总结【转】
这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~
ZhangXianSheng
2019/07/26
1.1K0
java的this关键字理解
1、java提供了一个this关键字,this关键字总是指向调用该方法的对象。根据this出现位置的不同,this作为对象的默认引用有两种情形。 a)、构造器中引用该构造器正在初始化的对象。(this总是引用该构造器正在初始化的对象。比如,局部变量和全局变量重名,this总是引用构造器的局部变量)。 b)、在方法中引用调用该方法的对象。 this关键字最大的作用就是让类中一个方法,访问该类的另一个方法或者实例变量。(java允许对象的一个成员直接调用另一个成员,可以省略this前缀。大部分时候,一 个方法访问该类中的定义的其他方法、成员变量时加不加this前缀的效果是完全一样的)。 this可以代表任何对象,当this出现在某个方法体中时,它代表的对象是不确定的,但它的类型是确定的,它所代表的对象只能是当前类。只有当这个方法被调用时,它所 代表的对象才被确定下来。谁在调用这个方法,this就代表谁。 对于static修饰的方法而言,则可以使用类来直接调用该方法,如果在statis修饰的方法中使用this关键字,则这个关键字就无法指向合适的对象。所以,static修饰的方 法中不能使用this引用。由于static修饰的方法不能使用this引用,所以static修饰的方法不能访问不使用static修饰的普通成员,因此java语法规定:静态成员不能 直接访问非静态成员。
别先生
2019/06/05
5210
万字长文详细总结!关于继承、重写与重载、封装、接口的硬核干货
Java语言在面向对象方面的知识点复杂繁琐,但是几乎是每个小伙伴学习编程必须踩的坑,其实,面向对象的底层都是一些计算机底层知识的结合,所以,不注重基础的程序猿,一定不是一个可以走的远的程序猿。那么,今天,我们先逐一地深入了解继承、重载、接口和构造器的知识。
CodeVald
2021/02/01
1K0
Static关键字的使用
用来修饰成员变量和方法,被修饰的成员是属于类的,而不单单是属于某个对象的,也就是说,可以不靠对象来调用。
一只胡说八道的猴子
2020/09/27
4610
Static关键字的使用
相关推荐
[JAVA进阶]一文理解面向对象编程(超详细2w字巨作!)
更多 >
LV.0
这个人很懒,什么都没有留下~
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档