Re: [問題] 關於final

看板java作者 (snowlike)時間16年前 (2010/02/23 14:02), 編輯推噓4(402)
留言6則, 2人參與, 最新討論串3/3 (看更多)
※ 引述《foxenangel (該來的還是跑不掉阿)》之銘言: : final JLabel messageLabel=new JLabel("Nothing selected."); : ^^^^^ : add(messageLabel, BorderLayout.SOUTH); : tree.addTreeSelectionListener(new TreeSelectionListener() { : public void valueChanged(TreeSelectionEvent e) { : TreePath tp=e.getNewLeadSelectionPath(); : messageLabel.setText("Selected: "+tp.getLastPathComponent() ); : } ^^^^^^^^^^^^ : }); : 我查小螞蟻他說final指定出不可修改的變數,我不了解的是為什麼我把final拿掉的話 : 會出現錯誤訊息:local variable messageLabel is accessed from within inner class : ; needs to declared final : 另外,我想請問addTreeSelectionListener那段裡面的valueChanged這個類別可以拉出來 : 跟addTreeSelectionListener成同一個scope嗎?不太懂為什麼一定要宣告這個類別 : 煩請指教,謝謝! TreeSelectionListener參閱JSE's API是一個interface class 介面實作的方式基本是作 class TSL implemets TreeSelectionListener { //標註這是做覆寫不容易犯錯字造成新函式 @Override public void valueChanged(TreeSelectionEvent arg0) { .... } } 然後addTreeSelectionListener()加入實作過的介面這樣子 所以可以如此寫作addTreeSelectionListener(new TSL()); 多個名稱的話就是TSL tsl=new TSL();addTreeSelectionListener(tsl); 匿名的話可以少些設立的變數名稱,簡單的使用一個{}來實作內容 addTreeSelectionListener(new TreeSelectionListener() { private int newValue //一樣可以設立新變數 public void newFunction //或新函式 @Override public void valueChanged(TreeSelectionEvent arg0) { .... } }) 這是由於值改變的時候系統會調用valueChanged()所以才去override這個方法 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.33.184.50

02/23 14:14, , 1F
差點忘記listener是介面,看到inner class就頭昏了
02/23 14:14, 1F

02/23 14:17, , 2F
那為什麼原本的程式碼中不用加上implement?
02/23 14:17, 2F

02/23 14:25, , 3F
不使用新變數,implements沒有主詞就不用,所以才稱匿名
02/23 14:25, 3F

02/23 14:26, , 4F
所以valueChanged是匿名的方法?
02/23 14:26, 4F

02/23 14:30, , 5F
也可以這麼說..像是newFunction的部份就沒辦法由外部調用
02/23 14:30, 5F

02/23 14:31, , 6F
上了一課!! 終於搞懂了 謝謝!!
02/23 14:31, 6F
文章代碼(AID): #1BWs-Fm- (java)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
文章代碼(AID): #1BWs-Fm- (java)