我试图理解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会以这种方式表现出来?
谢谢....
答案 0 :(得分:1)
您尚未初始化Msg2
和Msg3
。您需要使用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);