2011-04-20 99 views
0

我有一个抽象基类记录,有说我要来当代码是创建由派生类自动设置一个实例变量。因此,这里的基类:Java的派生类不会自动生成实例

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,使这项工作做编辑?

+0

我不明白你想要做什么。你是否在任何地方引用'AndroidLog'?如果不是,那么它将不会被加载,因此构造函数从不会调用:类的纯存在不会导致它被加载,它需要在某处引用。 – 2011-04-20 07:21:44

+0

在哪里以及如何定义'Log'符号,并为其创建对象? – 2011-04-20 07:23:32

+0

@Joachim所以即使我已经在派生类中声明了一个静态变量并将其设置为等于该类的一个实例,但除非在类之外引用它,否则不会创建该变量? – 2011-04-20 07:26:52

回答

2

AndroidLog类的存在本身不会导致它自行启动!

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

+0

@gamermb:您可以强制它加载,但:'C类=的Class.forName(“AndroidLog”);'这将告诉你需要它加载类,这将对其执行静态初始化的JVM。但是,如果您从未参考它,我很难看到您如何调用它。我没有看到构造函数中的任何代码挂钩到某些日志框架或某些类似情况(这是您必须玩“Class.forName”游戏的常见原因)。 – 2011-04-20 07:40:35

+0

基类构造函数设置实例变量。所以我需要的是一个派生类被实例化,因此调用基础构造函数。 – 2011-04-20 15:56:07

+0

我对Class.forName()感到困惑。它是如何工作的,以及我在哪里放置函数调用? – 2011-04-20 16:43:30

0

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

+0

我不在乎。总的来说,我希望我的所有类都使用基类静态变量进行记录,这些变量使用当前记录器加载的实例。 – 2011-04-20 16:44:44