首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文秒杀Java中this关键字

一文秒杀Java中this关键字

作者头像
润森
发布于 2019-11-24 12:37:49
发布于 2019-11-24 12:37:49
46100
代码可运行
举报
文章被收录于专栏:毛利学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之this关键字
说明:新建一个对象时,根据传的参数的不同(类型或者个数),java会调用相应的构造方法。在构造方法中,通过this(参数),又会调用其它的构造方法。
西西嘛呦
2022/05/10
1500
java之this关键字
一篇文章带你了解this关键字和单例模式
前面的文章给大家介绍了Java诸多基础知识,感兴趣的小伙伴记得前往噢:Java基础入门篇——for循环、Java基础入门篇——While循环、Java基础入门篇——Switch条件语句、Java基础入门篇(七)——结构语句和if语句、Java基础入门篇(六)——Java运算符、Java基础入门篇(五)——Java变量类型的转换和运算符。接下来开始我们今天的内容吧~
Java进阶者
2021/01/22
3080
Java之路:this关键字的用法
最经常使用this关键字的情况,是在对象的一个属性被方法或构造器的参数屏蔽时,需要调用这个被屏蔽的属性,如下:
全栈程序员站长
2022/07/02
2110
Java之路:this关键字的用法
【JavaSE】this 关键字基本使用
4) 访问构造器语法:this(参数列表); 注意只能在构造器中使用(即只能在构造器中访问另外一个构造器, 必须放在第一条语句)
兮动人
2021/12/31
2640
ECMAScript中类与继承详解(Java对比学习)
如果声明一个一个类的时候没有声明构造函数,那么会默认添加一个空的构造函数,构造函数在new实例化一个对象的时候会被调用
coder_koala
2019/07/30
4670
Java基础学习-this关键字
(*******有了this之后,可以将构造方法的参数跟成员变量保持一致*******)
FutureTester
2021/12/19
2560
深入理解Java中this关键字的使用
Java提供了一个this关键字,this关键字总是指向调用该方法的对象。根据this出现的位置的不同,this作为对象的默认引用有两种情形。
本人秃顶程序员
2019/04/17
2.6K0
深入理解Java中this关键字的使用
Java关键词总结
final修饰可以保证安全性,比如数组的长度属性,String类,这些都是final修饰的,保证不可变
闲花手札
2021/08/24
3510
Java系列:关于关键字this和static
在C语言中,我们经常会遇到指针,也常常被指针所困扰,毕竟它经常惹程序员头疼。那么在Java中我们便方便多了,只是因为有了this.
小Bob来啦
2022/01/17
2540
Java系列:关于关键字this和static
[JAVA进阶]一文理解面向对象编程(超详细2w字巨作!)
我们在程序之中要干某种事,需要某种工具来完成,这样更符合人类的思维习惯,编程更简单,更好理解。
钮祜禄.爱因斯晨
2025/07/13
1960
[JAVA进阶]一文理解面向对象编程(超详细2w字巨作!)
【JAVA-Day57】深度解析Java中的this和super关键字:用途、差异和实际应用
标题: “深度解析Java中的this和super关键字:用途、差异和实际应用” 🚀📚🤔🎯🌟⏱️🔄
默 语
2024/11/20
1610
【JAVA-Day57】深度解析Java中的this和super关键字:用途、差异和实际应用
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
5250
【JAVA杂货铺】一文带你走进面向对象编程|构造方法调用 | 代码块分类| 期末复习系列 | (中3)
通过构造对象进行构造方法的调用,对应自己想调用的构造方法,看构造方法的参数个数进行传参.
ImAileen
2024/01/18
1420
【JAVA杂货铺】一文带你走进面向对象编程|构造方法调用 | 代码块分类| 期末复习系列 | (中3)
Java中this和super的用法总结【转】
这几天看到类在继承时会用到this和super,这里就做了一点总结,与各位共同交流,有错误请各位指正~
ZhangXianSheng
2019/07/26
1.1K0
万字长文详细总结!关于继承、重写与重载、封装、接口的硬核干货
Java语言在面向对象方面的知识点复杂繁琐,但是几乎是每个小伙伴学习编程必须踩的坑,其实,面向对象的底层都是一些计算机底层知识的结合,所以,不注重基础的程序猿,一定不是一个可以走的远的程序猿。那么,今天,我们先逐一地深入了解继承、重载、接口和构造器的知识。
CodeVald
2021/02/01
1K0
Java初始化对象的工具 - 构造器
明确了类与对象的关系后,我们知道:类只是一个定义的结构,用来表述我们想要描述的事物,即具备哪些属性(成员变量),可以产生哪些行为(方法)。那么具体行为的发生,也就是方法的调用要靠对象来完成,同时属性值也要附着在对象上才有意义。创建对象的过程被叫做类的实例化,或者称为对象的初始化,在这个过程中需要使用的就是new关键字和类的构造器。
一头小山猪
2020/04/08
1K0
Java初始化对象的工具 - 构造器
【JAVA杂货铺】一文带你走进面向对象编程的构造方法 | Java| 面向对象编程 | (中)
ImAileen
2024/01/18
1210
【JAVA杂货铺】一文带你走进面向对象编程的构造方法 | Java| 面向对象编程 | (中)
Java基础(八):封装、继承、多态与关键字this、super详解
Java基础(五):流程控制全解析——分支(if/switch)和循环(for/while)的深度指南
Java微观世界
2025/07/17
1250
this关键字与super关键字详解
也就是说当存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量,那是因为Java采取的是就近原则访问的,要解决这个问题就需要使用this关键字;
全栈程序员站长
2022/07/02
8010
this关键字与super关键字详解
Java核心-面向对象(上)
面向对象是 Java的主要特性之一,是一种重要的编程思想。我们都知道面向对象有三大特性(封装、继承和多态),但学习它们之前,首先要做的基本功就是了解什么是类、对象还有方法,以及它们之间的相关操作和分类,内容大概如下。
reload
2024/01/18
3470
Java核心-面向对象(上)
相关推荐
java之this关键字
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档