在Java中的单个包文件中定义多个自定义对象

在Java中的单个包文件中定义多个自定义对象,java,Java,我有一个主类,Simulator,它有一个主函数,我将在其中运行模拟。在模拟器的主要功能中,我希望能够声明原子和移动,其中移动对象包含一个原子和一个时间步 为此,我设置了以下包层次结构: //Simulator.java import particle_simulator.*; public class Simulator{ public static void main(String args[]){ ... } } 及 为什么不能Simulator.java创建Move

我有一个主类,
Simulator
,它有一个主函数,我将在其中运行模拟。在
模拟器
的主要功能中,我希望能够声明
原子
移动
,其中
移动
对象包含一个
原子
和一个时间步

为此,我设置了以下包层次结构:

//Simulator.java
import particle_simulator.*;

public class Simulator{
   public static void main(String args[]){
   ...
   }
}


为什么不能
Simulator.java
创建
Move
对象?

您需要提供公共访问并从Atom实例创建它

package particle_simulator;

public class Atom{
  ...
   public Atom (){
    ...
   }

   public class Move implements Comparable<Move>{
       public Atom atom;

        ...

   public Move (Atom atom, double time){
     ...
  }
}

// In Simulator
    Atom a = new Atom();
    Atom.Move m = a.new Move(a, adouble);
package粒子模拟机;
公共类原子{
...
公共原子(){
...
}
公共类移动实现了可比性{
公共原子;
...
公共移动(原子,双倍时间){
...
}
}
//在模拟器中
原子a=新原子();
原子移动m=a.新移动(a,双);

在不太了解您正在做什么的情况下,我认为将Move作为Atom的内部类是没有意义的。为什么不将其放在自己的文件中呢?

如果您想构建独立于Atom的内部类,您需要将其公开且静态:

public class Atom {

    public static class Move {

    }

}


public class Simulator {
    public static void main (String[] args) {
        new Atom.Move();

    }
}

因为Move是Atom.o的一个内部类,所以要访问它,您需要
(new Atom()).new Move()
我同意。我想创建一个包层次结构,其中
Simulator
使用
particle\u Simulator
包,该包同时包含
Atom
Move
在同一级别。但是,如果它们在同一级别,我不知道如何授予
Move
访问
Atom
的权限。也许我可以拥有
模拟器
使用
particle\u模拟器
,它包含
Move
Move
使用另一个包含
Atom
的包,但这似乎很奇怪。这是我的最佳选择吗?“如果它们处于同一级别,我不知道如何给Atom提供Move访问权限。”如果你理解模拟器是如何访问Atom的,那你怎么会不知道你的问题的答案呢?这是可行的,但我得到了一个警告:
$javac Simulator.java-Xlint Simulator.java:46:warning:[unchecked]未选中调用add(E)作为原始类型java.util.PriorityQueue move\u queue.add的成员(new Atom.move(atoms.get(I),5));^1警告
我应该担心该警告吗?该警告让您知道PriorityQueue接受参数化类型。`PriorityQueue谢谢。我已将参数化类型添加到PriorityQueue,现在没有收到错误或警告。
package particle_simulator;

public class Atom{
  ...
   public Atom (){
    ...
   }

   public class Move implements Comparable<Move>{
       public Atom atom;

        ...

   public Move (Atom atom, double time){
     ...
  }
}

// In Simulator
    Atom a = new Atom();
    Atom.Move m = a.new Move(a, adouble);
public class Atom {

    public static class Move {

    }

}


public class Simulator {
    public static void main (String[] args) {
        new Atom.Move();

    }
}