2010-03-31 47 views
4

我正在通過練習來理解Java,基本上我需要將兩個類的功能合併到一個應用程序中。卡住在Java中的對象範圍

雖然我被卡在一個區域 - 跨類的對象的引用。

我所做的是在一個類(test1)中設置了一個gui,並且它在ie中有一個textfield。

chatLine = new JTextField(); 
另一個類(測試2)

,我打算在離開那裏的所有功能,並引用在test1的成立,對各種圖形元素 - 這樣test1.chatLine

我明白這個級別的引用,我通過在測試2級

public static void testpass() { 

     test1.testfield.setText("hello"); 
    } 

我想了解如何實施,雖然在測試2級的更復雜的功能,特別是這個現有的代碼設置測試方法測試這一點;

test1.chatLine.addActionListener(new ActionAdapter() { 
      public void actionPerformed(ActionEvent e) { 
       String s = Game.chatLine.getText(); 
       if (!s.equals("")) { 
        appendToChatBox("OUTGOING: " + s + "\n"); 
        Game.chatLine.selectAll(); 

        // Send the string 
        sendString(s); 
       } 
      } 
     }); 

這是我卡上,如果我應該能夠做到這一點位 - 因爲它是失敗的編譯,可我的actionadapter東西添加到GUI元素多數民衆贊成在test1的坐着,但做這從測試2 - 我想知道如果我試圖做一些不可能的事情。

希望這是有道理的,我很困惑這一點 - 我想了解範圍和引用的工作原理。

理想情況下,我試圖實現的是一個類中有所有主要的東西,gui等,然後在其他類中的所有相關功能,並針對第一類的gui元素與結果等。

任何想法非常感謝。

回答

1

我不清楚chatLine是一個局部變量,一個實例變量還是一個靜態變量。這些東西中的任何一個都可能是你編譯錯誤的來源,你沒有指定 - 錯誤是什麼?

如果它是一個實例或靜態變量,它可以通過將它公開在任何地方使其可見。這並不意味着這是一個好主意。

至少,它應該是私人的,並通過getChatLine()方法公開。

即便如此,這個設計是否正確也存在一些問題,但至少您會在編譯器級別和基本數據封裝級別上做到這一點。

+0

嗨,道歉 - 我意識到它有點含糊,chatline var是公共靜態JTextField chatLine;在test1類中。我將test2中的測試方法推薦給了這個public static void testpass(){} { \t \t \t \t Game.chatLine.setText(「hello」); \t} 它工作,但它的所有test1.chatLine.addActionListener(新的ActionAdapter(),我試圖undertsand - 它可能添加偵聽器從test2類聊天文本字段,而它是坐在test1類中 – ivor 2010-03-31 11:27:55

+0

可以從任何可以訪問chatLine的地方調用chatLine.addActionListener;你可能在其他地方有一個錯誤,如果你提供了編譯器的錯誤信息可能會有所幫助 – Arkku 2010-03-31 12:08:46

+0

這似乎是我得到的這個錯誤指向test1.chatLine.addActionListener(new ActionAdapter(); 線程「main」中的異常java.lang.NullPointerException – ivor 2010-03-31 12:54:56

2

如果您首先可以訪問chatLine,則可以調用其公共方法,包括addActionListener。要直接訪問chatLine,您需要將其設置爲public,並且如果您想使其對該類特定(而不是針對該類的每個實例的不同chatLine),則它需要爲static

但是,請注意,通常不希望公開變量。首先有類和對象的一個​​重要原因是封裝。您可以考慮隱藏類中的實現,將其隱藏起來,只提供更高級別的公共方法來訪問所需的內容,例如不要暴露「原始」JTextField,而是暴露您使用它提供的功能。

1

一般來說,Java中的所有內容都是引用的,但是是原始類型。

所謂的物體的可見性是另一回事:

  • public範圍的會員可見 所有
  • 「套餐友好」的成員(這些 有沒有範圍明確 提到的)是可見全部屬於 屬於同一包
  • protected範圍成員都是 '包裝友好',並可見所有 繼承類對象
  • 最後,private作用域成員是 僅可見對象本身 [對象從相同類可以查看 彼此的私有成員(據 我記憶)]

現在,

  • 一個內部靜態類可以訪問它的 包含類的static成員。
  • A「正常」的內部類(不 靜態改性劑)可以訪問其 封閉類的成員static和 包圍對象的實例 構件 - 即去以及到 匿名內部類。

最後方法的任何鏈/場要求如下是有效的(但醜陋的),只要一個空的鏈「引用」沒有部分:

myObj.getThatObject().somePublicField.doSomthing().activate().someOtherPublicField 

一個建議,雖然沒有申報成員作爲公衆...

+0

儘管這並沒有具體回答這個問題,但我希望你能明白引用...... – Yaneeve 2010-03-31 11:26:25

+0

乾杯,這很有幫助 – ivor 2010-03-31 13:16:49