2012-10-10 63 views
0

我有一個代碼:誰叫了一個方法?

abstract void run(); 

public void start() { 
    Logger log = Logger.getLogger(Test.class.getName()); 
    try { 
     run(); 
    } catch (Exception e) { 
     log.warn(e.getMessage()); 
    }  
} 

我能夠例如執行start()

object1.start(); 
object2.start(); 
object3.start(); 

如何檢查在start()哪個對象(名對象)開始的方法start()

+0

[this keyword](http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html)引用當前實例那叫你的方法..你可以玩它.. –

+0

嘗試使用this.className();這應該適合你。 –

+1

@Rohit,'this'僅指當前實例。他的方法是公開的,它可以被稱爲外部。您的評論完全不符合標準。 –

回答

2

有沒有自動的方式來做到這一點; Java中的對象不必具有名稱。

一種解決方案是:

public void start(String name) { 
    Logger log = Logger.getLogger(name); 
} 

這工作,因爲一個記錄器可以有任意名稱。許多記錄器使用該類的名稱,因爲這是一種簡單的+自動方式來命名記錄器。但這不是必要的。

2

假設你正在試圖獲得「object1」,「對象2」和「object3」作爲名稱(目前尚不清楚),有兩件事情你應該知道:

  • 這些都是變量,而不是對象。具有不同名稱的多個變量可以引用同一個對象。
  • 對象通常不會有名稱 - 您可以添加自己的name字段,但您必須明確執行此操作。
1

如果您的意思是得到字符串"object1":這在邏輯上不明智。這是一個變量的名稱不是它的對象它指的是,並且在運行時不存在。實際上,編譯器可能會將完全優化掉。此外,它是不明確的:

考慮下面的代碼:

object2 = object1; 
object2.start(); 

應該在實例現在看到的名字"object1""object2"都是

如果您希望您的對象具有「名稱」,請使用自我管理的字段進行存儲。

object1.setName("object2"); 

或做同樣在構造函數:

MyObject object1 = new MyObject("object1"); 
0

你不能在運行時的變量的名稱,如果這是你想要的

我會在start()方法外啓動Log

Logger log = Logger.getLogger(object1); 
object1.start(log); 

那麼你的start()方法如下所示:

public void start(Logger log) {  
    try { 
     run(); 
    } catch (Exception e) { 
     log.warn(e.getMessage()); 
    }  
} 

或者,如果你不能改變的start()簽名:

Logger log; 
public void setLogger(Logger log){ 
    this.log = log; 
} 
public void start() {  
    try { 
     run(); 
    } catch (Exception e) { 
     log.warn(e.getMessage()); 
    }  
} 

然後:

Logger log = Logger.getLogger(object1); 
object1.setLogger(log); 
object1.start();