【问题标题】:Referencing basic Java object in another class在另一个类中引用基本 Java 对象
【发布时间】:2013-07-23 18:52:31
【问题描述】:

我是一名使用 Java 开发的初学者,在一个类中引用一个对象(来自不同的类)时遇到了一些问题。

这是我用来创建对象的代码,来自文件“Neighborhoods.java”。

public class Neighborhoods {

    // variables
    String name;
    int vertices;
    double[] latCoords;
    double[] longCoords;

    public Neighborhoods() {
        Neighborhoods fisherHill = new Neighborhoods();
        fisherHill.name = "Fisher Hill";
        fisherHill.vertices = 4;
        fisherHill.latCoords = new double[] {42.331672, 42.326342, 42.334464, 42.335733};
        fisherHill.longCoords = new double[] {-71.131277, -71.143036, -71.148615, -71.141062};
    }
}

然后,当从另一个不同的类(称为“inPolygon”)调用函数时,我尝试在我的主类中使用我创建的对象“fisherHill”(来自 Neighborhoods 类)。

inPolygon.check(Neighborhoods.fisherHill.vertices);

但由于某种原因,当我尝试引用 fisherHill 对象时出现错误,因为它说找不到。

我知道我在这里犯了一些愚蠢的错误,但我不确定它是什么。抱歉,如果我在描述代码时使用了错误的术语。任何帮助或建议将不胜感激。

【问题讨论】:

  • 为什么要在构造函数中进行递归调用?这将在某个时间点导致StackOverflowError
  • Neighborhoods fisherHill = new Neighborhoods(); 错误。请改用this(例如this.name = "Fisher Hill";)。请获取 Java 书籍。
  • 好的,感谢您的帮助。我会更恰当地重写一下。

标签: java oop object


【解决方案1】:

你有几个地方错了:

Neighborhoods fisherHill = new Neighborhoods();

为什么要在constructor 中实例化同一个类的新对象?你的构造函数被调用是因为这个类的一个新对象已经被创建了。这个新对象被引用为this。这是为新对象初始化类字段的正确方法:

this.name = "Fisher Hill";
this.vertices = 4;
this.latCoords = new double[] {42.331672, 42.326342, 42.334464, 42.335733};
this.longCoords = new double[] {-71.131277, -71.143036, -71.148615, -71.141062};

正如您在其他答案中看到的那样,this 可以省略。我个人更喜欢这样写,它让代码对我来说更具可读性。

inPolygon.check(Neighborhoods.fisherHill.vertices);

没有这样的static fieldNeighborhoods.fisherHill。即使它在那里,也无法访问fisherHill.vertices,因为它有default accessibility

您应该创建一个 Neighborhoods 对象,保持对它的引用并通过 getter 提取 vertices 字段:

final Neighborhoods n = new Neighborhoods();
final int numVertices = n.getVertices();
inPolygon.check(numVertices);

在 Neighborhoods 类中为 vertices 字段添加 getter:

public int getVertices() {
    return this.vertices;
}

我建议你买一本 Java 书籍,因为你显然缺乏基本的 Java 和 OOP 知识。

【讨论】:

  • 感谢您的回复。我重写了代码,以便它现在可以干净、正确地在类中创建对象。但是我仍然坚持无法从不同的类访问对象的变量。如果按照您的建议创建 getter 方法,则必须为每个对象显式创建“numVertices”变量,这将是低效的。
  • 如果numVertices 在所有Neighborhoods 对象中相同,那么您可以声明一个私有静态常量private static final int NUM_VERTICES = 4。您可以在此类的任何对象中将其引用为Neighborhoods.NUM_VERTICES 或简单地NUM_VERTICES。如果numVertices 因对象而异,则无法在每个对象上复制它。
  • 在你的情况下,假设你的意思是数组的大小,你甚至不需要这个值。你可以简单地做public int getVertices() { return this.latCoords.length; },这不太容易出现错误,例如如果您更改了数组大小但忘记更改常量。
  • 这个案例符合你上面提到的场景。每个对象的 numVertices 都不同,因此没有真正有效的方法来实现 getter 方法。我自己解决了这个问题,只是在主类中实例化对象,而不是 Neighborhoods 对象。然后我可以访问所有变量。
  • 其实你所做的就是我所说的final Neighborhoods n = new Neighborhoods(); final int numVertices = n.getVertices(); inPolygon.check(numVertices);。很高兴能帮上忙。
【解决方案2】:

您的构造函数中有一个递归调用。

违规行:

Neighborhoods fisherHill = new Neighborhoods();

【讨论】:

    【解决方案3】:

    应该是这样的

    public class Neighborhoods {
    
      // variables
      private final String name;
      private final int vertices;
      private final double[] latCoords;
      private final double[] longCoords;
    
      public Neighborhoods() {
        name = "Fisher Hill";
        vertices = 4;
        latCoords = new double[] {42.331672, 42.326342, 42.334464, 42.335733};
        longCoords = new double[] {-71.131277, -71.143036, -71.148615, -71.141062};
      }
    
      public int getVertices() {
         return vertices;
      }
    
      //and some more getters
    }
    

    然后在你的其他班级电话中

    inPolygon.check(new Neighborhoods().getVertices());
    

    【讨论】:

      【解决方案4】:

      回答您的问题:

      inPolygon.check(Neighborhoods.fisherHill.vertices);
      

      但由于某种原因,当我尝试引用 fisherHill 对象时出现错误,因为它说找不到。

      这里是静态引用,只有当它是静态成员时才可以访问fisherHill。

      另外,不要在构造函数中创建实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-25
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多