站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题请帮我看看这个已经实例化对象为什么为空?

请帮我看看这个已经实例化对象为什么为空?

摘要: 请帮我看看这个已经实例化对象为什么为空?


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对象在实例化后怎么还是空的啊?


你那个"222222222",是在生成对象B 时打印出来的吧。而没有打印出"11111111",说明C的对象已经不是空了。


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


楼主,我修改了下你的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()方法结束时被回收了,
我的理解不一定正确
等高手来讨论:)


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


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


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



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]



楼上的想说明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好像没有被回收
高人请指点


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



呵呵 谢谢知道 问题所在了嘿嘿!


↑返回目录
前一篇: SimpleDateFormat的使用中的 问题
后一篇: The wrapper classes cannot be used like primitives这句话是什么意思