题目:定义丈夫类Husband,妻子类Wife,丈夫类的属性包括:身份证号、姓名、出生日期,妻子;妻子类的属性包括:身份证号、姓名、出生日期、丈夫。分别给这两个类提供构造方法(包括无参的构造方法和有参的构造方法),编写测试程序,创建丈夫和妻子对象,并通过丈夫对象访问到妻子对象中的name属性,相反亦成功获取,并对执行过程进行内存分析,分析怎样会产生空指针异常。
首先对题目进行分析,共有三个类,husband类、wife类、test测试类。
husband:id、name、date、Wife类型的引用,有参和无参的构造方法,各属性的get和set方法
wife:id、name、date、Husband类型的引用,有参和无参的构造方法,各属性的get和set方法
test测试类:创建对象,通过设置对象内的引用的内容完成对象之间的关联,通过引用获取信息并完成控制台的输出操作
那么可能会有一点困惑,就是每个类都有引用,那么二者存在一个相互引用的关系,到底是先有妻子还是先有丈夫,为了打破这种僵局,我们可以先创建一个妻子对象A,暂时令其中的Husband类型的引用为空,然后创建丈夫对象B,对象中的Wife类型的引用指向妻子A,此时丈夫对象和妻子对象都已经存在,并且建立了丈夫对妻子的关联,丈夫对象信息已经完整,通过妻子对象调用方法,将其内部的引用设置为指向丈夫对象B,这样二者之间的关系就良好建立了。
也可以理解为:
妻子没有丈夫——>丈夫追妻——>妻子接受丈夫
代码如下所示:
Husband类:
package home; import java.util.Date; public class husband { private String id; private String name; private String date; private wife wife; public husband(){ } public husband(String id,String name,String date,wife wife){ this.id=id; this.name=name; this.date=date; this.wife=wife; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public home.wife getWife() { return wife; } public void setWife(home.wife wife) { this.wife = wife; } }
Wife类:
package home; import java.util.Date; public class wife { private String id; private String name; private String date; private husband husband; public wife(){ } public wife(String id,String name,String date,husband husband){ this.id=id; this.name=name; this.date=date; this.husband= husband; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public home.husband getHusband() { return husband; } public void setHusband(home.husband husband) { this.husband = husband; } }
测试类:
package home; public class test { public static void main(String[] args) { husband husband; //妻子没有丈夫 wife wife = new wife("002","西施","20220302",null); //丈夫追妻 husband=new husband("001","陈玄","20220302",wife); //妻子接受丈夫 wife.setHusband(husband); System.out.println("妻子"+husband.getWife().getName()+"的丈夫是"+wife.getHusband().getName()); } }
对以上的程序运行进行内存图的分析:
怎么样会产生空指针异常?
当一个空的引用访问与实例相关的数据时,一定会产生空指针异常,所以上述程序中,要注意在指针被赋予对象的内存单元地址之前,不要去引用相关的成分。