我正在编写一个在我正在编写的解析器中处理静态对象类型的问题。
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数组仍将继续被覆盖,并删除那些给了我很多'非静态变量无法引用...'消息。
答案 0 :(得分:0)
类上的static
修饰符与其他实体上的static
不同。首先,您根本无法将static
应用于顶级课程。它仅对在另一个类中定义的类有用:
public class Outer {
public class Inner {
...
}
static public class Nested {
...
}
}
不同之处在于,无论何时创建类Inner
的对象,对象在某种意义上都属于Outer
类的某个对象。 Inner
对象包含对某个Outer
对象的引用,其方法可以引用它所属的Outer
对象的字段。
然而,Nested
类更像是顶级类;主要区别在于外部类可以将其称为Outer.Nested
,当您需要几个名为Nested
的不同嵌套类时,这可能很有用。这是一种避免使用顶级类名称“污染命名空间”的方法,并明确表示Nested
与Outer
密切相关。此外,由于Java有关可见性的规则,Nested
类的方法可以访问private
Outer
成员,这是外部顶级类无法做到的。
但这并不意味着你只能创建一个Nested
。如果您想要一个只能有一个对象的类,请使用单例模式。 (但也要考虑你是否真的想要这样做以及为什么;单身模式受到一些程序员的蔑视,可能是因为它们看起来太像全局变量,这降低了将来对程序进行某些类型更改的灵活性。 )(PS在尝试更仔细地阅读你的问题之后,我不确定单身是你想要的,事实上我根本不清楚你的设计应该是什么样子。)
答案 1 :(得分:0)
它应该是这样的,因为静态变量是Class
所拥有的变量,而不是该类的实例,对于内部静态类也是如此。
否则我无法看到你是如何设法使你的func
类静态的,因为据我所知Java不允许顶级类是静态的,只有内部类可以这样。
我无法清楚地看到你的目标,但你应该重新考虑你的设计。也许有更好的解释,有人可以提供一些帮助。