进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 网站开发 -> JSP -> 文章内容  
Java 类中类属性和对象属性的初始化顺序

边城狂人

Java 类中类属性 (static 变量) 和对象属性 (非 static 变量) 的初始化顺序可以用如下程序测试:

/**
* @(#) Test.java
* @author fancy
*/

public class Test {

static String a = "string-a";
static String b;

String c = "stirng-c";
String d;

static {
printStatic("before static");
b = "string-b";
printStatic("after static");
}

public static void printStatic(String title) {
System.out.println("---------" + title + "---------");
System.out.println("a = \"" + a + "\"");
System.out.println("b = \"" + b + "\"");
}

public Test() {
print("before constructor");
d = "string-d";
print("after constructor");
}

public void print(String title) {
System.out.println("---------" + title + "---------");
System.out.println("a = \"" + a + "\"");
System.out.println("b = \"" + b + "\"");
System.out.println("c = \"" + c + "\"");
System.out.println("d = \"" + d + "\"");
}

public static void main(String[] args) {
new Test();
}

}

首先,我把 main() 方法注释掉,运行结果如下:

---------before static---------
a = "string-a"
b = "null"
---------after static---------
a = "string-a"
b = "string-b"
java.lang.NoSuchMethodError: main
Exception in thread "main"
Process completed.

然后,取消对 main() 方法的注释,运行结果如下:

---------before static---------
a = "string-a"
b = "null"
---------after static---------
a = "string-a"
b = "string-b"
---------before constructor---------
a = "string-a"
b = "string-b"
c = "stirng-c"
d = "null"
---------after constructor---------
a = "string-a"
b = "string-b"
c = "stirng-c"
d = "string-d"

由此可以看出 Java 类属性和对象属性的初始化顺序如下:

① 类属性 (静态变量) 定义时的初始化,如上例的 static String a = "string-a";
② static 块中的初始化代码,如上例 static {} 中的 b = "string-b";
③ 对象属性 (非静态变量) 定义时的初始化,如上例的 String c = "stirng-c";
④ 构造方法 (函数) 中的初始化代码,如上例构造方法中的 d = "string-d";

在此过程中 ② 和 ③ 的顺序无所确定,因为在静态块中无法打印出非静态变量。同样是因为这个原因,知道他们的顺序对我们写程序也毫无帮助。再因为类成员 (静态成员) 是在第一次使用到类的时候就进行了相应的初始化,而对象成员 (非静态成员) 则需要生成类实例 (即对象) 时才能初始化,所以我把 ③ 排在了 ② 的后面。再申明一次,它们究竟谁先谁后,从代码上是不能确定的,恐怕需要去研究一下 JVM (Java 虚拟机) 的执行过程才行。


以下是一些回帖的讨论:
我对狂人教程"对象成员 (非静态成员) 则需要生成类实例 (即对象) 时才能初始化"有些看法!例如你在例程中定义的两个对象成员变量String c = "stirng-c";
String d;我认为当程序执行这个Test类的时候,成员变量(不包括构造函数)和类成员变量一样,都要装载到内存。这样对象成员变量就可以被构造函数所调用。但是究竟静态变量和非静态变量哪个先执行可以看在代码中的先后顺序,但是这对于编写代码来说并没有多大的用处!
--小猪努努
static
{
printStatic("before static");
b = "string-b";
printStatic("after static");
}在類別第一次使用而載入時執行,且只執行一次。。。。。
--caterpillar

在百度中搜索:Java 类中类属性和对象属性的初始化顺序
在Google中搜索:Java 类中类属性和对象属性的初始化顺序
在Yahoo中搜索:Java 类中类属性和对象属性的初始化顺序

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· Linux操作系统下的三种Java环境配置方法
· 面向Java程序员的db4o指南: 数组和集合
· Java与.NET 谁才能主宰未来?
· Java编程技术中汉字问题的分析及解决
· Java 泛型的理解与等价实现
· 在Java中利用JCOM实现仿Excel编程详解
· [图文] Java小技巧:关于Cookie的操作
· Java中消除实现继承和面向接口编程
· Java实战篇:设计自己的Annotation
· 使用Java程序的泛型应该注意的几个地方
 
· 提升JSP页面响应速度的七大秘籍绝招
· 开发一个调试JSP的Eclipse插件
· JSP报表打印的一种简单解决方案
· JSP/Servlet的重定向技术综述
· java的md5加密类(zt)
· 一个用来访问http服务器的东西。功能类似..
· 菜鸟调试手记一(sql server 中文问题)
· Java性能优化技巧集锦(2)
· 用java压缩文件示例(没有中文问题)
· 使用XML/HTC/DHTML模拟标准Windows菜单

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)