2016-08-13 72 views
2

我有一种情况,在类初始化期间,一个子类(我们称之为​​)调用基类的静态方法(我们称之为BaseClass)并传递​​作为参数来标识正在初始化的特定类,或者Java的:在静态类初始化程序中是否有与Java的“this”等效的内容?

public class SubClass extends BaseClass { 
    static { BaseClass.init(SubClass.class); } 
    ... 
} 

代替BaseClass具有方法:

protected static void init(Class<?> c) { 
    ... 
} 

我愿做的是有BaseClass通话init自动,如:

public class BaseClass { 
    static { init(thisclass); } 
    ... 
} 

所以,问题是,它的Java有一些关键字,通过上述thisclass表示,返回的类类初始化初始化?

+1

如果您有多个子类,那么一个基类静态初始化程序如何初始化多个子类? –

+0

在'BaseClass'的静态初始化块中初始化的类总是'BaseClass'。如果你期望初始化器运行子类,你需要调整你的期望值。 – user2357112

+0

也许将此视为一个抽象问题。我从我的实现中解决了这个问题,这很好,但我想避免必须明确告诉基类正在初始化哪个子类。实际上,我将SubClass.class的值存储为Map的键;映射的值是BaseClass为每个子类跟踪的信息。 –

回答

3

不,没有。

此外,正如user2357112在注释中所述,BaseClass的静态初始化程序只会运行一次,而初始化为BaseClass。它不像实例构造函数,每次创建子类的实例时都会运行。基本上你应该坚持你现有的计划。

还值得注意的是,如果您希望子类用某种东西“注册自己”,您可能会惊讶于子类初始化不会发生

例如,如果你在基类中的静态方法foo,然后调用Subclass.foo()不会初始化Subclass - 只有基类,因为子类没有需要因为没有进行初始化,其代码正在执行。

+0

好的,谢谢!我错过了关于只运行一次的基类初始化器的部分;我应该已经知道了。虽然目前的实施工作,我不得不重新考虑我想解决的问题,看看是否有更好的方法。 –

+0

感谢您的所有意见!我重写了实现,以便在基类的第一次实例方法首次注意到子类未注册时,基类自己代表子类调用它的init方法本身。不幸的是,这会在基类的实例方法中花费运行时检查,但它使注册完全自动化。 –

-2

不,没有,因为这里没有实例。就像静态方法一样。

+0

@downvoter好的,这是什么?这里有*是一个实例吗?但仍然没有“这个”?请说明。 – EJP