package chap14;interface Null{

}
class Person{
public  String first;      
public Person(){            
System.out.println("Pserson **");
}

public Person(String first){
System.out.println("Person");
this.first=first;
System.out.println(first);
}
}public class NullPerson extends Person implements Null {  
   public static  Person NULL=new NullPerson();
private NullPerson() {
   super("First");
System.out.println("NullPerson");


}
public String toString(){return "Null Person";}
   
public static void main(String[] args) {

       
}}
// 结果:
Person
First
NullPersonpublic static  Person NULL=new NullPerson();
从结果看,子类NullPerson 直接进了子类无参构造,然后进父类构造(反常),按常理应先进父类无参构造啊?
按理还应该报空指针异常?下面是原文代码,上面是我作的修改,对原文“通常,空对象是单例,因此这里将其作为静态final实例创建
,这可以正常工作”(Java 编程思想,p599,空对象) .对这句话很疑惑。
原先代码:
import net.mindview.util.*;class Person {
  public final String first;
  public final String last;
  public final String address;
  // etc.
  public Person(String first, String last, String address){
    this.first = first;
    this.last = last;
    this.address = address;
  }
  public String toString() {
    return "Person: " + first + " " + last + " " + address;
  }
  public static class NullPerson
  extends Person implements Null {
    private NullPerson() { super("None", "None", "None"); }
    public String toString() { return "NullPerson"; }
  }
  public static final Person NULL = new NullPerson();
} ///:~*/

解决方案 »

  1.   

    从结果看,子类NullPerson 直接进了子类无参构造,然后进父类构造(反常),按常理应先进父类无参构造啊?
    按理还应该报空指针异常?1. 你子类无参构造第一句就是调用父类有有参构造,怎么会进父类无参构造呢?2. 不知道按什么理,哪里应该报空指针?
      

  2.   

    Person
    First
    这难道不是从父类无参构造输出的!
      

  3.   

    private NullPerson() {
           super("First");
            System.out.println("NullPerson");
        
            
        }
    子类NullPerson有显示调用父类的有参构造方法,
     public Person(String first){
            System.out.println("Person");
            this.first=first;
            System.out.println(first);
        }
      

  4.   

    楼主说
    public static  Person NULL=new NullPerson();
    从结果看,子类NullPerson 直接进了子类无参构造,然后进父类构造(反常),按常理应先进父类无参构造啊?
    按理还应该报空指针异常?1.执行
    public static  Person NULL=new NullPerson();
    当然是先进入子类的构造函数了
    你子类的构造函数里,又调用了父类带参数的构造函数
    super("First");这时候,执行
    public Person(String first){
            System.out.println("Person");
            this.first=first;
            System.out.println(first);
        }然后通过打印可以看到结果,没有什莫问题啊2.楼主说 按理还应该报空指针异常?
    哪里应该空指针异常阿