如何处理静态对象数组?

时间:2014-03-10 15:02:20

标签: java arrays static

我正在编写一个在我正在编写的解析器中处理静态对象类型的问题。

glob = new func("glob");
glob.addChild(new func("wrong"));
System.out.println(glob.name);

func是一个静态类,我在main中的上面代码中引用了它。运行此代码时,打印的文本是“错误的”。我假设像我一样使func静态导致那里只允许一个func,并且它被覆盖,因为我无法创建func的实例。有没有解决的办法?这是声明func的参考代码的一部分

static class func{
  public func (String name){
     //etc
  }
}

这成为一个问题,因为我希望能够创建这些对象的嵌套,以用于确定解析器中的范围。 func会有子节点,并且想法是一个子节点可以查找我自己首先添加的'变量'(这里只是一个字符串),然后在其父节点内,依此类推。创建孩子只是淹没了父母。

更新:人们想要更多来自func的代码

static class func{
public static func[] children;
public String name;
public static func parent;
private static int child_index, var_index;
private static String[][] vars;
    public func (String name, func parent){
       children = new func[50];
       //etc
    }
 }

你说我确实有一个静态名称。如果我删除它,我担心vars / children数组仍将继续被覆盖,并删除那些给了我很多'非静态变量无法引用...'消息。

2 个答案:

答案 0 :(得分:0)

类上的static修饰符与其他实体上的static不同。首先,您根本无法将static应用于顶级课程。它仅对在另一个类中定义的类有用:

public class Outer {

    public class Inner {
    ...
    }

    static public class Nested {
    ...
    }

}

不同之处在于,无论何时创建类Inner的对象,对象在某种意义上都属于Outer类的某个对象。 Inner对象包含对某个Outer对象的引用,其方法可以引用它所属的Outer对象的字段。

然而,Nested类更像是顶级类;主要区别在于外部类可以将其称为Outer.Nested,当您需要几个名为Nested的不同嵌套类时,这可能很有用。这是一种避免使用顶级类名称“污染命名空间”的方法,并明确表示NestedOuter密切相关。此外,由于Java有关可见性的规则,Nested类的方法可以访问private Outer成员,这是外部顶级类无法做到的。

但这并不意味着你只能创建一个Nested。如果您想要一个只能有一个对象的类,请使用单例模式。 (但也要考虑你是否真的想要这样做以及为什么;单身模式受到一些程序员的蔑视,可能是因为它们看起来太像全局变量,这降低了将来对程序进行某些类型更改的灵活性。 )(PS在尝试更仔细地阅读你的问题之后,我不确定单身是你想要的,事实上我根本不清楚你的设计应该是什么样子。)

答案 1 :(得分:0)

它应该是这样的,因为静态变量是Class所拥有的变量,而不是该类的实例,对于内部静态类也是如此。

否则我无法看到你是如何设法使你的func类静态的,因为据我所知Java不允许顶级类是静态的,只有内部类可以这样。

我无法清楚地看到你的目标,但你应该重新考虑你的设计。也许有更好的解释,有人可以提供一些帮助。