Java 将对象作为参数传递时,是否使用了更多内存?

Java 将对象作为参数传递时,是否使用了更多内存?,java,Java,例如,我将使用libgdx(游戏引擎),但这是一个关于java如何工作的问题,我没有发现 这是soundControler类: private final Sound s_0 = Gdx.audio.newSound(Gdx.files.internal("a.mp3"));; private final Sound s_1 = Gdx.audio.newSound(Gdx.files.internal("a.wav")); //lot of more variables public voi

例如,我将使用libgdx(游戏引擎),但这是一个关于java如何工作的问题,我没有发现

这是soundControler类:

private final Sound s_0 = Gdx.audio.newSound(Gdx.files.internal("a.mp3"));;
private final Sound s_1 = Gdx.audio.newSound(Gdx.files.internal("a.wav"));
//lot of more variables

public void shoot(short sound){
    if(SOUND_ENDABLED) {

        switch (sound) {
            case 0:
                s_0.play();
                break;
            case 1:
                s_1.play();
                break;
        }
    }
}
这基本上是一个加载在内存中的声音库,程序将不断使用它

另一个例子:

假设我们有一个
Animator
类,它将为游戏中的每个动画提供很多方法


这是一种好的做法吗?或者每次我将
SoundController
作为参数传递时,我都会在内存中创建一个新的声音和方法副本吗?

我认为问题不在于“当您将声音控制器作为参数传递时”,而是当您实例化一个实例时。每次实例化实例时,您都将调用这些方法。有必要吗

如果将变量设置为静态,那么代码将仅在实例化类时执行,即,在程序运行时执行一次(实际上是对该类加载器执行实例化,但在大多数情况下,在程序运行时执行一次)。如果它们在第一次设置后从未改变,那么它们可以是静态的,不会产生不良影响

你没有问,但我还是要对此发表评论——我不明白你(和其他许多人)为什么用case语句代替数组。将声音放入一个数组(或者一个hashmap,如果您实际上没有方便的整数索引到数组中);然后简单地用
sound
变量索引到该数组中,就完成了。您的代码要短得多,更容易理解,而且运行速度至少也一样快

未编译的示例:

private static Sound[] allSounds;
private static String[] allSoundFiles
  = { "a.mp3", "a.wav" /* ... * };

static
{
  allSounds = new Sound[allSoundFiles.length];
  index = 0;
  for (String s:allSoundFiles)
  {
    allSounds[index] = 
      Gdx.audio.newSound(Gdx.files.internal(s);
  }
}

public void shoot(short sound)
{
  if (SOUND_ENABLED) // or ENDABLED if you prefer
  {
    allSounds[sound].play();
  }
}

随着声音的增加,文件名列表是唯一的增长点。这假设您加载的所有声音都有一个
play()
函数,当然。

可能相关:?将只实例化一次,但将其传递给许多其他类,因此如果每次都作为参数传递,java将复制trubleNo中的变量,则初始化变量的代码仅在实例化时运行;如果只实例化一次,那么代码只执行一次。如果您想测试它,您可以调用一个方法,该方法不仅可以初始化值,还可以将某些内容写入sysout,这样您就可以看到只写入一次。如果您感兴趣,程序中只有一个实例的类称为“singleton”。