簡體   English   中英

如何從其他類調用變量和方法?

[英]How do I call variables and methods from other classes?

我正在做作業,我需要在一個類“ coinDispenser”中創建方法,並在主類“ HW1”中調用它們

不過,我不確定這是如何工作的。 這是我在coinDispenser.java中的代碼示例:

private int numNickles = 0;

然后稍后在HW1.java中調用該方法:

System.out.println("There are "+numNickles+" nickles in the machine.")

但是我總是收到錯誤“ numNickles無法解析為變量”,並且它希望我在HW1類中創建整數。

如何在HW1.java中調用整數? 將整數更改為public int類型沒有任何區別。

好吧,您絕對不能從一個類訪問另一個類的私有成員變量。 為了訪問其他類中的公共成員,您需要創建一個靜態變量並按類引用它,或者創建一個CoinDispenser實例,然后引用該變量。

因此,在CoinDispenser中,它將是:

public int numNickles = 0;

在HW1中,您將擁有:

CoinDispenser cd = new CoinDispenser();
System.out.println("There are "+ cd.numNickles + " nickles in the machine.")

如果您做了一個靜態變量,您也可以這樣做:

CoinDispenser.numNickles

要調用另一個類中的方法,您有兩個選擇。

選項1:

您可以將方法聲明為static ,這意味着不需要在對象上調用該方法。

注意:如果采用這種方式(不應該這樣做;使用靜態方法通常是不好的),則必須將numNickles聲明為static ,這意味着無論您創建多少個CoinDispenser對象,此字段只有一個實例。

例:

static void methodToCallName(any arguments it takes) {
    //...do some stuff...//
}

選項2:您可以使用包含方法的new關鍵字創建類的實例,然后調用該方法:

例:

// in some method in the HW1 class (Which is a horrible class name, see java conventions)

CoinDispenser dispenser = new CoinDispenser(any parameters here);

coinDispenser.whateverYourMethodIsCalled(any arguments it takes);

面向對象語言中類的整體思想是使單獨的事物保持分離。 當您引用另一個類中定義的變量時,必須告訴程序它在哪里。

我覺得您還沒有真正了解面向對象的含義,因此您應該更多地研究它。 你不能偽造它。 沒有繞過面向對象的方向。 您必須學會愛它。 當然,它會使簡單的事情變得困難,但會使困難的事情變得如此簡單。


對於您問題的第二部分...

請注意,實際上與其他用戶所說的相反, numNickles應該是私有的。

Java最佳實踐主張封裝,這基本上是一個原則,即程序的其他部分應該只能看到它們需要的內容,並且每個類的內部工作都不應暴露給其他類。

您如何實現的? 簡單; 使用訪問器和更改器方法(獲取器和設置器)訪問和修改您的字段。

// Define your field like usual...
private int numNickles = 0;

// ...and add these two methods...
public void setNumNickles(int value) {
    numNickles = value;
}

public int getNumNickles() {
    return numNickles;
}

對於變量來說,這似乎需要做很多工作,但是許多IDE會為您自動執行該過程,從長遠來看,它將使您免受許多令人沮喪的錯誤的困擾。 習慣它,因為Java世界的其余部分都做到了。

如果numNickes在另一個類中,則不能調用它,因為它的作用域是私有的。

如果要訪問私有作用域變量,則必須編寫一個方法將其返回。 該約定通常是

public int getNumNickles(){
    return numNickles;
}

這是設計使然,可以保護您不想公開的變量。

然后,您的輸出將是System.out.println(“機器中有” + myclass.getNumNickles()+“刻痕。”)

或者,您可以將變量公開

public int numNickels;

但是現在,使用該類的任何人都可以讀取和寫入該文件。

您正在嘗試從CoinDispenser類訪問名為numNickles的字段(BTW CoinDispenser是Java類的正確名稱)。 您不能直接訪問HW1類中的字段和方法。 因此,正如MadProgrammer在您的問題下的注釋中所指出的那樣,請按照以下說明進行操作。

在您的HW1.java類中,類似以下內容:

CoinDispenser cd = new CoinDispenser(); 
System.out.println("There are "+cd.getNumNickles()+" nickles in the machine.");

上面的代碼行中的“ cd”是您在CoinDispenser類上的句柄。 使用cd,您可以從使用上述各行的任何類中訪問(通過打點)字段和方法。 此外,如果這些字段和方法是“私有的”,您仍將無法訪問您的CoinDispenser類中的字段和方法。

訪問另一個類中的private字段的標准方法是使用getter方法。

這就像

private int numNickles = 0;
public int getNumNickles () {
   return numNickles;
}

setter方法也很有用

public void setNumNickles (int numNickles) {
   this.numNickles  = numNickles;
}

單擊按鈕,許多IDE(例如Eclipse)將自動為您創建這些方法。

然后可以在CoinDispenser類的實例上調用這些方法。

CoinDispenser coinDispenser = new CoinDispenser ();
coinDispenser.setNumNickles (23);

System.out.println("There are "+ coinDispenser.getNumNickles() + " nickles in the machine.");

Java是一種面向對象的編程語言。 從本質上講,這意味着一切都基於對象的概念。 這些對象是數據結構,以字段方法的形式提供數據。 您提供的每個實現的類都需要一種實例形式,才能實際對其執行操作。

以下示例顯示,當您要創建類的實例時,需要使用new CoinDispenser(100)進行調用。 在這種情況下,類CoinDispenser的構造CoinDispenser需要一個參數,即硬幣數量。 現在要訪問新制作的CoinDispenser的任何字段或方法,您需要使用variable.method()調用該方法,因此在本例中為coinDispenser.getCoins()來檢索我們的書名。

public class CoinDispenser {
    private int coins = 100; // Set the amount of coins

    public int getCoins() {
        return coins;
    }
}

public class HW1 {
    public static void main(String[] args) {
        CoinDispenser coinDispenser = new CoinDispenser(100);
        System.out.println("I have " + coinDispenser.getCoins() + " left.");
    }
}

注意:我們正在使用一種額外的方法getCoins() ,即一個getter,以獲取字段coins的內容。 在此處閱讀有關訪問級別的更多信息。

首先,沒有導致錯誤發生的變量名numNickels。 其次,要訪問coinDispenser類的屬性,您將需要創建該類的對象,即

coinDispenser a=new coinDispenser();

這樣,您就可以訪問類coinDispenser的公共方法。 考慮到屬性numNickles是私有的,您有兩個選擇,即:
1.將numNickles更改為public,然后使用

a.numNickles

2.創建一個公共方法以在coinDispenser類中獲取私有屬性

public int getNumNickles() {return numNickles;}

並使用HW1訪問它

a.getNumNickles()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM