![](/img/trans.png)
[英]Calling a synchronized method from a new thread created inside another synchronized method of the same class in Java
[英]Calling a method inside another method in same class
在他的“Thinking In Java,4th Ed。”中的第428頁(關於類型信息的章節)中,Bruce Eckel有以下示例:
public class Staff extends ArrayList<Position> {
public void add(String title, Person person) {
add(new Position(title, person));
}
/* rest of code snipped */
也許我有點累,但我看不出add()方法中add()的調用是如何工作的。 我一直認為它應該有一個引用,或者是一個靜態方法(我在ArrayList或List中找不到靜態add())。 我錯過了什么?
我剛剛為自己測試過,發現這個有效:
// Test2.java
public class Test2 {
public void testMethod() {
testMethod2();
}
public void testMethod2() {
System.out.println("Here");
}
public static void main(String[] args) {
Test2 t = new Test2();
t.testMethod();
}
}
Java隱式地假定對這樣調用的方法的當前對象的引用。 所以
// Test2.java
public class Test2 {
public void testMethod() {
testMethod2();
}
// ...
}
完全一樣
// Test2.java
public class Test2 {
public void testMethod() {
this.testMethod2();
}
// ...
}
我更喜歡第二個版本,以便更清楚地了解您想要做什么。
它不是遞歸,而是超載。 兩個添加方法(您的代碼段中的一個方法,以及您正在擴展的ArrayList提供的方法)不是相同的方法,因為它們是使用不同的參數聲明的。
該add
方法,需要一個String
和一個Person
被調用不同的 add
方法,它接受Position
。 采用Position
那個繼承自ArrayList
類。
由於您的類Staff
擴展了ArrayList<Position>
,因此它自動具有add(Position)
方法。 新的add(String, Person)
方法是專為Staff類編寫的方法。
這只是一個過載。 add
方法來自ArrayList
類。 看看Staff
繼承了它。
遞歸是一種自我調用的方法。 在這種情況下,它是一個遞歸。 但是,在您在方法中設置限制以停止循環(if-condition)之前,它將會超載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.