专栏首页毛利学Python一文秒杀Java中this关键字

一文秒杀Java中this关键字

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

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

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中用法

引用成员变量

表示对当前对象的引用!

/**
 * @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呢?

/**
 * @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这个关键字可以实现类属性的调用,类方法的调用,表示当前对象

初始化年龄: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关键字调用构造器有以下几条规范:

  • 不能在普通方法中调用,只能在构造器中调用。
  • 一个构造器中只能调用一次。
  • 只能在构造器的第一行调用。
/**
 * @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); //调用成功,意味着虽然一个构造器中只能调用一次其它构造器,但却可以通过“一个调一个”的方式调用多个构造器。
    }
}

代码运行如下

调用成功!
1
a=1
2
其实this主要要三种用法:

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

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

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

本文分享自微信公众号 - Python之王(gh_70a22bfa8e3a),作者:小sen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 当年pass到很多扒手的题

    可以看到经过了2次请求,最后在http://datamining.comratings.com/exam3中得到数据,现在注意resquesr中的hearder...

    润森
  • 数据处理基础(二)

    https://blog.csdn.net/weixin_44510615/article/details/103196607

    润森
  • 学习记录——Java读取pptx

    https://time.geekbang.org/course/detail/181-118098

    润森
  • 分享一个关于this对象的编程小技巧,如何使用箭头函数避免this对象混淆?

    以微信小程序举例。小程序的主要语言是js,使用小程序也方便说明我们接下来要讲的问题。

    程序员LIYI
  • bug 回忆录(四)

    @author Ken @time 2020-09-27 21:30:59 @description 转载请备注出处,谢谢

    公众号---人生代码
  • Mybatis深入源码分析之Mapper与接口绑定原理源码分析

    紧接上篇文章:Mybatis深入源码分析之SqlSessionFactoryBuilder源码分析,这里再来分析下,Mapper与接口绑定原理。

    须臾之余
  • 使用物理引擎Box2D设计类愤怒小鸟的击球游戏--基本架构设置

    望月从良
  • TRTC学习之旅(一)--多人聊天室web篇(官方demo)

    大家好,我是刚入坑TRTC的小菜鸡,黑圆圈云豆。因为我的主要技术方向是web,所以我就从基于web开发的TRTC demo进行学习和知识分享。

    黑眼圈云豆
  • HTML5 Canvas炫酷的火焰风暴动画

    越陌度阡
  • .glb格式的模型怎么在three.js中展示

    3D软件中导出的格式一般有.obj 和.glb ,下面是blender 2.8.2 生成模型并在three.js中展示的流程

    tianyawhl

扫码关注云+社区

领取腾讯云代金券