2013-10-22 72 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

相关问题