【问题标题】:Java: When is the variable "this" initialized?Java:什么时候初始化变量“this”?
【发布时间】:2013-03-12 07:22:37
【问题描述】:
public class MainMDI extends javax.swing.JFrame {

   private static MainMDI thiz; 

      public MainMDI() {
        initComponents();
        thiz = this;
      }
}  

我正在摇摆中创建一个 MDI 应用程序。 MainMDI 类是应用程序的主类,因此主方法位于该类中。上面的代码创建了一个名为 thiz 的静态变量,它在应用程序运行时指向 MainMDI 类的实例。

我打算使用变量 thiz 从主方法中访问 MainMDI 类的非静态(实例)成员。(我无法从主方法中访问非静态成员,因为主方法是静态的我的应用程序中 MainMDI 类的成员)。

public class MainMDI extends javax.swing.JFrame {

   private static MainMDI thiz = this; 

      public MainMDI() {
        initComponents();
      }
}  

但是当我尝试在上面的代码中初始化变量 thiz 时,编译器说非静态变量 this 不能从静态上下文中引用。但我不是在静态上下文中指代这个,是吗?这是因为变量 this 是非静态的,在初始化静态变量 this 时还没有初始化?

另外,如果我没有将 MainMDI 类设置为主类并创建另一个具有 main 方法的类并将该类设置为主类,那会不会是一种更好的编程习惯?

【问题讨论】:

  • 看起来你想要一个单身人士。谷歌
  • @Prashan 通过提供一个引用类的(又名 one)实例的(又名 one)静态变量,您可以有效地限制数量您的类的可访问实例到 one (至少在您认为必须通过静态方法访问的上下文中)。拥有多个实例并仅通过静态 thiz 使最后一个可用是一种不同的解决方法,因此每个人都隐含地排除了此选项。因此,我们都认为你真的想要一个单例方法。如果你一直坚持回答no!,那么你必须描述你的场景。
  • @Prashan 为什么不保留对对象的引用?我还没有清楚地了解您的软件架构,但我认为这不是您在应用程序中需要的唯一参考。在这种情况下,我会使用“环境”对象注册该对象,该对象在我需要的任何地方都可用。它甚至可以是静态的,因为可以肯定我的应用程序中只有一个环境。尽管如此,如果我发现我需要更多 MainMDI 对象引用,代码更改将仅限于环境类和我需要 MainMDI 的少数地方。
  • @Prashan 和 JInternalFrame.getParent() 不会让您分别保留对父 JFrame 的引用吗?
  • @Prashan 我指的不是main,真的,而是当您需要访问MainMDI 对象时代码中的位置。一定有一个原因你为什么要访问它,这样你就会有一些可用的上下文,不是吗?我在想上下文可能是一个JInternalFrame 对象。 -- 不管怎样,决定权在你,我们都已经向你指出了一些应该做到的方法,所以享受吧,我希望你成功。

标签: java constructor this static-members


【解决方案1】:

但是当我尝试在上面的代码中初始化变量 thiz 时, 编译器说非静态变量不能从 静态上下文。 但我在这里不是在静态上下文中指代这个 我是吗?

是的,你是。静态类变量在加载类时初始化(而不是在创建对象实例时)。在这种情况下没有this。代码:

private static javax.swing.JFrame thiz = this; 

根本行不通。尽管你的断言相反,你确实想要一个单身人士。否则,给定您的 MainMDI 对象的 N 个可能的对象实例,您希望从静态上下文访问哪一个?您应该考虑重构您的代码,而不是试图围绕 Java 语言语义进行强力武装。

【讨论】:

  • 还是不行。我不需要单例类,因为没有在我的应用程序中多次实例化 MainMDI 类的危险。关于重构代码的观点,但我忍不住“强力武装”。这样我会偶然发现这样的问题并从中学到一些东西。
  • 我认为你确实需要一个单身的 Prashan。不是为了防止对象的多个实例化,而是为了支持从静态上下文中初始化字段,就像您尝试做的那样。但无论如何,如果对象只实例化一次,你到底为什么需要thiz
  • @vikingsteve 感谢您的评论。单例究竟如何支持从静态上下文初始化字段?我想知道更多。为了回答你的问题,如果你正确地阅读了这个问题,你就会明白为什么。我需要变量 thiz 来访问并且只能从 main 方法中访问 MainMDI 类的实例成员。 (Main 方法是静态的,它的内部类 MainMDI。这有效地使 MainMDI 类的所有实例成员都无法直接或通过变量 this 访问 main 方法。所以我使用 thiz 来访问它们)
  • 好吧,我认为您可以在 main 方法中实例化 MainMDI(如果可以的话,完全避免从静态上下文访问成员的需要),或者尝试像这样的 Singleton with Eager initializationprivate static final javax.swing.JFrame INSTANCE = new MainMDI();
【解决方案2】:

this 表示“当前正在操作的对象实例”,它仅在非静态成员函数中才有意义。一般来说,this 在您调用该成员函数时会隐式传递给每个非静态成员函数,因此可以公平地说它在调用非静态成员函数之前就已初始化。

用“main”方法分解一个类是否是一个好主意,很大程度上取决于实际的实现细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 2017-04-10
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多