快速业务通道

通过实例学习Java对象的构造过程 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22

通过实例学习Java对象的构造过程

时间:2010-12-31

本文提供一个项目中的错误实例,提供对其观察和分析,揭示出Java语言实例化一个对象具体过程,最后总结出设计Java类的一个重要规则。通过阅读本文,可以使Java程序员理解Java对象的构造过程,从而设计出更加健壮的代码。本文适合Java初学者和需要提高的Java程序员阅读。

程序掷出了一个异常

作者曾经在一个项目里面向项目组成员提供了一个抽象的对话框基类,使用者只需在子类中实现基类的一个抽象方法来画出显示数据的界面,就可使项目内的对话框具有相同的风格。具体的代码实现片断如下(为了简洁起见,省略了其他无关的代码):

public abstract class BaseDlg extends JDialog { public BaseDlg(Frame frame, String title) { super(frame, title, true); this.getContentPane().setLayout(new BorderLayout()); this.getContentPane().add(createHeadPanel(), BorderLayout.NORTH); this.getContentPane().add(createClientPanel(), BorderLayout.CENTER); this.getContentPane().add(createButtonPanel(), BorderLayout.SOUTH); } private JPanel createHeadPanel() { ... // 创建对话框头部 } // 创建对话框客户区域,交给子类实现 protected abstract JPanel createClientPanel(); private JPanel createButtonPanel { ... // 创建按钮区域 } }

这个类在有的代码中工作得很好,但一个同事在使用时,程序却掷出了一个NullPointerException违例!经过比较,找出了工作正常和不正常的程序的细微差别,代码片断分别如下:

一、正常工作的代码:

public class ChildDlg1 extends BaseDlg {   JTextField jTextFieldName;   public ChildDlg1() {    super(null, "Title");   }   public JPanel createClientPanel() {    jTextFieldName = new JTextField();    JPanel panel = new JPanel(new FlowLayout());    panel.add(jTextFieldName);    ... // 其它代码    return panel;   }   ... } ChildDlg1 dlg = new ChildDlg1(frame, "Title"); // 外部的调用

二、工作不正常的代码:

public class ChildDlg2 extends BaseDlg {   JTextField jTextFieldName = new JTextField();   public ChildDlg2() {    super(null, "Title");   }   public JPanel createClientPanel() {    JPanel panel = new JPanel(new FlowLayout());    panel.add(jTextFieldName);    ... // 其它代码    return panel;   }   ... } ChildDlg2 dlg = new ChildDlg2(); // 外部的调用

你看出来两段代码之间的差别了吗?对了,两者的差别仅仅在于类变量jTextFieldName的初始化时间。经过跟踪,发现在执行panel.add(jTextFieldName)语句之时,jTextFieldName确实是空值。

我们知道,Java允许在定义类变量的同时给变量赋初始值。系统运行过程中需要创建一个对象的时候,首先会为对象分配内存空间,然后在“先于调用任何方法之前”根据变量在类内的定义顺序来初始化变量,接着再调用类的构造方法。那么,在本例中,为什么在变量定义时便初始化的代码反而会出现空指针违例呢?

通过实例学习Java对象的构造过程(2)

时间:2010-12-31

对象的创建过程和初始化

实际上,前面提到的“变量初始化发生在调用任何方法包括构造方法之前”这句话是不确切的,当我们把眼光集中在单个类上时,该说法成立;然而,当把视野扩大到具有继承关系的两个或多个类上时,该说法不成立。

对象的创建一般有两种方式,一种是用new操作符,另一种是在一个Class对象上调用newInstance方法;其创建和初始化的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号