-3

我想知道是否有人可以告诉我如何从类中获取实例。
到目前为止,这是我的代码,我从另一篇文章中看到了这个,但我不断收到NullPointerException

这是我的主要课程。

public class Main {

private String name;
private static Main instance;
public static void main(String[] args) {
     Test.sayMyName();
}

public Main(){
    instance = this;
}

public static Main getInstance(){
    return instance;
}

public void setName(String name){
    this.name = name;
}

public String getName(){
    return this.name;
}
}

这是我的另一堂课。

public class Test { 
public static void sayMyName(){
    Main.getInstance().setName("Hi im John");
    System.out.println(Main.getInstance().getName());
}   
}

我收到错误消息"Main.getInstance().setName("Hi im John");"

4

4 回答 4

3

将以下内容更改为延迟初始化

public Main(){
    //instance = this;
}

public static Main getInstance(){
    if(instance == null){
          instance = new Main();

    }
    return instance;
}
于 2013-11-14T13:35:56.407 回答
2

请注意,您只在构造函数中设置实例的值,而该构造函数永远不会被调用。Java 有一个很好的技巧,它允许您在每个类(静态)运行一次代码块。还有其他方法可以做到这一点(阅读这个),但在我看来这和任何方法一样好。

public class Main{
    // member variables
    ...
    // functions like Main(), getInstance(), etc here
    ...
    // static initialization
    static{
        Main.instance = new Main();
    }
}

此外,如果您想强制用户Main只能使用该一个实例,您可以制作 constructor private。这样他们只能访问getInstance.

于 2013-11-14T13:40:24.103 回答
0

静态成员 instance 仅在 Main 类的构造函数中设置。您的代码中没有任何地方调用该构造函数。

于 2013-11-14T13:36:13.273 回答
0

试试这个:

public class Main {

   private String name;
   private static Main instance;
   public static void main(String[] args) {
        Test.sayMyName();
   }

   public Main(){

   }

   public static Main getInstance(){
if (instance == null) {
   instance = new Main();
} ;
return instance;
   }

   public void setName(String name){
       this.name = name;
   }

   public String getName(){
return this.name;
   }
   }
于 2013-11-14T13:36:57.647 回答