令人困惑的Java扩展

时间:2014-03-22 07:57:18

标签: java extends

我试图理解Java扩展的用法....我根据其工作方式创建了一个示例测试代码....

public class Parent {

    public String Msg="Original";

    public String getMsg() {
        return Msg;
    }
    public void setMsg(String msg) {
        Msg = msg;
    }

    public void printing(){
        System.out.println(Msg);    
    }
}

public class Child extends Parent{

    public HashMap<String, String> Msg2;

    public Integer Msg3;

    public HashMap<String, String> getMsg2() {
        return Msg2;
    }
    public void setMsg2(HashMap<String, String> msg2) {
        Msg2 = msg2;
    }

    public void printing(){
        System.out.println("1 : " + Msg);
        System.out.println( Msg2 );
    }


    public static void main(String[] args) {

        Child a = new Child();

        System.out.println(a.Msg.getClass());  // able to detect variable from parent

        System.out.println(a.Msg2.getClass()); // Not able to detected, even variable from                  
                               // same instance object child    
        System.out.println(a.Msg3.getClass()); // Not able to detected, even variable from                  
                               // same instance object child


        a.printing();

    }

}

我很容易混淆为什么来自父对象的Msg变量很容易被检测到。

虽然Msg2和Msg 3来自同一个实例Child - &gt; a无法识别它自己的变量。

从Msg2或Msg 3获取的错误消息是,线程“main”中的异常java.lang.NullPointerException

有没有人能够解释为什么java会以这种方式表现出来?

谢谢....

3 个答案:

答案 0 :(得分:1)

您尚未初始化Msg2Msg3。您需要使用new关键字对它们进行初始化,以使它们不为空。

添加这两个陈述。

Msg2 = new HashMap<String,String>();

Msg3 = new Integer();

答案 1 :(得分:1)

因为Msg已初始化为非空值(字符串&#34; Original&#34;)但其他字段没有,所以它们为null并且您尝试了异常在空引用上调用方法(getClass)。如果您只是尝试打印Msg2而不是Msg2.getClass(),那么您可以看到值null而无例外。

答案 2 :(得分:0)

首先在子类中为msg设置一个值,因此默认情况下它不为null。

 Int Msg3 = 5;

以这种方式显示

System.out.println("Here is a msg:" + child.Msg4);
相关问题