合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
### [在构造器中调用构造器](https://lingcoder.gitee.io/onjava8/#/book/06-Housekeeping?id=%e5%9c%a8%e6%9e%84%e9%80%a0%e5%99%a8%e4%b8%ad%e8%b0%83%e7%94%a8%e6%9e%84%e9%80%a0%e5%99%a8) 当你在一个类中写了多个构造器,有时你想在一个构造器中调用另一个构造器来避免代码重复。你通过**this**关键字实现这样的调用。 通常当你说**this**,意味着"这个对象"或"当前对象",它本身生成对当前对象的引用。在一个构造器中,当你给**this**一个参数列表时,它是另一层意思。它通过最直接的方式显式地调用匹配参数列表的构造器: ~~~ // housekeeping/Flower.java // Calling constructors with "this" public class Flower { int petalCount = 0; String s = "initial value"; Flower(int petals) { petalCount = petals; System.out.println("Constructor w/ int arg only, petalCount = " + petalCount); } Flower(String ss) { System.out.println("Constructor w/ string arg only, s = " + ss); s = ss; } Flower(String s, int petals) { this(petals); //- this(s); // Can't call two! this.s = s; // Another use of "this" System.out.println("String & int args"); } Flower() { this("hi", 47); System.out.println("no-arg constructor"); } void printPetalCount() { //- this(11); // Not inside constructor! System.out.println("petalCount = " + petalCount + " s = " + s); } public static void main(String[] args) { Flower x = new Flower(); x.printPetalCount(); } } ~~~ 输出: ~~~ Constructor w/ int arg only, petalCount = 47 String & int args no-arg constructor petalCount = 47 s = hi ~~~ 从构造器`Flower(String s, int petals)`可以看出,其中只能通过**this**调用一次构造器。另外,必须首先调用构造器,否则编译器会报错。这个例子同样展示了**this**的另一个用法。参数列表中的变量名**s**和成员变量名**s**相同,会引起混淆。你可以通过`this.s`表明你指的是成员变量**s**,从而避免重复。你经常会在 Java 代码中看到这种用法,同时本书中也会多次出现这种写法。在`printPetalCount()`方法中,编译器不允许你在一个构造器之外的方法里调用构造器。