public class A{
   public A(){
   create();
   }
    protected void create(){}
}public class B extends A{
    private C  c = null;     public B(){
   super();
       if(c==null){
System.out.println("22222222");
}
   }
    
  protected void create(){
System.out.println("create");
    c = new C();
       if(c==null){
System.out.println("1111111111");
}}
   
}测试的时候打印的是"create","222222222"
请问是为什么啊? c对象在实例化后怎么还是空的啊?

解决方案 »

  1.   

    是啊 但是后来在B的构造函数里判断c是否为NULL 这时应该不是空的了啊?
      

  2.   

    楼主,我修改了下你的B类(把c设为String型):
    public class B extends A{
        private String  c = null;     public B(){
       super();
    System.out.println("在构造函数B()中c指向的字符串:"+c);
           if(c==null){
    System.out.println("22222222");
    }
           
       }  protected void create(){
    System.out.println("create");
        c = new String("***********");
           if(c==null){
    System.out.println("1111111111");
    }
    System.out.println("在Creat()方法中c指向的字符串:"+c);
    }
    public String getc(){
        return c;
    }
    }得到输出结果:
    create
    在Creat()方法中c指向的字符串:***********
    在构造函数B()中c指向的字符串:null
    22222222
    null这样就看明白了程序的执行过程
    尤其是在测试类中调用getc()方法得到c的值仍然为null
    我认为可能在create()方法中为c申请的空间在create()方法结束时被回收了,
    我的理解不一定正确
    等高手来讨论:)
      

  3.   

    我也是这么认为的 在create()调用完毕以后 就把c的引用给回收了 但如果在基类A的构造方法里去掉create()方法 直接在B类的构造方法里调用create()方法 这时c就不为null! 请高手解答让我们一起都学习哈 呵呵 !
      

  4.   

    这个例子很有启发性阿
    如果自己写基类的话,基类调用基类的方法时,最好是private否则,给别人用可能造成错误
    class A{
       public f(){
        f1();
       }
       private f1(){}
    }
    如果f1不过private的话
    子类复写了f1()并且调用父类方法f(),就可能执行的不是本来需要的结果了。
    当然也可以特地设计成这样。
      

  5.   

    我是写一个GUI的截面为了重用所以分为top,centenr,bottom三快
    因为top和bottom是一样的 所以我就想让子类继承这个基类重载创建centenr的方法就行了 
    在基类的构造方法里
    public class A{
        public A(){
          top();
          center();
         bottom();
    }
    }我就想在父类里统一调度 子类就实现这个方法创建想应的对象?
      

  6.   

    import java.util.Date;
    public class ClassA {

    Date father_date=new java.util.Date();
    public ClassA(){
    init();
    try {
    Thread.sleep(3000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    public void init(){
    }
    }
    import java.util.Date;
    public class ClassB extends ClassA{
    public  Date son_date=new java.util.Date();//###语句
    public ClassB(){

    super();

    //由执行结果可以看出此处进行了子类ClassB初始化,执行了以上###语句

    System.out.println("son.constructor()里son_date=["+son_date+"]");
    try {
    Thread.sleep(3000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    }
    public void init(){
    father_date = new java.util.Date();
    son_date = new java.util.Date();
    System.out.println("son.init()里father_date=["+father_date+"]");
    System.out.println("son.init()里son_date=["+son_date+"]");
    }
    public static void main(String[] args){
    ClassB classb = new ClassB();
    System.out.println("main()里father_date=["+classb.father_date+"]");
    System.out.println("main()里son_date=["+classb.son_date+"]");
    }
    }执行结果
    son.init()里father_date=    [Thu Nov 02 22:03:53 CST 2006]
    son.init()里son_date=       [Thu Nov 02 22:03:53 CST 2006]
    son.constructor()里son_date=[Thu Nov 02 22:03:56 CST 2006]
    main()里father_date=        [Thu Nov 02 22:03:53 CST 2006]
    main()里son_date=           [Thu Nov 02 22:03:56 CST 2006]
      

  7.   

    楼上的想说明son_date被处理了2次? 
    1次在superclass初始化的时候
    1次在subclass初始化的时候把楼上的code改了下 如下:
    public class ClassB extends ClassA{
    //public  Date son_date=new java.util.Date();//###语句
             // 把上面初始化的部分去掉
             public  Date son_date;发现初始化的时间都变一样的了  这个结果好像和asmetoyou,zhangbo198294两位的结果相悖,son_data好像没有被回收
    高人请指点
      

  8.   

    晕死 搂主啊 被你害死
    超类初始好后 就初始子类 然后执行
    private String  c = null;
    本来初始好的又被清空
    也怪我不好 没看清 郁闷 还以为碰到知识盲点了呢
    撞石头去鸟