仓酷云
标题:
JAVA教程之关于java数组的深度思索
[打印本页]
作者:
不帅
时间:
2015-1-18 11:16
标题:
JAVA教程之关于java数组的深度思索
Java编译的是字节码,跟C++相反,启动不够快,效率不够高,难以精确控制内存,但是优点是编程比C++容易,代码比较安全但是容易留下性能隐患,跨平台靠字节码在各个平台复制(一处编译到处调试)数组 方才入手下手打仗java数组的人城市听到一句相似的话:java是纯面向对象的言语,他的数组也是一个对象。因而乎,笔者就依照一个对象的体例来利用数组,问心无愧。直到我打仗到C的数组后,才发明将数组作为一个类来利用在完成上是何等的“不天然”。
起首我们看一下外表征象,数组创立的时分接纳的是以下语句:
MyClass[]arr=newMyClass[9];
而一般类接纳的是以下语句:
MyClassobj=newMyClass();
就是说,创立数组的时分不利用小括号传参。使得数组和一般类看起来就有良多分歧,由于小括号里的参数是传送给机关办法的,进而让人感到数组类是没有机关办法的。
再往深了想,另有良多让人感到不天然的工具。能够一定的是,java的确将数组作为了一个类来处置。仍是用下面的例子申明:
能够经由过程以下办法失掉MyClass[]的Class实例:arr.getClass()或MyClass[].class。如许,我就能够向数组类内里“窥伺”了。
Classclazz=MyClass[].class;
System.out.println(clazz.getConstructors().length);
打印出来的了局是0;证实数组类的确没有机关办法。
假如强行实行clazz.newInstance();就会失掉上面的毛病。
java.lang.InstantiationException:[Larraytest.MyClass;
证实数组类不克不及够经由过程一般的反射体例来创立一个实例。
再看看数组类的“庐山真脸孔”:
System.out.println(clazz);
输入是:
[Larraytest.MyClass
对JavaClass文件布局稍有了却就晓得,这个字符串的意义就是一个元素范例为arraytest.MyClass的一维数组。也就是说,数组范例不是和一般类一样,以一个全限制路径名+类名来作为本人的独一标示的,而是以[+一个大概多个L+数组元素类全限制路径+类来最为独一标示的。这个()也是数组和一般类的区分。而这个区分仿佛在某种水平上申明数组和一般java类在完成上有很年夜区分。由于java假造机(java指令集)在处置数组类和一般类的时分,一定会做出辨别。笔者料想,大概会有专门的java假造机指令来处置数组。
既然我们能够失掉数组的Class类实例,就申明一定必要挪用ClassLoader的defineClass(纷歧定非如果loadClass办法)办法,来机关一个Class实例。java假造机标准划定,任何一个能够被加载的类,假如其类文件存储在文件体系上,那末一个*.class文件只能存储一个类信息,也就是说,数组类的信息不成能以类文件的情势存储在当地磁盘上(不然恣意一个类都要配有255个数组类了.....),既然如许,那就申明java假造机一定内置了一块用来声明数组类的数据(不论是几级数组)。这是切合java假造机标准的,标准划定class类数据能够来自恣意介质,包含当地磁盘、收集、数据库、内存等等。
剖析到这里,我基础上能够一定:java对数组对象化的操纵的撑持是指令级的,也就是说java假造机有专门针对数组的指令。数组的Class类实例是java假造灵活态创立静态加载的,其布局与一般java类的Class实例有一些分歧。
JDKAPI中有一个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=newint[]{3,5};
ObjectarrObj=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
打印了局是如我们所想的:
3
5
关于数组的Class类实例,另有一些奇异的征象:
在运转代码java.lang.reflect.Fieldfieldarr=clazz.getField("length");的时分,会抛出非常:java.lang.NoSuchFieldException:length,这仿佛在说数组类没有length这个域,而这个域实际上是我们用的最多的一个(也就是说这个域是一定存在的)。笔者以为关于数组的Class类实例、数组的完成等,另有良多“猫腻”在内里。
特地说一句,java数组最多只能是255维的。这个让人看到了C的影子,嘿嘿。“Java把数组看成一个java类来处置”提及来简单,用起来天然,可是细细想来,仍是有良多不复杂的中央。
自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。
作者:
因胸联盟
时间:
2015-1-19 19:30
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者:
爱飞
时间:
2015-1-24 15:39
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者:
只想知道
时间:
2015-2-1 23:09
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者:
灵魂腐蚀
时间:
2015-2-7 15:48
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者:
兰色精灵
时间:
2015-2-12 06:51
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者:
分手快乐
时间:
2015-3-2 23:46
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
作者:
飘灵儿
时间:
2015-3-4 10:03
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者:
莫相离
时间:
2015-3-6 17:41
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
作者:
海妖
时间:
2015-3-9 00:49
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者:
精灵巫婆
时间:
2015-3-11 10:18
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者:
蒙在股里
时间:
2015-3-18 04:47
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者:
乐观
时间:
2015-3-25 12:05
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2