Java - 内部类

时间:2016-05-28 00:00:39

标签: java inner-classes

我正在尝试使用内部类,我对它们有些疑问 我有一个gameObject类如下

import java.io.*;
public abstract class GameObject implements Serializable {
    protected enum GAME_OBJECT_TYPE {SNARK, HINT, BONUS_ITEM, INVALID};
    protected GAME_OBJECT_TYPE eGameObjectType;
    protected GameObject() {
        eGameObjectType = (GAME_OBJECT_TYPE.INVALID);
        System.out.println("SOMETHING WENT WRONG");
    }
    public class Snark extends GameObject implements Serializable {
        public Snark() {
            eGameObjectType = (GAME_OBJECT_TYPE.SNARK);
            System.out.println("SNARK LIVES HERE");
        }
    }
    public class Hint extends GameObject implements Serializable {
        public Hint() {
            eGameObjectType = (GAME_OBJECT_TYPE.HINT);
            System.out.println("HINT LIVES HERE");
        }
    }
}

使用这个GameObject类结构,我没有错误,但我可以在没有错误的情况下在我的GameFrame中实例化Snark的唯一方法是

GameObject mySnark = new GameObject.Snark();   // all good
GameObject mySnark = new Snark();   // cannot be resolved

然而,当我将gameObject类更改为

import java.io.*;
public abstract class GameObject implements Serializable {
    protected enum GAME_OBJECT_TYPE {SNARK, HINT, BONUS_ITEM, INVALID};
    protected GAME_OBJECT_TYPE eGameObjectType;
    protected GameObject() {
        eGameObjectType = (GAME_OBJECT_TYPE.INVALID);
        System.out.println("SOMETHING WENT WRONG");
    }
}    
public class Snark extends GameObject implements Serializable {   // The public type Snark must be defined in its own file
    public Snark() {
        eGameObjectType = (GAME_OBJECT_TYPE.SNARK);
        System.out.println("SNARK LIVES HERE");
    }
}    
public class Hint extends GameObject implements Serializable {
    public Hint() {
        eGameObjectType = (GAME_OBJECT_TYPE.HINT);
        System.out.println("HINT LIVES HERE");
    }
}

我现在可以在我的GameFrame中实例化一个Snark为

GameObject mySnark = new Snark();   // no errors

我可以再次将每个对象重新拆分为自己的类,但它认为这可能是一种大大减少我目前所拥有的类数的方法。

有人可以帮助我理解我的错误吗?

谢谢

1 个答案:

答案 0 :(得分:1)

内部类并不意味着减少项目中的类数(正如您的问题所示);它是关于逻辑地将功能分组到某个父类,最常见的是特定于父类的辅助类。内部类通常也不会扩展其包含的父类。

根据您的示例,似乎需要在Snark之外实例化GameObject类型的对象,这表明Snark应该是一个独立的类。

来自Oracle JavaDoc的inner classes的更多信息。