2015-04-04 73 views
-1

如果我有一個帶有f.e 3類的Java項目,並且認爲在您的第一個類中發生了某些事情,並且現在想要更改第三個類中的值,那麼您該怎麼做!當我有我的第一類,我做出這樣更改其他類的變量

SecondClass mSecondClass =new SecondClass() 
至少在我創造我的第三類

...=New ThirdClass() 

第二類

,然後我的東西第二類的引用。如果我已經實現第二類中的方法,如setValue(int v)我可以從我的第一個類更改第二個類的值,然後執行相同的Form第二個到第三個類,但不應該有一個更簡單的方法?

+0

除非它們是靜態變量,否則不會更改類中的值,您可以在類的實例中更改值。 – 2015-04-04 00:09:17

+0

但是,如果我在我的類聲明一個變量f.e public int mValue = 0;我如何從另一個類訪問這個變量? – 2015-04-04 00:13:07

+0

那麼,你不能從任何地方訪問變量,直到你創建了一個類的實例。 ('new'創建一個實例。) – 2015-04-04 00:14:18

回答

0

是的,可以有一種簡單的方法,直接從FirstClass中更改ThirdClass對象的值。爲什麼你甚至想通過SecondClass進行溝通?你的意思是使用encapsulation?這不是封裝在面向對象編程中的工作方式。封裝是爲了創建所有其他類的數據抽象,而不僅僅是一個(在你的案例FirstClass)。您可以在ThirdClass類中提供這些接口(不是那些interface,但是這些函數setValue),然後讓FirstClass對象也使用這些函數。你可以在你的包中使用你的類,你知道那不是你?其次,如前所述,改變變量的值取決於你想改變的變量。

  1. 靜態變量
  2. 實例變量

如果你想改變一個靜態變量,然後創建一個新的實例並更新值,像這樣

ThirdClass three = new ThirdClass(); 
three.setValue(0); // int v 

否則,如果這是一個靜態字段(變量),

ThirdClass.Value = 0; // public int Value; 「沒有封裝」不好!

如果您有任何關於然後只是簡單的調用類的內部(靜態)函數封裝,

ThirdClass.setValue(0); // int v 
// it also assume you're having 
public static void setValue(int v) { /* code here */ } 

這樣,你更新你的價值觀。你可以考慮給「Understanding class members」一看,它會幫助你理解成員如何對待。

+0

是的,如果我可以,我會跳過第二課並直接從第一課交給第三課。問題是我的第一堂課沒有我的第三堂課。但是,我是否可以在我的第一堂課和第二堂課中創建我的3.班的實例?這將解決問題;這是否意味着我有我的3.object(我的3.Class,我可以從我的第一和第二類訪問這個對象?或者當我創建兩個引用時創建兩個對象?那麼class1中的引用不會訪問相同對象像第二課中的參考資料那樣,我不想要的東西 – 2015-04-04 00:48:14

+0

等等,放鬆一下!只需在你自己的課堂上創建對象的實例,然後就可以創建課堂,對實例沒有限制,只要確保內存已經存在有足夠的空間來容納它們所有的請保持簡單 – 2015-04-04 01:08:11

0

您正試圖查看整個系統並一次控制它。面向對象編程的目的是爲了隱藏你的第三類可能需要做的事情的細節。

這些類必須有一個原因鏈接到對方的原因。假設頭等艙是所有事情都開始的地方。這個類應該有一組清晰的東西,它可以讓用戶從它那裏請求,它應該通過修改它的內部值來實現這些東西,並且要求它內部的任何對象去做一些事情來幫助它。保持這樣的思維方式,這將更有意義。

你的評論者是對的。您需要區分一個類 - 定義對象如何工作的一堆代碼 - 以及運行時獲取和發送消息的特定對象。

在Java對象中,消息實際上是函數調用,我們知道在幕後有一些流程式的流動。忽略這一點。

希望這會有所幫助。

簡而言之 - 考慮將對象的責任委託給對象,以及對事物向對象提出請求的編程方式。

作爲更具體的答案,這裏是一些對象如何交互。

class Train { 
    private Engine engine; 
    private Whistle whistle; 

    public Train() { 
     // these components are part of the train and so 
     // are constructed when it's constructed 
     engine = new Engine(); 
     whistle = new Whistle(); 
    } 

    public void go() { 
     whistle.toot(); 
     engine.start(); 
    } 
} 


class Driver { 
    private Train train; 
    private IPod iPod; 

    public Driver(IPod iPod, Train train) { 
     // the driver may be given any ipod 
     // and any train to drive 
     this.iPod = iPod; 
     this.train = train; 
    } 

    public void drive() { 
     iPod.startMusic(); 
     train.go(); 
    } 
} 

// main method 
IPod iPod = new IPodNano(); 
Train train = new Train(); 

Driver driver = new Driver(iPod, train); 
driver.drive(); 

現在,您將看到如何在運行時以多種不同方式將鏈接在一起的連接對象網絡中分配責任。

+0

你提到的正是我的問題。我開始使用的是C語言,在那裏你有「void main()」,我可以在其中放入我想要的所有東西,程序將完全遵循這個函數。 Java沒有這樣做,這是我從第一個Java教程中獲得的必須提出的。儘管很容易將您的程序看作真實世界的對象,而不像計算機所做的那樣,但計算機的工作方式「更像C」而不像Java。但我正在嘗試習慣它! – 2015-04-04 01:01:04

+0

好吧,經過一小段代碼後,我發現了以下內容。如果我使用f.e創建一個實例「Class3 mClass3 = new Class3()」我將獲得一個新的「自我行動」對象。當你編寫這段代碼時,總會發生這種情況,所以在Class1和Class2中創建一個Class3實例不會解決問題,因爲它們不會引用同一個對象(所有這些創建對象的行爲都是相同的) - for解釋其中之一將被命名爲「自我表現對象nr.1」,另一個「自我行動對象nr.2」 – 2015-04-04 01:39:37

+0

因此,我不知道是否有辦法獲得對已有的Objekt的參考在沒有創建這個對象的類中,但是如果我不得不改變類之間的交互方式(如果我在class2中創建了class1和class3的實例) – 2015-04-04 01:44:00

0

閱讀「理解班級成員」的鏈接後,我終於明白了爲什麼你可以在變量或方法之前寫上「static」,它也解決了我的問題。謝謝大家的幫助!

+1

如果靜態解決了你的問題,那麼你做錯了 – 2015-04-06 06:46:06

+0

當我使用靜態的時候,我做錯了什麼?因爲它適用於我!要改變一個靜態變量我寫了類似「Class3.setValue(x)」的東西,我可以在任何地方寫出它,不必關心是否在類中更改了值的類中有一個類的實例。要實現這個功能,讓我困惑的是我在某個地方變紅「來改變你必須擁有的價值在變量之前「rite'violatitle'」。 – 2015-04-06 16:02:31

+0

靜力學就像全局變量一樣 - 如果你正在用黑客的方式進入一個類的靜態狀態來將事物聯繫在一起,那麼你就錯過了這一點。有多線程時使用易失性。說實話,Constantin,你可能需要繼續閱讀Java和OO的入門書,因爲這不是學習一些真實基礎知識的最好方法。但是,本着解釋的精神,請參閱上面對我的回答的編輯。 – 2015-04-06 19:52:04