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 对象,看看输出结果是什么:
SuperSub superSub = new SuperSub("子类的message");
1
new 关键字在调用构造方法创建子类对象的时候,会通过 super 关键字初始化父类的 message,所以此此时父类的 message 会输出“子类的message”。
2)super 关键字可以访问父类的变量
上述例子中的 SuperSub 类中就有,getParentMessage() 通过 super.message 方法父类的同名成员变量 message。
3)当方法发生重写时,super 关键字可以访问父类的同名方法
上述例子中的 SuperSub 类中就有,无参的构造方法 SuperSub() 中就使用 super.printMessage() 调用了父类的同名方法。
07、总结
亲爱的读者朋友,我应该说得很全面了吧?我想小王看到了这篇文章后一定会感谢我的良苦用心的,他毕竟是个积极好学的好同事啊。
如果觉得文章对你有点帮助,请微信搜索「 沉默王二 」第一时间阅读,回复「并发」更有一份阿里大牛重写的 Java 并发编程实战,从此再也不用担心面试官在这方面的刁难了。