网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1178|回复: 0
打印 上一主题 下一主题

[后端开发] 学了这么久Java还不会用This?

[复制链接]

271

主题

284

帖子

1243

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1243

最佳新人活跃会员热心会员突出贡献优秀版主

跳转到指定楼层
楼主
发表于 2020-6-10 17:38:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
01、消除字段歧义
我敢赌一毛钱,所有的读者,不管男女老少,应该都知道这种用法,毕竟写构造方法的时候经常用啊。谁要不知道,过来,我给你发一毛钱红包,只要你脸皮够厚。
public class Writer {    private int age;    private String name;    public Writer(int age, String name) {        this.age = age;        this.name = name;    }}
Writer 类有两个成员变量,分别是 age 和 name,在使用有参构造函数的时候,如果参数名和成员变量的名字相同,就需要使用 this 关键字消除歧义:this.age 是指成员变量,age 是指构造方法的参数。
02、引用类的其他构造方法
当一个类的构造方法有多个,并且它们之间有交集的话,就可以使用 this 关键字来调用不同的构造方法,从而减少代码量。
比如说,在无参构造方法中调用有参构造方法:
public class Writer {    private int age;    private String name;    public Writer(int age, String name) {        this.age = age;        this.name = name;    }    public Writer() {        this(18, "沉默王二");    }}
也可以在有参构造方法中调用无参构造方法:
public class Writer {    private int age;    private String name;    public Writer(int age, String name) {        this();        this.age = age;        this.name = name;    }    public Writer() {    }}
需要注意的是,this() 必须是构造方法中的第一条语句,否则就会报错。

03、作为参数传递
在下例中,有一个无参的构造方法,里面调用了 print() 方法,参数只有一个 this 关键字。
public class ThisTest {    public ThisTest() {        print(this);    }    private void print(ThisTest thisTest) {        System.out.println("print " +thisTest);    }    public static void main(String[] args) {        ThisTest test = new ThisTest();        System.out.println("main " + test);    }}
来打印看一下结果:
print com.cmower.baeldung.this1.ThisTest@573fd745main com.cmower.baeldung.this1.ThisTest@573fd745
从结果中可以看得出来,this 就是我们在 main() 方法中使用 new 关键字创建的 ThisTest 对象。
04、链式调用
学过 JavaScript,或者 jQuery 的读者可能对链式调用比较熟悉,类似于 a.b().c().d(),仿佛能无穷无尽调用下去。
在 Java 中,对应的专有名词叫 Builder 模式,来看一个示例。
public class Writer {    private int age;    private String name;    private String bookName;    public Writer(WriterBuilder builder) {        this.age = builder.age;        this.name = builder.name;        this.bookName = builder.bookName;    }    public static class WriterBuilder {        public String bookName;        private int age;        private String name;        public WriterBuilder(int age, String name) {            this.age = age;            this.name = name;        }        public WriterBuilder writeBook(String bookName) {            this.bookName = bookName;            return this;        }        public Writer build() {            return new Writer(this);        }    }}
Writer 类有三个成员变量,分别是 age、name 和 bookName,还有它们仨对应的一个构造方法,参数是一个内部静态类 WriterBuilder。
内部类 WriterBuilder 也有三个成员变量,和 Writer 类一致,不同的是,WriterBuilder 类的构造方法里面只有 age 和 name 赋值了,另外一个成员变量 bookName 通过单独的方法 writeBook() 来赋值,注意,该方法的返回类型是 WriterBuilder,最后使用 return 返回了 this 关键字。
最后的 build() 方法用来创建一个 Writer 对象,参数为 this 关键字,也就是当前的 WriterBuilder 对象。
这时候,创建 Writer 对象就可以通过链式调用的方式。
Writer writer = new Writer.WriterBuilder(18,"沉默王二")                .writeBook("《Web全栈开发进阶之路》")                .build();
05、在内部类中访问外部类对象
说实话,自从 Java 8 的函数式编程出现后,就很少用到 this 在内部类中访问外部类对象了。来看一个示例:
public class ThisInnerTest {    private String name;    class InnerClass {        public InnerClass() {            ThisInnerTest thisInnerTest = ThisInnerTest.this;            String outerName = thisInnerTest.name;        }    }}
在内部类 InnerClass 的构造方法中,通过外部类.this 可以获取到外部类对象,然后就可以使用外部类的成员变量了,比如说 name。
06、关于 super
本来想单独写一篇 super 关键字的,但可写的内容不多。本质上,this 关键字和 super 关键字有蛮多相似之处的,所以,就放在 this 这篇文章的末尾说一说吧。
简而言之,super 关键字就是用来访问父类的。
先来看父类:
public class SuperBase {    String message = "父类";    public SuperBase(String message) {        this.message = message;    }    public SuperBase() {    }    public void printMessage() {        System.out.println(message);    }}
再来看子类:
public class SuperSub extends SuperBase {    String message = "子类";    public SuperSub(String message) {        super(message);    }    public SuperSub() {        super.printMessage();        printMessage();    }    public void getParentMessage() {        System.out.println(super.message);    }    public void printMessage() {        System.out.println(message);    }}
1)super 关键字可用于访问父类的构造方法
你看,子类可以通过 super(message) 来调用父类的构造方法。现在来新建一个 SuperSub 对象,看看输出结果是什么:
new 关键字在调用构造方法创建子类对象的时候,会通过 super 关键字初始化父类的 message,所以此此时父类的 message 会输出“子类的message”。
2)super 关键字可以访问父类的变量
上述例子中的 SuperSub 类中就有,getParentMessage() 通过 super.message 方法父类的同名成员变量 message。
3)当方法发生重写时,super 关键字可以访问父类的同名方法
上述例子中的 SuperSub 类中就有,无参的构造方法 SuperSub() 中就使用 super.printMessage() 调用了父类的同名方法。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-23 04:07 , Processed in 0.033477 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表