“非静态方法无法从静态上下文引用”错误的问题

时间:2013-03-04 08:25:07

标签: java

我在尝试编写一个列出特定类中所有名称的方法时遇到此错误的问题。 (底部的错误)我尝试了一些事情,但对于我的生活,无法弄清楚。请帮助,谢谢。

Class Cat:

public class Cat
{
// instance variables 
private String name;
private int yearOfBirth;
private int weightInKilos;

public Cat() {
   setName("");
   setYearOfBirth(0);
   setWeightInKilos(0);
}

/**
 *  
 */
public Cat(String newName, int newYearOfBirth, int newWieghtInKilos )
{
    setName(newName);
    setYearOfBirth(newYearOfBirth);
    setWeightInKilos(newWieghtInKilos); 
}


public String getName(){
    return name;
}

public int getYearOfBirth(){
    return yearOfBirth;
}

public int getWieghtInKilos(){
    return weightInKilos;
}



public void setName(String newName){
    if (newName != null ){
    name = newName;
    }
    else{
        System.out.println("Invalid Name");
    }

}

public void setYearOfBirth(int newYearOfBirth){
    if (yearOfBirth >= 0){
    yearOfBirth = newYearOfBirth;
    }
    else{
        System.out.println("Year Of Birth must not be negative!");
    }
}

public void setWeightInKilos(int newWeightInKilos){
    if (weightInKilos >= 0){
    weightInKilos = newWeightInKilos;
    }
    else{
        System.out.println("Weight must not be negative!");
    }

}

}

Class Cattery:

import java.util.ArrayList;


public class Cattery
{
// instance variables - replace the example below with your own
private ArrayList <Cat> cats;
private String businessName;

/**
 * Constructor for objects of class Cattery
 */
public Cattery(String NewBusinessName)
{
    cats = new ArrayList <Cat>();
    NewBusinessName = businessName;
}

public void addCat(Cat newCat){

    cats.add(newCat);
}

public void indexDisplay(int index) {
    if((index >= 0) && (index <= cats.size()-1)) {
        System.out.println(index);
    }
    else{
        System.out.println("Invalid index position!");
    }
}

public void removeCat(int indexremove){
     if((indexremove >= 0) && (indexremove <= cats.size()-1)) {
         cats.remove(indexremove);
        }
    else{
        System.out.println("Invalid index position!");
    }
}

public void displayNames(){
   System.out.println("The current guests in Puss in Boots Cattery:");
   for(Cat catNames : cats ){
       System.out.println(Cat.getName());   //ERROR; non static method cannot be referenced from a                  static context..wtf

}
}
}

请帮忙,谢谢

4 个答案:

答案 0 :(得分:2)

使用:

System.out.println(catNames.getName()); 

getName是非静态函数,因此您需要在该类的实例上使用它,就像您在cats列表中一样。

答案 1 :(得分:1)

如果您有实例方法,则需要在类的特定实例上将其命名为

下面:

System.out.println(Cat.getName());

您尝试在Cat 本身上调用它。你想要:

for (Cat cat : cats ) {
    System.out.println(cat.getName());
}

请注意,我已经将迭代变量的名称从catNames更改为cat - 因为该值只是对“我们此刻正在看的猫”的引用。它不是猫名称,也不是多只猫(或猫的名字) - 它只是一只猫。仔细命名变量非常重要 - 它可以帮助纠正代码看起来正确,而错误的代码看起来不正确。在名为getName()的变量上调用catNames是没有意义的...(名称集合的名称是什么?)但绝对是有意义的在名为cat的变量上调用它。

原始代码中的另一个警告铃声是for循环的主体没有使用迭代变量 - 几乎总是暗示出错了。固定版本当然可以。

答案 2 :(得分:0)

for (Cat cat : cats) {
    System.out.println(Cat.getName());
}

在这里你需要使用猫,而不是猫。所以使用

for (Cat cat : cats) {
    System.out.println(cat.getName());
}

答案 3 :(得分:0)

Cat.getName() this line means getName() should be static method in Cat class, but's not as such.

按实例访问getName()方法。

System.out.println(catNames.getName());