【问题标题】:Java calling object in method outside of mainJava 在 main 之外的方法中调用对象
【发布时间】:2012-06-25 10:54:17
【问题描述】:

我有一个简单的问题,我已经被困了一段时间,我找不到答案。基本上,我正在创建一个对象并尝试在不使用静态变量的情况下访问变量,因为有人告诉我这是错误的方法。这是问题的一些示例代码。我在第一类中收到一个无法解析为变量的错误。我想要做的是在 main 之外的其他方法中访问t.name,也可以在其他类中访问。为了解决这个问题,我之前会使用Test2.name 并在Test2 类中将变量设为静态,如果我错了,请纠正我,但我认为这是错误的做法。任何帮助将不胜感激 =)

public class Test {
  public static void main(String[] args) {
    Test2 t = new Test2("Joe");         
  }

  public void displayName() {
    System.out.println("Name2: " + t.name);
  }
}

public class Test2 {
  String name;

  public Test2 (String nm) {
    name = nm;
  } 
}

【问题讨论】:

  • 在 Test2 中添加访问器方法是一种选择吗?就像 getName() 方法一样,它会返回 name

标签: java variables object syntax


【解决方案1】:

我看到其他人已经发布了代码 sn-ps,但他们实际上并没有发布为什么这些工作(在撰写本文时)。

你得到一个编译错误的原因是你的方法

public static void main(String[] args) {

    Test2 t = new Test2("Joe");         
}

变量 t 的作用域就是那个方法。您将Test2 t 定义为仅在main(String[] args) 方法中,因此您只能在该方法中使用变量t。但是,如果您像这样将变量设为字段,并创建 Test 类的新实例,

public class Test {
Test2 t;
public static void main(String[] args) {
    Test test = new Test();
    test.t = new Test2("Joe");  
   test.displayName();
}

public void displayName() {
    System.out.println("Name2: " + t.name);
}
}

那么您应该不会再遇到任何编译错误,因为您将变量 t 声明为在类 Test 范围内。

【讨论】:

  • 感谢您的解释。如果我想在第三类中使用该变量,代码是否相同?
  • @Jarod 这一切都取决于第三类是什么以及你如何使用它。但它背后的基本语法和思想仍然是一样的。
  • 太好了,我相信这应该可以解决我的问题。再次感谢。
【解决方案2】:

您可以将测试对象的引用作为方法displayName 的参数:

public class Test {

    public static void main(String[] args) {    
        Test2 t = new Test2("Joe");         
        displayName(t);
    }

    public static void displayName(Test2 test) {
        System.out.println("Name2: " + test.name);
    }
}

注意:我还将displayName 设为静态方法。在您的 main 方法中,您只能访问没有引用的静态方法。

【讨论】:

    【解决方案3】:

    把Test类修改成这个

    public class Test {
      private static Test2 t;
    
      public static void main(String[] args) {
        t = new Test2("Joe");         
      }
    
      public void displayName() {
        System.out.println("Name2: " + t.name);
      }
    }
    

    【讨论】:

      【解决方案4】:

      为您的目的使用getter。这是您的问题的一个侧面解决方案,但通常这是您应该使用getters 检索实例变量的方式。

      public class Test {
      
      
      public static void main(String[] args) {
      
          Test2 t = new Test2("Joe");         
          displayName(t);
      }
      
      public static void displayName(Test2 test) {
          System.out.println(test.getName());
      }
      }
      
      
      
      public class Test2 
      {
      private String name;
      
      public Test2 (String nm)
      {
          name = nm;
      }   
      
      public String getName()
      {
           return name;
      }
      }
      

      永远记住,你的类中的变量应该是private。这可以保护它免受类外的访问。因此,getters 是访问它们的唯一方法。和setters 或constructors 来初始化它们。

      【讨论】:

        【解决方案5】:

        我认为静力学越少越好。
        我将实例化 Test 并在它的实例上调用 displayName,然后将 Test2 的实例传递给 displayName。 但这确实取决于总体目标是什么

        【讨论】:

        • 我只是好奇,为什么你会说静力学越少越好?
        • 静态方法防止方法覆盖,因此限制子类化。静态成员变量不能很好地与序列化配合使用。根据我的经验,静态往往会造成混乱和代码异味(有点 hacky 代码)。我个人尝试将静态声明限制为定义常量。
        猜你喜欢
        • 2021-03-30
        • 2014-03-05
        • 2014-03-26
        • 1970-01-01
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多