“5.3 默认构造器”,默认构造器就是无参构造器,它是没有形式参数的,作用你可以理解为创建一个”默认对象”。如果你的类中没有构造器,编译器会自动帮你创建一个默认构造器。例如:
classBird {} publicclassDefaultConstructor { publicstaticvoidmain(String[] args) { Birdb=newBird(); // Default! } }
///:~
new Bird() 创建了一个新对象,并调用默认构造器,即使你没有明确定义它。但是如果编译器不帮你自动创建它的话,就没有方法可调用,就无法创建对象了。如果你已经定义了一个构造器,编译器就不会帮你自动创建默认构造器。哪怕你定义的构造器就是无参构造器,那也是你自己定义的,你可以理解为你自己定义的无参构造器就是你替编译器做了创建默认构造器的工作。例如:
classBird2 { Bird2(inti) {} Bird2(doubled) {} } publicclassNoSynthesis { publicstaticvoidmain(String[] args) { //! Bird2 b = new Bird2(); // No default Bird2b2=newBird2(1); Bird2b3=newBird2(1.0); } }
///:~
如果你使用new Bird2() 创建对象,编译器就会报错:没有找到匹配的构造器。
“5.4 this关键字”这一小节主要介绍了this关键字的作用。this关键字只能在类的方法内部使用,表示对“调用方法的那个对象”的引用。如果在方法内部调用同一个类的另一个方法,就不必使用this,但是往往我们会使用this.的形式去调用,可能习惯使然。所以什么情况下在视必须使用this的呢,答案是只有当需要明确指出对当前对象的引用时,才需要使用this关键字。例如,当需要返回当前对象的引用时,就常常在return语句里这样写:
publicclassLeaf { inti=0; Leafincrement() { i++; returnthis; } voidprint() { System.out.println("i = "+i); } publicstaticvoidmain(String[] args) { Leafx=newLeaf(); x.increment().increment().increment().print(); } }
/* Output:
i = 3
*///:~
this关键字对于将当前一下传递给其他方法时也很有用:
classPerson { publicvoideat(Appleapple) { Applepeeled=apple.getPeeled(); System.out.println("Yummy"); } } classPeeler { staticApplepeel(Appleapple) { // ... remove peel returnapple; // Peeled } } classApple { ApplegetPeeled() { returnPeeler.peel(this); } } publicclassPassingThis { publicstaticvoidmain(String[] args) { newPerson().eat(newApple()); } }
/* Output:
Yummy
*///:~
这种写法以后在编程技巧和设计模式以及开源框架中经常见到,也不能说是高级的用法,算是一种设计方法吧。
“5.4.1 在构造器中调用构造器”这一小节提到了this在构造器中调用其他构造器的用法,此时的this就相当于类的名字。这种用法往往在给一些有参构造器赋予默认值的时候经常用到:
importstaticnet.mindview.util.Print.*; publicclassFlower { intpetalCount=0; Strings="initial value"; Flower(intpetals) { petalCount=petals; print("Constructor w/ int arg only, petalCount= "+petalCount); } Flower(Stringss) { print("Constructor w/ String arg only, s = "+ss); s=ss; } Flower(Strings, intpetals) { this(petals); //! this(s); // Can’t call two! this.s=s; // Another use of "this" print("String & int args"); } Flower() { this("hi", 47); print("default constructor (no args)"); } voidprintPetalCount() { //! this(11); // Not inside non-constructor! print("petalCount = "+petalCount+" s = "+s); } publicstaticvoidmain(String[] args) { Flowerx=newFlower(); x.printPetalCount(); } }
/* Output:
Constructor w/ int arg only, petalCount= 47
String & int args
default constructor (no args)
petalCount = 47 s = hi
*///:~
this(“hi”,47)是在Flower()无参构造器中使用的,相当于调用了Flower(“hi”,47)。
“5.4.2 static的含义”,在了解了this关键字之后,就能更全面的了解static(静态)方法的含义了。static方法就是没有this的方法,属于类的方法。可以直接使用类名加点去调用一个类的静态方法,不需要借助对象,而且是属于全局的。