2013-02-21 86 views
0

我的班级正在寻找这样的参考:非静态方法不能从静态上下文

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" 

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

+6

'getName'是'Month'的*实例*方法。你还没有一个'Month'的实例来调用它。你应该在你用来学习Java的Java书或教程中查找'static',以了解静态成员和实例成员之间的区别。 – 2013-02-21 16:35:04

+1

我看到学术诚信对你很重要,所以我不会用代码发表答案。但是你可能希望仔细看看你的setMonthNum方法,以确保它做你想做的事情。 – Scott 2013-02-21 16:45:19

+0

谢谢@Scott帮助了一吨!我遇到了另一个问题,我将在= D处再次感谢! – WannaBeDroidProgrammer 2013-02-21 17:42:00

回答

1

方法1:

您可以通过palcing静态这样解决问题:

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

那么对于初学者,如果你要访问一个类的方法(在你的情况下,月),而第一个实例化类本身,而是直接与Month.getName(),则该方法必须被定义为static 。

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

另一个小纸条大约上面的代码。您可能有兴趣使用枚举,而不是使用开关。

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

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

0

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

有时候你想创建一个变量,这个变量对于所有类的a.k.a对象的实例都是通用的。同样,您也可以定义静态方法

从此读取link。我只是在这里粘贴片段。

Java编程语言支持静态方法以及静态变量。静态方法,这在他们的声明中的static修饰符,**应与类名

ClassName.methodName(args) 

调用,而无需创建类的实例,作为实例并非所有组合和允许类变量和方法:

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

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

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

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

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

public void setMonthNum(int monthNum) 
相关问题