Java 如何处理静态对象数组?
我在编写的解析器中遇到了一个处理静态对象类型的问题Java 如何处理静态对象数组?,java,arrays,static,Java,Arrays,Static,我在编写的解析器中遇到了一个处理静态对象类型的问题 glob = new func("glob"); glob.addChild(new func("wrong")); System.out.println(glob.name); func是一个静态类,我在上面的main代码中引用了它。运行此代码时,打印的文本为“错误”。我假设将func设为静态会导致只允许有一个func,并且由于我无法创建func的实例,它会被覆盖。有办法解决这个问题吗?下面是func声明的部分代码,供参考 static c
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数组仍然会被覆盖,删除它们会给我很多“非静态变量不能被引用…”消息。类上的
static
修饰符与其他实体上的static
修饰符的作用不同。首先,您根本不能将静态
应用于顶级类。它仅对在另一个类中定义的类有用:
public class Outer {
public class Inner {
...
}
static public class Nested {
...
}
}
不同之处在于,无论何时创建类内部
的对象,从某种意义上说,该对象“属于”外部类的某个对象。内部
对象包含对某些外部
对象的引用,其方法可以引用它所属的外部
对象的字段
然而,嵌套的
类更像是顶级类;主要区别在于,外部类可以将其称为Outer.Nested
,当您需要多个不同的嵌套类都命名为Nested
时,这非常有用。这是一种避免顶级类名“污染名称空间”的方法,并且可以清楚地表明,嵌套的
在某种程度上与外部的
密切相关。另外,由于Java关于可见性的规则,嵌套的
类的方法可以访问外部
的私有
成员,这是外部顶级类无法做到的
但这并不意味着只能创建一个嵌套的
。如果您想要一个只能有一个对象的类,请使用单例模式。(但也要考虑您是否真的想这样做以及为什么要这样做;一些程序员不喜欢单例模式,可能是因为它们看起来太像全局变量,这降低了将来对程序进行某些更改的灵活性。)(另外,在仔细阅读了你的问题后,我不确定你想要的是单身,事实上我也不清楚你的设计应该是什么样子。)之所以如此,是因为静态变量是属于类的变量,而不是该类的实例,对于内部静态类也是如此
否则,我看不出您是如何使func
类成为静态的,因为据我所知,Java不允许顶级类是静态的,只有内部类可以是静态的
我看不清楚您的目标是什么,但您应该重新考虑您的设计。也许有人可以通过更好的解释提供一些帮助。我假设像我这样使func成为静态函数会导致只允许有一个func
-不,静态
内部类与ir封闭类,仅此而已。类始终是“静态的”(每个类加载器一个类“实例”)而static
不会阻止您创建实例,这将以不同的方式完成。由于static
仅允许在内部类上使用,因此似乎存在外部类,这可能会导致问题。您可以发布该问题吗?请包含func
类的所有代码。您描述的唯一方法是n是如果构造函数中的name
参数被分配给一个静态字段name
Btw,那么你在标题中提到的数组在哪里?@NickHolt我已经更新了我的op以包含更多的类。你在静态名称字段上说得对,但是对如何处理其他静态字段有什么见解吗?我正在使用这些对象在jflex中,它要求我能够在静态类中工作。我想我的问题是,我可以从静态位置的子类中访问非静态方法吗?@Skyl3lazer只需将所有字段设置为非静态
,仅仅因为类是静态的,并不意味着它的字段需要是静态的。