无法从静态上下文引用非静态方法

时间:2013-02-21 16:33:15

标签: java switch-statement

我的班级看起来像这样:

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"

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

4 个答案:

答案 0 :(得分:1)

方法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());

}

答案 1 :(得分:1)

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

关于何时在课堂上使用静态或非静态方法,你可以在网上找到很多文章来填满图书馆: - )

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

答案 2 :(得分:0)

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

    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));

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

答案 3 :(得分:0)

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

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

阅读link。我只是在这里粘贴片段。

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

 ClassName.methodName(args)

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

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

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

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

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

在您的情况下,上一条规则适用,因为这是实例方法,因此您无法调用Month.setMonthnum(bla)

  public void setMonthNum(int monthNum)
相关问题