Java派生类不会自动创建实例

时间:2011-04-20 07:19:41

标签: java logging abstract derived

我有一个基本的抽象记录器类,它有一个实例变量,我希望在创建代码时由派生类自动设置。所以这是基类:

abstract public class CLog 
{
    /** Maintains the call stack level for each thread */
    private static HashMap<Integer, Integer> callStackLevel = new HashMap<Integer, Integer>();

    /** Static instance to be set by the derived class */
    private static CLog instance = null;

    /** Logs in verbose */
    public static void v(String message) { if(instance != null) instance.verbose(getMessage(message)); }
    /** Logs in debug */
    public static void d(String message) { if(instance != null) instance.debug(getMessage(message)); }
    /** Logs in informational */
    public static void i(String message) { if(instance != null) instance.info(getMessage(message)); }
    /** Logs in warning */
    public static void w(String message) { if(instance != null) instance.warn(getMessage(message)); }
    /** Logs in error */
    public static void e(String message) { if(instance != null) instance.error(getMessage(message)); }

    /**
     * Calculates the message (with header)
     */
    private static String getMessage(String message)
    {
        ...
    }

    /** Constructor sets instance */
    protected CLog() { instance = this; }

    /** Logs in verbose */
    protected abstract void verbose(String message);
    /** Logs in debug */
    protected abstract void debug(String message);
    /** Logs in informational */
    protected abstract void info(String message);
    /** Logs in warning */
    protected abstract void warn(String message);
    /** Logs in error */
    protected abstract void error(String message);
}

我为android记录器创建了派生类。我希望它自动调用构造函数,但似乎这不起作用,因为我的所有日​​志记录函数都没有产生任何结果。

public class AndroidLog extends CLog 
{
    protected static AndroidLog derived = new AndroidLog();

    @Override
    protected void debug(String message) {
        Log.d("Crystal", message);
    }

    @Override
    protected void error(String message) {
        Log.e("Crystal", message);
    }

    @Override
    protected void info(String message) {
        Log.i("Crystal", message);
    }

    @Override
    protected void verbose(String message) {
        Log.v("Crystal", message);
    }

    @Override
    protected void warn(String message) {
        Log.w("Crystal", message);
    }
}

为什么这不起作用?当我在基类中调用静态函数时,我没有得到任何日志。

是否有编辑AndroidLog类或在不依赖于AndroidLog的CLog类中进行编辑才能使其工作?

2 个答案:

答案 0 :(得分:2)

仅存在AndroidLog类不会导致它自行引导!

在Java类中使用它们时加载和初始化,而不是之前!因此,除非你的某个类以某种相关方式引用AndroidLog,否则它将永远不会被加载,它的静态字段永远不会被初始化,它的构造函数永远不会被调用。

答案 1 :(得分:0)

另一个重要方面是私有静态类成员不被继承!您的AndroidLog类将无法访问基类中的任何私有静态成员。