2016-09-16 74 views
0

我最近纔開始學習java,遇到了一個問題。我通過類構造函數創建了一些對象,並且我想在不同的類中使用這些聲明的對象。對象的內容通過變量設置。我可以在不聲明對象的情況下使用不同類中的聲明對象嗎?

因此,一個簡單的解決辦法是通過做(就像一個例子)來設置變量爲靜態,然後調用他們在其他類

Originalclass.staticVariable 

,並以此作爲我的參數。

因此可以說我的原始類是Firstclass,我想要創建的對象叫做superObject,而我想要應用在我的對象中的變量叫做variableIneed。如果我要創造我在其他類對象,我會鍵入

Firstclass superObject = new Firstclass(Firstclass.variableIneed); 

這個工作,但我想知道,這將有可能在原來的類來創建對象,然後在不同的使用類?這樣做有什麼好處嗎?

對不起,如果這是一個重複的問題或它不夠具體,這是我的第一篇文章。 :)

如果我的代碼可以幫助回答我的問題,我會很樂意將其解決,但是由於我的代碼很好,我覺得它與提問無關。

+0

看到代碼不會有什麼傷害。 –

+1

曾聽說過吸氣劑? – Stultuske

回答

0

如果你在一個類中創建一個對象,你通常不希望「共享創建的對象」,只需將其設爲static(特別是當你不確定靜態方式時)​​。

不要濫用staticstatic成員實際上屬於這個類本身,而不是一個特定的對象。所以在你開始聲明變量爲static之前,你想考慮它是屬於這個類的屬性嗎?或者它屬於個人客體?

更多更多static變量在所有對象之間共享。 (你只有它的一個副本)。因此,如果您將它與其他許多類分享,那麼它的價值可能會從您「共享」它的類中的任何一個變爲可能,從而使您的類緊密耦合(並且您希望防止這種類)。

除非對象屬於該類,可能它是一個常量(聲明爲final),否則您可能不想通過將其聲明爲static來共享該對象。

這有效,但我想知道,是否有可能在原始類中創建對象,然後在不同的類中使用它?這樣做有什麼好處嗎?

如果我是你,如果我需要與其他類「共享」我的對象,我會通過一個方法(一個getter方法)傳遞它。

〔實施例:

class Car{ 
    private Engine engine; 

    //Constructor not shown 

    //a getter method 
    public getEngine(){ 
     return engine; 
    } 
} 

class Runner{ 
    public static void main(String[] args){ 
     Car c = new Car(); 
     Engine engine = car.getEngine(); //retrieve engine from car (for whatever use) 
    } 
} 
0

您正在使用與構造函數參數相同的類的靜態變量創建Firstclass,這對我沒有任何意義。您可以在Firstclass類中使用該變量而不將其作爲參數,它已經可以訪問它。對於你的主要問題,我認爲你想要的是這樣的:

class Firstclass{ 
    private String someString = ""; 

    public void createString(String myString){ 
    someString = myString; 
    } 

    public String getSomeString(){ 
    return someString; 
    } 
} 

class Original{ 
    public void sometMethod(Firstclass first){ 
    //using someString from 'first' 
    System.out.println(first.getSomeString()); 
    } 
} 
0

我喜歡這個問題,因爲它問「有沒有更好的方法來做到這一點?

這聽起來像你有一種情況,你有一些價值,讓我們假設一個整數,將用於幾個對象。 「我應該複製這個值,還是應該使用相同的值?」是一個重要的問題。

讓我們假設字符串是多個地方使用的東西,並且不會在應用程序的生命週期中發生變化,但您希望靈活地在一個地方更改字符串的內容。例如,如果您正在構建遊戲,則允許用戶使用的人數可能是整個應用程序中使用的整數。一個好的模式是constant。例如:

public interface ApplicationConstants { 
    public static Integer PLAYER_LIVES_COUNT = 3; 
} 

然後需要的常量可以簡單地實現常量接口的任何類:

public class Application implements ApplicationConstants { 

    public static void main(String[] args) { 
     FirstClass firstClass = new FirstClass(PLAYER_LIVES_COUNT); 
     FirstClass superObject = new FirstClass(PLAYER_LIVES_COUNT); 
    } 
} 

這比硬編碼數字3在你的應用程序,因爲你有一個地方,一個更好的模式控制這個數字。沒有「查找和替換」。

如果FirstClass對象本身是一個將在應用程序中使用的對象,該怎麼辦?它有多個屬性,其他類需要在應用程序中訪問。在這種情況下,一個好的模式是singleton pattern

公共final類FirstClassFactory {

private static FirstClass instance = null; 
private FirstClassFactroy() { 
} 

public static synchronized Singleton getInstance() { 
    if (instance == null) { 
     instance = new FirstClass(); 
    } 
    return instance; 
} 

}

然後在你的應用程序,你可以在運行時更改您的Firstclass實例的值,和值將用於正在使用的任何對象更改的Firstclass:

public class Application { 
    public static void main(String[] args) { 
     FirstClass firstClass = FirstClassFactory.getInstance(); 

     firstClass.setPlayerLives(3); 
    } 
} 

如果您的應用程序的另一個類調用FirstClassFactory.getInstance(),就會收到alread實例y將playerLives設置爲3.

最後,假設您有一個用例,需要向FirstClass對象添加更多數據和功能。一個好的模式可能是擴展或wrapper or decorator pattern。例如:

public class LivesManager { 

    private FirstClass firstClass; 
    private String statusMessage = "Number of lives remaining: "; 

    public LivesManager(FirstClass firstClass) { 
     this.firstClass = firstClass; 
    } 

    public void decrementRemainingLives() { 
     --firstClass.getLives(); 
    } 

    public String getLivesMessage() { 
     return statusMessage + firstClass.getLives(); 
    } 
} 

最後要注意的:如在評論中提到的,這是很好的做法,使類變量私有和使用getter和setter方法來訪問的變量。例如:

public class FirstClass { 

    private Integer lives; 

    public FirstClass(Integer lives) { 
     this.lives = lives; 
    } 

    public Integer getLives() { 
     return lives; 
    } 

    public void setLives(Integer lives) { 
     this.lives = lives; 
    } 
} 

希望這會有所幫助,祝你好運!

0

「這個工作,但我想知道,這將有可能在原來的類來創建對象,然後在不同的類中使用它是否有一個有利於做到這一點?「

是的,這是可能的。我將說明它的一個簡單的例子:

A類:

具有在其內定義一個隨機對象(隨機蘭特=新的隨機())。 而且通常getter方法稱爲getRandomizer();

public Random getRandomizer(){ 
    return rand; 
} 

B類:

B類可以實例化類A.

A _object = new A(); 

隨機對象是在類A創建的,但是之後在B類,我們有 實例化類甲現在可以訪問一般的公共方法。

現在,我們可以簡單地通過訪問隨機對象:

_object.getRandomizer(); 

(_object就是我定義一個變量名)。