非静态方法不能从静态上下文中引用

我的class级看起来像这样:

public class Month { private int numOfMonth; private int monthNum; public int monthNum() { return monthNum = 1; } public void setMonthNum(int monthNum){ switch (monthNum) { case 1: System.out.println("January"); break; case 2: System.out.println("February");break; case 3: System.out.println("March");break; case 4: System.out.println("April");break; case 5: System.out.println("May");break; case 6: System.out.println("June");break; case 7: System.out.println("July");break; case 8: System.out.println("August");break; case 9: System.out.println("September");break; case 10: System.out.println("October");break; case 11: System.out.println("November");break; case 12: System.out.println("December");break; } } public String getName() { return "" + monthNum; } } 

我的驱动程序如下:

 import java.util.Scanner; public class monthDriver { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Enter month number: "); int monthNum = in.nextInt(); System.out.println("Month number " + monthNum + " is the month of " + Month.getName()); } } 

我得到编译时错误:

 "monthDriver.java:12: error: non-static method getName() cannot be referenced from a static context System.out.println("Month number " + monthNum + " is the month of " + Month.getName());1 error" 

请记住我是学生,学术诚信对我很重要,为什么我收到这样的错误? 另外,有什么建议可以提高我未来的编码效率吗? 感谢您的所有时间和精力。 非常感谢。

方法1:

你可以像这样通过静态解决你的问题:

 public static String getName() { return "" + monthNum; } 

你打电话应该是这样的

 System.out.println("Month number " + monthNum + " is the month of " + Month.getName()); 

方法2:

创建class Month对象,然后:

 public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Enter month number: "); int monthNum = in.nextInt(); Month obj=new Month(); System.out.println("Month number " + monthNum + " is the month of " + obj.getName()); } 

对于初学者来说,如果您想要访问类的方法(在您的情况下为Month)而不首先实例化类本身,而是直接使用Month.getName(),那么该方法必须定义为static。

关于何时在类中使用静态或非静态方法,您可以在线找到这么多文章来填充库:-)

关于上面代码的另一个小注释。 您可能对使用枚举感兴趣,而不是使用开关。

你的代码看起来有点粗糙和混乱。 我建议使用:

  public static String getMonthNameForNum(int monthNum) { switch (monthNum) { case 1: return "January"; case 2: return "February"; case 3: return "March"; case 4: return "April"; case 5: return "May"; case 6: return "June"; case 7: return "July"; case 8: return "August"; case 9: return "September"; case 10: return "October"; case 11: return "November"; case 12: return "December"; default: return "UNKNOWN"; } } 

然后使用它像:

  System.out.println("Month number " + monthNum + " is the month of " + Month.getMonthNameForNum(monthNum)); 

PS当然,这应该只是教育代码,在现实生活中你会使用标准日历等获得月份名称!

我不会纠正你的程序或改进你的程序,但你需要了解基本概念和你做错了什么。

有时您想要创建所有类别对象实例共有的变量。 类似地,您还可以定义静态方法

请阅读此链接 。 我只是在这里粘贴片段。

Java编程语言支持静态方法以及静态变量。 静态方法,在其声明中具有静态修饰符, **应该使用类名调用,而不需要创建类的实例,如

  ClassName.methodName(args) 

并非所有实例和类变量和方法的组合都是允许的:

实例方法可以直接访问实例变量和实例方法。

实例方法可以直接访问类变量和类方法。

类方法可以直接访问类变量和类方法。

类方法不能直接访问实例变量或实例方法 – 它们必须使用对象引用。 此外,类方法不能使用this关键字,因为没有要引用的实例。

在你的情况下,最后一条规则适用,因为这是实例方法,因此你不能调用Month.setMonthnum(bla)

  public void setMonthNum(int monthNum)