2013-10-22 110 views
-1

我是新來的Java refenced並具有調用非靜態方法的問題的Java非靜態方法不能從靜態上下文

這是我的主要

public static void main(String[] args) { 
    Fish f1 = new Fish("Nemo"); 
    Fish f2 = new Fish("Dory"); 
    f2.setNumber(2); 
    Fish m = new Fish("Bruce"); 
    m.setNumber(3); 
    Fish.printAllFish(); 
} 

這是我的魚類

import java.util.ArrayList; 
import java.util.List; 


public class Fish { 
protected String name; 
protected int number; 
protected List<Fish> fishList = new ArrayList<Fish>(); 


public Fish(String in){ 
name = in; 
number = 1; 
fishList.add(this); 
} 




public void printFish(){ 
    System.out.println("the fish called" + name + " is number " + number); 
} 
public void setNumber(int Number){ 
    this.number = number; 
} 
public int getNumber(){ 
return number; 
} 
public String getName(){ 
return name; 
} 
public int getFishNumOf(){ 
    return fishList.size(); 

} 

public void printAllFish(){ 
    int size = this.getFishNumOf(); 
    System.out.println("There are " + size + " fish:"); 
    for (int i = 0; i < size; i++){ 
     String a = getName(); 
     int b = getNumber(); 
     System.out.println("The Fish " + a + " is number " + b); 
    } 
} 
} 

試圖調用printAllFish時,我得到的非靜態的錯誤,我知道我可能做一些新秀的錯誤,但是我纔剛剛開始學習編程之類的東西類,獲取,並將s設置直到迷惑我,任何幫助將非常感激!

回答

1

你需要讓printAllFishgetFishNumOffishList靜態和getFishNumOf之前刪除this關鍵字。然後在for循環中,你必須指定哪個魚獲得了循環的每個迭代的名稱和數量。例如:

for(Fish f : fishList) 
    String a = f.getName(); 
    int b = f.getNumber(); 
    System.out.println("The Fish " + a + " is number " + b); 
} 
+0

非常感謝你MrAzzaman,你真的幫助我!我會執行你的循環,因爲它更好:) –

+0

@Ser達沃斯 - 也試圖找出/學習在哪裏以及如何使用靜態關鍵字,並提供解決方案背後的每個原因 – gnanz

1

printAllFishnon-static方法,並且您試圖以靜態方式調用它,即使用類名稱而不是實例。

你應該使用實例即F1或F2的一個稱呼它:

f1.printAllFish(); 
+0

如果我使printAllFish爲靜態,這些行不是靜態的,並且拋出相同的錯誤; int size = this.getFishNumOf(); String a = this.getName(); int b = getAge();.感謝回覆朋友 –

+0

@SerDavos靜態方法無法訪問非靜態字段。這是因爲可以在不創建實例的情況下調用靜態方法。如果沒有創建實例,那麼訪問intance字段確實有意義。 –

+0

現在所有的修復感謝Juned! –

0

你打電話給你的初始化對象的方法。不Fish.printAllFish(),但f1.printAllFish(),f2.printAllFish()或m.printAllFish()

我建議使用一個名爲FishContainer不同類的地方有魚對象的列表對象及初始化時魚對象,將它添加到FishContainer的列表屬性中,然後從容器類中調用printAllFish()。 嘗試某事像這樣:

FishContainer container = new FishContainer(); 
Fish f1 = new Fish("Nemo"); 
Fish f2 = new Fish("Dory"); 
f2.setNumber(2); 
Fish m = new Fish("Bruce"); 
m.setNumber(3); 

container.addFish(f1); 
container.addFish(f2); 
container.addFish(m); 
container.printAllFish(); 
+0

感謝您的答覆Apostolos,非常有用:) –

+0

@SerDavos請upvote我的答案,如果它幫助你。問候:) – Apostolos

相關問題