动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.JAVA内存泄漏,走开!.
.HelloWorld问题集精华.
.JAVA正则表达式4种常用功能.
.Java多线程编程基础之线程和多线.
.入门也流行简单 最简单的Spring入.
.增强的Windows窗体为.Net程序丰富.
.Java嵌入式开发之j2me--四.
.确保J2ME无线移动商业应用程序的.
.FileSystemObject 对象模型.
.利用DES加密算法保护Java源代码.
.如何把一图画变成图形界面的背景.
.Java虚拟机(JVM)对象创建浅析.
.Sequoia 2.5 发布-JD.
.Java混淆编译器.
.Struts 1.2.2 新功能全新体验.
.应用Java技术实现数据库应用系统.
.扩展JAAS实现类实例级授权.
.群组通讯工具JGroups 2.2.9.
.JBuilderX 常见问题FAQ.
.Java 与 XML 结合使用的心得体会.

基础入门:关于java数组的深度思考

发表日期:2008-1-5 |


    刚刚开始接触Java数组的人都会听到一句类似的话:java是纯面向对象的语言,他的数组也是一个对象。

    于是乎,我就按照一个对象的方式来使用数组,心安理得。直到我接触到C的数组后,才发现将数组作为一个类来使用在实现上是多么的“不自然”。

    首先我们看一下表面现象,数组创建的时候采用的是如下语句:

    MyClass[] arr = new MyClass[9];

    而普通类采用的是如下语句:

   MyClass obj = new MyClass();

   就是说,创建数组的时候不使用小括号传参。使得数组和普通类看起来就有很多不同,因为小括号里的参数是传递给构造方法的,进而让人感觉数组类是没有构造方法的。

    再往深了想,还有很多让人感觉不自然的东西。可以肯定的是,java确实将数组作为了一个类来处理。还是用上面的例子说明:

    可以通过以下方法得到MyClass[]的Class实例:

    arr.getClass()或MyClass[].class.这样,我就可以向数组类里面“窥探”了。

    Class clazz = MyClass[].class;
    System.out.println(clazz.getConstrUCtors()。length);

    打印出来的结果是0;证实数组类确实没有构造方法。

    假如强行执行clazz.newInstance();就会得到下面的错误。

    java.lang.InstantiationException: [Larraytest.MyClass;

    证实数组类不能够通过普通的反射方式来创建一个实例。

    再看看数组类的“庐山真面目”:

    System.out.println(clazz);

    输出是:

    [Larraytest.MyClass

    对Java Class文件结构稍有了结就知道,这个字符串的意思就是一个元素类型为arraytest.MyClass的一维数组。也就是说,数组类型不是和普通类一样,以一个全限定路径名+类名来作为自己的唯一标示的,而是以[+一个或者多个L+数组元素类全限定路径+类来最为唯一标示的。这个()也是数组和普通类的区别。而这个区别似乎在某种程度上说明数组和普通java类在实现上有很大区别。因为java虚拟机(java指令集)在处理数组类和普通类的时候,肯定会做出区分。我猜想,可能会有专门的java虚拟机指令来处理数组。

    既然我们可以得到数组的Class类实例,就说明肯定需要调用ClassLoader的defineClass(不一定非要是loadClass方法)方法,来构造一个Class实例。java虚拟机规范规定,任何一个可以被加载的类,假如其类文件存储在文件系统上,那么一个*.class文件只能存储一个类信息,也就是说,数组类的信息不可能以类文件的形式存储在本地磁盘上(否则任意一个类都要配有255个数组类了……),既然这样,那就说明java虚拟机肯定内置了一块用来声明数组类的数据(不管是几级数组)。这是符合java虚拟机规范的,规范规定class类数据可以来自任意介质,包括本地磁盘、网络、数据库、内存等等。

    分析到这里,我基本上可以肯定:java对数组对象化的操作的支持是指令级的,也就是说java虚拟机有专门针对数组的指令。数组的Class类实例是java虚拟机动态创建动态加载的,其结构与普通java类的Class实例有一些不同。

    JDK API中有一个java.lang.reflect.Array类,这个类提供了很多方法(绝大多数是native方法,这在另一个方面证实了java对数组的支持是专用指令支持的,否则用本地方法干嘛^_^),用来弥补我们对数组操作的局限性。

    下面这句话用来创建一个一维的、长度为10的、类型为arraytest.MyClass的数组:

    arraytest.MyClass[] arr = (arraytest.MyClass[]) Array.newInstance(arraytest.MyClass, 10);

    下面这句话用来创建一个二维的、3乘5的、类型为arraytest.MyClass的数组:

    int[] arrModel = new int[]{3,5};
    Object arrObj = Array.newInstance(Sub.class, arrModel);

    当然你可以用一个数组的引用指向上面的二维数组,这里我们用一个Object的引用指向他。

    使用的时候,我们也是可以利用Array类提供的方法来实现:

    System.out.println(Array.getLength(arrObj);//第一维长度为3
    System.out.println(Array.getLength(Array.get(arrObj, 2)));//第二维长度为5,这里假如写3,就会得到你意想之中的
    java.lang.ArrayIndexOutOfBoundsException


上一篇:“Mastering EJB” 第二版开始免费下载 人气:532
下一篇:*.JAR运行时全面的总结! 人气:1225
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号