2013-11-27 73 views
1

因此,我调用同一个类的main方法中定义的方法。我正在使用'this'关键字引用可调用方法。为什么我不能在静态main方法中调用这个非静态方法,如下所示?在Java的主要静态方法中调用非静态方法

相关但有点不同的问题,通过选择设计,是否有意义构建一个单独的类来实现逻辑。从本质上讲,主类应该只有一个主要方法来保持简单。任何想法将不胜感激。

UniqueChars.java:8: non-static variable this cannot be referenced from a static context 
     System.out.println(this.hasAllUniqueChars(input)); 
         ^
1 error 




public class UniqueChars { 

     boolean hasAllUniqueChars(String input) { 
       return false; 
     } 
     public static void main(String[] args) { 
       String input = "Harry"; 
       System.out.println(this.hasAllUniqueChars(input)); 
     } 
}                

回答

3

因为this是非静态的。 this实例,因为static的意思是“一个用于整个类”,所以不能在静态方法内引用实例变量。

你应该让hasAllUniqueChars方法static(如static boolean hasAllUniqueChars(String input)),所以你可以做

System.out.println(UniqueChars.hasAllUniqueChars(input)); 

或者只是(因为你在类是已经)

System.out.println(hasAllUniqueChars(input)); 

你还可以保存它是非静态的,并且这么做:

UniqueChars uc = new UniqueChars(); 
System.out.println(uc.hasAllUniqueChars(input)); 
2

你可以o只能在对象的实例中使用“this”。

让你无论是需要做一个UniqueChars对象,或者您需要hasAllUniqueChars静态

+0

因为什么时候你只能在一个对象的实例中使用它? – 2013-11-27 04:49:39

2

因为有一个静态方法没有this,因为this指的是当前实例(例如,该类的实例化对象)。

静态方法没有实例:这就是为什么他们被称为静态方法。他们生活在班级,并没有与任何实例相关联。

您应该(a)创建一个实例并调用其上的实例方法,或者(b)使该方法成为静态并且不要打扰。如果类不需要任何特定于实例的状态,那么也可以使其成为静态的,例如实用程序方法。

2

使用此代码:

System.out.println(new UniqueChars().hasAllUniqueChars(input)); 
+0

现在写的方式,是的。或者,可以删除'this'关键字并将签名更改为'static'。 – Makoto

1

方法hasAllUniqueChars也不是一成不变的。为了使其保持静态,您必须在名称boolean(如static boolean hasAllUniqueChars)之前放置static。静态方法不需要实例就可以调用它们。所以你可以称它为UniqueChars.hasAllUniqueChars()。 如果你不想要方法是静态的,那么你需要创建UniqueChars类的新实例,然后调用它。 new UniqueChars().hasAllUniqueChars()正如其他人所指出的那样。

1
  1. 任一构建具有main方法的类的一个实例(可能在main()本身),并调用它的方法。 (新的UniqueChars()。hasAllUniqueChars(input));

  2. 或者使hasAllUniqueChars()成为一个静态方法。

1

在实例方法或构造,this是当前对象,这是non-static的参考。您不能使用non-static实例到static方法。

相关问题