首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同的对象引用(?)对象

不同的对象引用(?)对象
EN

Stack Overflow用户
提问于 2012-08-17 01:52:52
回答 4查看 1.8K关注 0票数 5

最近我问过关于从另一个类中获取类的唯一实例的问题。

( How to get specific instance of class from another class in Java? )

所以,我正在试着让它工作:

我的Application

代码语言:javascript
复制
public class Application
{

    // I will always have only one instance of Application

    private static Application _application;

    // Every instance of Application (one in my case) should have its own View

    private View view;

    // Constructor for new instance of Application

    private Application()
    {
        view = new View();
    }

    // Getter for my unique instance of Application

    public static Application getSharedApplication()
    {
        if (_application == null)
            _application = new Application();
        return _application;
    }

    // Main class

    public static void main(String[] args)
    {
        // So I'm accessing my instance of Application
        Application application1 = getSharedApplication();

        // Here is object reference
        System.out.println(application1);

        // And now I'm accessing the same instance of Application through instance of View
        Application application2 = application1.view.getApplication();

        // Here is object reference
        System.out.println(application2);
    }

}

我的View

代码语言:javascript
复制
public class View
{

    // I'm accessing my instance of Application again

    public static Application application = Application.getSharedApplication();

    // This method should return my unique instance of Application

    public Application getApplication()
    {
        return application;
    }

}

问题是main方法返回不同的对象引用。

代码语言:javascript
复制
Application@1430b5c
Application@c2a132

我的代码出了什么问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-17 02:05:09

下面是发生的情况:

视图程序首先调用Application application1 = getSharedApplication();

  • that,然后调用静态方法,该方法调用视图-该调用需要加载视图类,该类是Application.

  • the 类的成员,它的静态成员被初始化并运行getSharedApplication(); (请注意,在这个阶段,_application仍然为空)。这将创建一个new Application() too

您现在有2个应用程序实例。

请注意,如果将View v = new View();添加为main的第一行,则只有一个应用程序实例(从View的静态变量加载一次)。当你努力思考的时候,这是有意义的,但不是很直观……

票数 7
EN

Stack Overflow用户

发布于 2012-08-17 02:03:16

这类问题的一般答案是:使用调试器!例如,您可以在Application的构造函数中设置断点,运行程序,并在构造函数第二次执行时检查堆栈。

如果你这样做,你会注意到类似这样的东西:

代码语言:javascript
复制
Application.<init>() line: 21   
Application.getSharedApplication() line: 31 
View.<clinit>() line: 59    
Application.<init>() line: 23   
Application.getSharedApplication() line: 31 

也就是说,视图希望在完全构造共享应用程序之前(以及在后者存储在静态字段中之前)获取共享应用程序。

票数 4
EN

Stack Overflow用户

发布于 2012-08-17 02:31:52

如果您更改视图的初始化,如下所示

代码语言:javascript
复制
public static Application getSharedApplication() {

    if(_application == null)
    {
        _application = new Application();
        view = new View();
    }

您会发现只创建了一个实例。原因是您在应用程序完全初始化之前创建了View实例。因为静态变量是在第一次请求类时加载的,所以这种行为就会发生。

无论如何,我学到了永远不要这样做:)谢谢:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11992796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档