iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >使用This完成的工作有哪些
  • 505
分享到

使用This完成的工作有哪些

2024-04-02 19:04:59 505人浏览 独家记忆
摘要

本篇内容主要讲解“使用This完成的工作有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用This完成的工作有哪些”吧!01、 指向当前对象“三妹,来看下

本篇内容主要讲解“使用This完成的工作有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用This完成的工作有哪些”吧!

01、 指向当前对象

“三妹,来看下面这段代码。”话音刚落,我就在键盘上噼里啪啦一阵敲。

public class WithoutThisStudent {     String name;     int age;      WithoutThisStudent(String name, int age) {         name = name;         age = age;     }      void out() {         System.out.println(name+" " + age);     }      public static void main(String[] args) {         WithoutThisStudent s1 = new WithoutThisStudent("沉默王二", 18);         WithoutThisStudent s2 = new WithoutThisStudent("沉默王三", 16);          s1.out();         s2.out();     } }

“在上面的例子中,构造方法的参数名和实例变量名相同,由于没有使用 this 关键字,所以无法为实例变量赋值。”我抬起右手的食指,指着屏幕上的 name 和  age 对着三妹说。

“来看一下程序的输出结果。”

null 0  null 0

“从结果中可以看得出来,尽管创建对象的时候传递了参数,但实例变量并没有赋值。这是因为如果构造方法中没有使用 this 关键字的话,name 和 age  指向的并不是实例变量而是参数本身。”我把脖子扭向右侧,看着三妹说。

“那怎么解决这个问题呢?哥。”三妹着急地问。

“如果参数名和实例变量名产生了冲突.....”我正准备给出答案,三妹打断了我。

“难道用 this 吗?”三妹脱口而出。

“哇,越来越棒了呀,你。”我感觉三妹在学习 Java 这条道路上逐渐有了自己主动思考的意愿。

“是的,来看加上 this 关键字后的代码。”

安静的屋子里又响起了一阵噼里啪啦的键盘声。

public class WithThisStudent {     String name;     int age;      WithThisStudent(String name, int age) {         this.name = name;         this.age = age;     }      void out() {         System.out.println(name+" " + age);     }      public static void main(String[] args) {         WithThisStudent s1 = new WithThisStudent("沉默王二", 18);         WithThisStudent s2 = new WithThisStudent("沉默王三", 16);          s1.out();         s2.out();     } }

“再来看一下程序的输出结果。”

沉默王二 18 沉默王三 16

“这次,实例变量有值了,在构造方法中,this.xxx  指向的就是实例变量,而不再是参数本身了。”我慢吞吞地说着,“当然了,如果参数名和实例变量名不同的话,就不必使用 this 关键字,但我建议使用 this  关键字,这样的代码更有意义。”

03、调用当前类的方法

“仔细听,三妹,看我敲键盘的速度是不是够快。”

public class InvokeCurrentClaSSMethod {     void method1() {}     void method2() {         method1();     }      public static void main(String[] args) {         new InvokeCurrentClassMethod().method1();     } }

“仔细瞧,三妹,上面这段代码中没有见到 this 关键字吧?”我面带着神秘的微笑,准备给三妹变个魔术。

“确实没有,哥,我确认过了。”

“那接下来,神奇的事情就要发生了。”我突然感觉刘谦附身了。

我快速的在 classes 目录下找到 InvokeCurrentClassMethod.class 文件,然后双击打开(idea 默认会使用  FernFlower 打开字节码文件)。

public class InvokeCurrentClassMethod {     public InvokeCurrentClassMethod() {     }      void method1() {     }      void method2() {         this.method1();     }      public static void main(String[] args) {         (new InvokeCurrentClassMethod()).method1();     } }

“瞪大眼睛仔细瞧,三妹,this 关键字是不是出现了?”

“哇,真的呢,好神奇啊!”三妹为了配合我的演出,也是十二分的卖力。

“我们可以在一个类中使用 this  关键字来调用另外一个方法,如果没有使用的话,编译器会自动帮我们加上。”我对自己深厚的编程功底充满自信,“在源代码中,method2() 在调用  method1() 的时候并没有使用 this 关键字,但通过反编译后的字节码可以看得到。”

04、调用当前类的构造方法

“再来看下面这段代码。”

public class InvokeConstrutor {     InvokeConstrutor() {         System.out.println("hello");     }      InvokeConstrutor(int count) {         this();         System.out.println(count);     }      public static void main(String[] args) {         InvokeConstrutor invokeConstrutor = new InvokeConstrutor(10);     } }

“在有参构造方法 InvokeConstrutor(int count) 中,使用了 this() 来调用无参构造方法  InvokeConstrutor()。”这次,我换成了左手的食指,指着屏幕对三妹说,“this() 可用于调用当前类的构造方法——构造方法可以重用了。”

“来看一下输出结果。”

hello 10

“真的啊,无参构造方法也被调用了,所以程序输出了 hello。”三妹看到输出结果后不假思索地说。

“也可以在无参构造方法中使用 this() 并传递参数来调用有参构造方法。”话音没落,我就在键盘上敲了起来,“来看下面这段代码。”

public class InvokeParamConstrutor {     InvokeParamConstrutor() {         this(10);         System.out.println("hello");     }      InvokeParamConstrutor(int count) {         System.out.println(count);     }      public static void main(String[] args) {         InvokeParamConstrutor invokeConstrutor = new InvokeParamConstrutor();     } }

“再来看一下程序的输出结果。”

10 hello

“不过,需要注意的是,this() 必须放在构造方法的第一行,否则就报错了。”

使用This完成的工作有哪些

05、作为参数在方法中传递

“来看下面这段代码。”

public class ThisAsParam {     void method1(ThisAsParam p) {         System.out.println(p);     }      void method2() {         method1(this);     }      public static void main(String[] args) {         ThisAsParam thisAsParam = new ThisAsParam();         System.out.println(thisAsParam);         thisAsParam.method2();     } }

“this  关键字可以作为参数在方法中传递,此时,它指向的是当前类的对象。”一不小心,半个小时过去了,我感到嗓子冒烟,于是赶紧又喝了一口水,润润嗓子后继续说道。

“来看一下输出结果,你就明白了,三妹。”

com.itwanger.twentyseven.ThisAsParam@77459877 com.itwanger.twentyseven.ThisAsParam@77459877

“method2() 调用了 method1(),并传递了参数 this,method1() 中打印了当前对象的字符串。main() 方法中打印了  thisAsParam 对象的字符串。从输出结果中可以看得出来,两者是同一个对象。”

06、作为参数在构造方法中传递

“继续来看代码。”

public class ThisAsConstrutorParam {     int count = 10;      ThisAsConstrutorParam() {         Data data = new Data(this);         data.out();     }      public static void main(String[] args) {         new ThisAsConstrutorParam();     } }  class Data {     ThisAsConstrutorParam param;     Data(ThisAsConstrutorParam param) {         this.param = param;     }      void out() {         System.out.println(param.count);     } }

“在构造方法 ThisAsConstrutorParam() 中,我们使用 this 关键字作为参数传递给了 Data 对象,它其实指向的就是 new  ThisAsConstrutorParam() 这个对象。”

“this 关键字也可以作为参数在构造方法中传递,它指向的是当前类的对象。当我们需要在多个类中使用一个对象的时候,这非常有用。”

“来看一下输出结果。”

10

07、作为方法的返回值

“需要休息会吗?三妹”

“没事的,哥,我的注意力还是很集中的,你继续讲吧。”

“好的,那来继续看代码。”

public class ThisAsMethodResult {     ThisAsMethodResult getThisAsMethodResult() {         return this;     }          void out() {         System.out.println("hello");     }      public static void main(String[] args) {         new ThisAsMethodResult().getThisAsMethodResult().out();     } }

“getThisAsMethodResult() 方法返回了 this 关键字,指向的就是 new ThisAsMethodResult()  这个对象,所以可以紧接着调用 out() 方法——达到了链式调用的目的,这也是 this 关键字非常经典的一种用法。”

“链式调用的形式在 javascript 代码更加常见。”为了向三妹证实这一点,我打开了 Jquery源码

“原来这么多链式调用啊!”三妹感叹到。

“是的。”我点点头,然后指着 getThisAsMethodResult() 方法的返回值对三妹说,“需要注意的是,this  关键字作为方法的返回值的时候,方法的返回类型为类的类型。”

“来看一下输出结果。”

hello

“那么,关于 this 关键字的介绍,就到此为止了。”我活动了一下僵硬的脖子后,对三妹说,“如果你学习劲头还可以的话,我们顺带把 super  关键字捎带着过一下,怎么样?”

“不用了吧,听说 super 关键字更简单,我自己看看就行了,不用你讲了!”

“不不不,三妹啊,你得假装听一下,不然我怎么向读者们交差。”

“噢噢噢噢。”三妹意味深长地笑了。

08、super 关键字

“super 关键字的用法主要有三种。”

  • 指向父类对象;

  • 调用父类的方法;

  • super() 可以调用父类的构造方法。

“其实和 this 有些相似,只不过用意不大相同。”我端起水瓶,咕咚咕咚又喝了几大口,好渴。“每当创建一个子类对象的时候,也会隐式的创建父类对象,由  super 关键字引用。”

“如果父类和子类拥有同样名称的字段,super 关键字可以用来访问父类的同名字段。”

“来看下面这段代码。”

public class ReferParentField {     public static void main(String[] args) {         new Dog().printColor();     } }  class Animal {     String color = "白色"; }  class Dog extends Animal {     String color = "黑色";      void printColor() {         System.out.println(color);         System.out.println(super.color);     } }

“父类 Animal 中有一个名为 color 的字段,子类 Dog 中也有一个名为 color 的字段,子类的 printColor() 方法中,通过  super 关键字可以访问父类的 color。”

“来看一下输出结果。”

黑色 白色

“当子类和父类的方法名相同时,可以使用 super 关键字来调用父类的方法。换句话说,super 关键字可以用于方法重写时访问到父类的方法。”

public class ReferParentMethod {     public static void main(String[] args) {         new Dog().work();     } }  class Animal {     void eat() {         System.out.println("吃...");     } }  class Dog extends Animal {     @Override     void eat() {         System.out.println("吃...");     }      void bark() {         System.out.println("汪汪汪...");     }      void work() {         super.eat();         bark();     } }

“瞧,三妹。父类 Animal 和子类 Dog 中都有一个名为 eat() 的方法,通过 super.eat() 可以访问到父类的 eat()  方法。”

等三妹在自我消化的时候,我在键盘上又敲完了一串代码。

public class ReferParentConstructor {     public static void main(String[] args) {         new Dog();     } }  class Animal {     Animal(){         System.out.println("动物来了");     } }  class Dog extends Animal {     Dog() {         super();         System.out.println("狗狗来了");     } }

“子类 Dog 的构造方法中,第一行代码为 super(),它就是用来调用父类的构造方法的。”

“来看一下输出结果。”

动物来了 狗狗来了

“当然了,在默认情况下,super() 是可以省略的,编译器会主动去调用父类的构造方法。也就是说,子类即使不使用 super()  主动调用父类的构造方法,父类的构造方法仍然会先执行。”

public class ReferParentConstructor {     public static void main(String[] args) {         new Dog();     } }  class Animal {     Animal(){         System.out.println("动物来了");     } }  class Dog extends Animal {     Dog() {         System.out.println("狗狗来了");     } }

“输出结果和之前一样。”

动物来了 狗狗来了

“super() 也可以用来调用父类的有参构造方法,这样可以提高代码的可重用性。”

class Person {     int id;     String name;      Person(int id, String name) {         this.id = id;         this.name = name;     } }  class Emp extends Person {     float salary;      Emp(int id, String name, float salary) {         super(id, name);         this.salary = salary;     }      void display() {         System.out.println(id + " " + name + " " + salary);     } }  public class CallParentParamConstrutor {     public static void main(String[] args) {         new Emp(1, "沉默王二", 20000f).display();     } }

“Emp 类继承了 Person 类,也就继承了 id 和 name 字段,当在 Emp 中新增了 salary 字段后,构造方法中就可以使用  super(id, name) 来调用父类的有参构造方法。”

“来看一下输出结果。”

1 沉默王二 20000.0

到此,相信大家对“使用This完成的工作有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 使用This完成的工作有哪些

本文链接: https://www.lsjlt.com/news/84179.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用This完成的工作有哪些
    本篇内容主要讲解“使用This完成的工作有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用This完成的工作有哪些”吧!01、 指向当前对象“三妹,来看下...
    99+
    2024-04-02
  • JavaScript中this的使用场景有哪些
    本篇文章给大家分享的是有关JavaScript中this的使用场景有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。JavaScript是什么JavaScript是一种直译式...
    99+
    2023-06-14
  • CSS3如何使用属性选择器完成JavaScript的工作
    这篇文章主要介绍了CSS3如何使用属性选择器完成JavaScript的工作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。CSS3除了引入动画...
    99+
    2024-04-02
  • Git的工作流有哪些
    本篇内容主要讲解“Git的工作流有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Git的工作流有哪些”吧!在讲 Git Flow 之前,我们先讲讲别的东西什么是版本?版是指印刷时的版,本就是...
    99+
    2023-07-05
  • Java this关键字的使用方法有哪些
    这篇文章主要介绍“Java this关键字的使用方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java this关键字的使用方法有哪些”文章能帮助大家解决问题。Boy类...
    99+
    2023-06-26
  • 如何利用python自动完成工作
    如何利用python自动完成工作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。没有什么能比学以致用让学习变得更有动力的了。不知道大家在工作中有没有一些工作需要重复的点击鼠标,因...
    99+
    2023-06-02
  • 使用SDLocalize实现高效完成iOS多语言工作
    SDLocalize 该方案最大特点是对旧代码几乎没有较多修改就可以完成从单语言项目修改为多语言的项目。并支持XIB的控件本地化,无需创建不同语言版本的XIB文件。 SDLocali...
    99+
    2022-11-13
    IOS多国语言Localize方法 iOS 项目多语言配置 SDLocalize的使用
  • 工作簿和工作表的区别有哪些
    工作簿和工作表的区别是:1、工作簿是 Excel 文件的顶层容器,可以将它看作是一个文件夹或一个容器,用于存储一个或多个工作表;2、工作表是工作簿中的一个单独的电子表格页面,用于进行数据输入、计算、分析和可视化。本教程操作系统:Window...
    99+
    2023-08-16
  • java常用工作流有哪些
    Java常用的工作流有以下几种:1. Activiti:Activiti是一个轻量级的工作流引擎,用于执行业务流程。它完全符合BPM...
    99+
    2023-08-31
    java
  • MySQL中explain工具的作用有哪些
    MySQL中explain工具主要有以下几个作用: 分析查询语句的执行计划:通过使用explain工具,可以查看MySQL对于给...
    99+
    2024-04-09
    MySQL explain
  • 常用的golang工作流库有哪些
    常用的Golang工作流库有以下几个: Cadence:Cadence是Uber开源的一个分布式、可扩展的工作流引擎。它提供了强...
    99+
    2023-10-25
    golang
  • javascript中有哪些this用法
    本篇内容介绍了“javascript中有哪些this用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!javascript中this用法:1...
    99+
    2023-06-14
  • cdn的工作方式有哪些
    cdn的工作方式有:躲开互联网上影响数据传输能力的问题,使数据传输速度更快、更稳定。通过在网络各处放置节点服务器所构成的一层智能虚拟网络,cdn系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请...
    99+
    2024-04-02
  • 使用ThreadLocal的作用有哪些
    本篇文章为大家展示了使用ThreadLocal的作用有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ThreadLocal,直译为“线程本地”或“本地线程”,如果你真的这么认为,那就错了!其实,...
    99+
    2023-05-31
    threadlocal
  • Git的工作流程有哪些
    本篇内容主要讲解“Git的工作流程有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Git的工作流程有哪些”吧!一、Git的基本概念在深入讨论Git的工作流程之前,我们先了解一些Git的基本概...
    99+
    2023-07-05
  • 工作中常用的Linux命令有哪些
    这篇文章主要介绍了工作中常用的Linux命令有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1)查看CPU情况cat /proc/cpuinfo |g...
    99+
    2023-06-27
  • windows无法完成配置的原因有哪些
    Windows无法完成配置的原因可能有以下几种: 硬件或设备驱动问题:某些硬件设备的驱动程序可能不兼容或过时,导致Windows...
    99+
    2023-10-25
    windows
  • C#调用第三方工具完成FTP操作
    一、FileZilla Filezilla分为client和server。其中FileZilla Server是Windows平台下一个小巧的第三方FTP服务器软件,系统资源也占用非...
    99+
    2024-04-02
  • java this关键字的使用有哪些注意事项
    这篇文章主要介绍“java this关键字的使用有哪些注意事项”,在日常操作中,相信很多人在java this关键字的使用有哪些注意事项问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java this关键字的...
    99+
    2023-06-30
  • 有哪些使用Vue.set的副作用
    本篇内容主要讲解“有哪些使用Vue.set的副作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些使用Vue.set的副作用”吧!Vue虽然用挺久了,还是会...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作