1

我的班级看起来像这样:

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

4 回答 4

1

方法一:

您可以通过像这样放置静态来解决您的问题:

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

你打电话应该是这样的

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

方法二:

创建对象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());

}
于 2013-02-21T16:40:25.573 回答
1

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

关于什么时候在一个类中使用静态或非静态方法,你可以在网上找到这么多的文章来填满一个库:-)

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

于 2013-02-21T16:41:02.270 回答
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));

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

于 2013-02-21T16:45:52.700 回答
0

我不会更正您的程序或增强您的程序,但您需要了解基本概念以及您做错了什么。

有时您想创建对所有类实例(即对象)通用的变量。同样,您还将定义静态方法

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

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

 ClassName.methodName(args)

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

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

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

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

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

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

  public void setMonthNum(int monthNum)
于 2013-02-21T17:12:15.590 回答