千锋教育-做有情怀、有良心、有品质的职业教育机构

当前位置:首页  >  关于学院  >  技术干货  >  Java技术干货  >  正文

从零开始学Java之让你迷糊的this关键字

来源:千锋教育
作者:qyf
关键词:    方法
2023-03-15
分享

从零开始学Java之让你迷糊的this关键字

  本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

  一. this关键字

  1. 简介

  我们知道,this是”这个“的意思。在java中表示当前类的对象,可以理解成指向对象本身的一个指针。通俗地说就是表示当前类对象”自己“,它是在对象被创建时自动产生的。我们使用this,可以用来调用本类的属性、方法、构造方法。当我们在构造方法中使用this时,this表示的是当前类的成员变量。

  2. 作用

  根据上面的简介,我们可以提取出this关键字的几个核心作用:

  表示当前类对象;

  调用当前类中的属性;

  调用当前类的方法或构造方法。

  二. 代码案例

  接下来老师分别针对以上几种情况,给大家设计几个案例进行讲解。

  1. 代表当前类对象

  所谓代表当前类对象,就是指当我们创建一个类对象时,比如Person p=new Person();p就是一个类对象,我们可以通过p.属性或p.方法的形式来进行调用。但如果我们是在Person类里面调用Person的属性或方法,其实可以直接使用this来替代当前的对象,即this.属性或this.方法。这里的this,就是当前类对象!

  另外一个更常用的场景是在接口回调中。比如某个类的构造方法带有一个接口类型的参数,当前类又实现了该接口,当我们在当前类中调用这个构造方法时,就可以直接传递this作为参数。参考下面的Person代码:

  /**

  * @author 一一哥Sun

  * QQ:2312119590

  * CSDN、掘金、知乎找我哦

  */

  public class Person implements Sport {

  // 姓名

  public String name;

  java

  // 年龄

  private int age;

  //定义带有3个参数的构造方法,第3个参数是自定义的Sport接口类型

  public Person(String name, int age, Sport sport) {

  System.out.println("我的名字是:" + name + ",年龄:" + age);

  sport.pingpang();

  }

  @Override

  public void pingpang() {

  System.out.println("我会打乒乓球");

  }

  // 才艺展示

  public void show() {

  //这里的第3个参数,我们就可以直接用this作为参数,代表当前类对象!!!

  Person p = new Person("张继科", 30, this);

  }

  }

  Sport接口代码参考如下:

  /**

  * @author 一一哥Sun

  * QQ:2312119590

  * CSDN、掘金、知乎找我哦

  */

  public interface Sport {

  //打乒乓球

  void pingpang();

  }

  在上面的Person类中,我们定义了带有3个参数的构造方法,其中第3个参数是自定义的Sport接口类型。在show()方法中,我们调用Person的构造方法,当传递第3个参数时,就可以直接用this作为参数传递进去。因为Person类实现了Sport接口,所以Person类也就属于Sport类型,符合第3个参数的类型要求。因为this表示当前类对象,所以我们可以直接用this作为参数。

  当然,这里涉及到了接口的概念和用法,我们还没有学习到。大家先别急,后面老师会专门给大家讲解接口,本案例只是先供大家参考。

  2. 调用类中的属性

  大多数时候,一般的普通方法访问其他方法、成员变量时不必使用this关键字。但如果方法的形参与类中属性的名称相同,我们可以通过“this.属性名”的形式进行区分。

  /**

  * @author 一一哥Sun

  * QQ:2312119590

  * CSDN、掘金、知乎找我哦

  */

  public class Student {

  private String name;

  private int age;

  private String sex;

  public Student(String name, String sex, int age) {

  //方法的形参与属性名相同,可以通过“this.属性名”的形式进行区分

  this.name = name;

  this.sex = sex;

  this.age = age;

  }

  public static void main(String[] args) {

  Student stu=new Student("一一哥", "男", 35);

  System.out.println("name="+stu.name+",sex="+stu.sex+",age="+stu.age);

  }

  }

  在上面的代码中,name、age、sex都是被private修饰的,因此我们不能在类的外部进行直接设置。为了解决这个问题,我们可以给Student类添加一个构造方法,然后在构造方法中传递参数进行修改。我们在 Student类的构造方法中使用this关键字调用name、age 和 sex属性,以此区分方法的形参。这里的this就表示当前对象,this.name=name语句是一个赋值语句。等号左边的this.name是当前对象的成员变量name,等号右边的name表示方法形参接收的数值。

  3. 调用类中的方法

  this关键字的另一个作用,就是让类中一个方法,访问该类里的另一个方法。

  /**

  * @author 一一哥Sun

  * QQ:2312119590

  * CSDN、掘金、知乎找我哦

  */

  public class Computer {

  // 电脑品牌

  private String logo;

  // 播放音频

  public void playSound() {

  System.out.println("播放音频...");

  }

  // 播放视频

  public void playVideo() {

  // 同时播放音频

  this.playSound();

  System.out.println("播放视频...");

  }

  public static void main(String[] args) {

  //静态方法中不能使用非静态成员

  //this.playVideo();

  Computer com=new Computer();

  com.playVideo();

  }

  }

  在上面的代码中,我们在playVideo()方法中调用了playSound()方法,此时就可以通过”this.方法名“的形式进行调用。因为this可以代表任何对象,当this出现在某个方法体中,它所代表的对象是不确定的,但它的类型是确定的,它代表的就是当前类的实例对象。只有当这个方法被调用时,它所代表的对象才被确定下来,谁在调用这个方法,this 就代表谁。

  但是我们不能在带有static关键词的方法中通过this.属性名或this.方法名来引用,这是因为Java语法有规定,静态成员不能直接访问非静态成员。在后面学习static关键字时,老师会再给大家详细讲解这一点!

  4. 调用类的构造方法

  我们也可以使用this关键字,实现对构造方法的调用,此时是通过this()这样的语法格式来实现的。this()括号中可以有参数,如果有参数就是在调用指定的有参构造方法。

  /**

  * @author 一一哥Sun

  * QQ:2312119590

  * CSDN、掘金、知乎找我哦

  */

  public class Computer {

  // 电脑品牌

  private String logo;

  // 电脑颜色

  private String color;

  //无参构造方法

  public Computer() {

  // this(a,b)调用另一个构造方法

  this(null, null);

  }

  //1个参数的构造方法

  public Computer(String logo) {

  // this(a,b)调用另一个构造方法

  this(logo, null);

  }

  //2个参数的构造方法

  public Computer(String logo, String color) {

  System.out.println("logo=" + logo + ",color=" + color);

  }

  public static void main(String[] args) {

  Computer com=new Computer("苹果");

  }

  }

  大家注意,this()格式不能在普通方法中使用,只能在构造方法中使用。而且在构造方法中使用时,必须放在第一条语句!

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

相关推荐

  • springcloud和dubbo的区别是什么? SpringCloud和Dubbo是两个在分布式系统开发中常用的框架,它们有以下几个主要区别:1.生态系统和发展历程:-Dubbo是由阿里巴巴集团开发并开源的,主要在中国的互联网企业中广泛使用,并且有
  • dubbo是什么?有哪些特性?-小王 Dubbo是一个开源的高性能RPC(远程过程调用)框架,由阿里巴巴集团开发并开源。它提供了分布式服务治理的解决方案,旨在简化大规模分布式系统中服务之间的通信和调用。Dubbo的设计目标是提供高性能、透
  • java面试之消息队列mq的实现原理 消息队列(MessageQueue)是一种在应用程序之间传递消息的通信模式。它提供了一种异步的、解耦的方式来实现不同系统、模块或组件之间的通信。消息队列的实现原理可以简要概括如下:1.**消息发布(P
  • java hash 加密字符串,使用 MessageDigest 类 在Java中,可以使用MessageDigest类来进行哈希加密(散列算法)。下面是使用MessageDigest类进行字符串哈希加密的示例:importjava.security.MessageDi
  • java object添加属性怎么实现? 在Java中,一个对象的属性通常是在类的定义中声明的,并通过类的构造函数或方法来进行初始化和设置。但是,如果你想为一个已有的对象动态添加属性,Java并没有直接支持这种操作。然而,你可以使用其他方式来
  • stringbuilder字符串 StringBuilder是一个用于构建和操作字符串的类,通常用于需要频繁拼接和修改字符串的场景,特别是在循环中。在许多编程语言中都有类似于StringBuilder的概念,下面是一个Java语言中使