仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1001|回复: 19
打印 上一主题 下一主题

[学习教程] 来看java的数组初始化

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:36:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。
在C中初始化数组极易堕落,并且相称贫苦。C++经由过程“汇合初始化”使其更平安(正文⑥)。Java则没有象C++那样的“汇合”观点,由于Java中的一切工具都是对象。但它的确有本人的数组,经由过程数组初始化来供应撑持。
数组代表一系列对象大概基础数据范例,一切不异的范例都封装到一同——接纳一个一致的标识符称号。数组的界说和利用是经由过程方括号索引运算符举行的([])。为界说一个数组,只需在范例名后复杂地跟从一对空方括号便可:
int[]al;
也能够将方括号置于标识符前面,取得完整分歧的了局:
intal[];
这类格局与C和C++程序员习气的格局是分歧的。但是,最“通畅”的大概仍是前一种语法,由于它指出范例是“一个int数组”。本书将相沿那种格局。
编译器不同意我们告知它一个数组有多年夜。如许便使我们回到了“句柄”的成绩上。此时,我们具有的统统就是指向数组的一个句柄,并且还没有给数组分派任何空间。为了给数组创立响应的存储空间,必需编写一个初始化表达式。关于数组,初始化事情可在代码的任何中央呈现,但也能够利用一种特别的初始化表达式,它必需在数组创立的中央呈现。这类特别的初始化是一系列由花括号关闭起来的值。存储空间的分派(等价于利用new)将由编译器在这类情形下举行。比方:
int[]a1={1,2,3,4,5};
那末为何还要界说一个没无数组的数组句柄呢?
int[]a2;
现实上在Java中,可将一个数组分派给另外一个,以是能利用下述语句:
a2=a1;
我们真正筹办做的是复制一个句柄,就象上面演示的那样:
  1. //:Arrays.java
  2. //Arraysofprimitives.
  3. publicclassArrays{
  4. publicstaticvoidmain(String[]args){
  5. int[]a1={1,2,3,4,5};
  6. int[]a2;
  7. a2=a1;
  8. for(inti=0;i<a2.length;i++)
  9. a2[i]++;
  10. for(inti=0;i<a1.length;i++)
  11. prt("a1["+i+"]="+a1[i]);
  12. }
  13. staticvoidprt(Strings){
  14. System.out.println(s);
  15. }
  16. }///:~
复制代码
人人看到a1取得了一个初始值,而a2没有;a2将在今后赋值——这类情形下是赋给另外一个数组。
这里也呈现了一些新工具:一切数组都有一个实质成员(不管它们是对象数组仍是基础范例数组),可对其举行查询——但不是改动,从而获知数组内包括了几个元素。这个成员就是length。与C和C++相似,因为Java数组从元素0入手下手计数,以是能索引的最年夜元素编号是“length-1”。如超越界限,C和C++会“冷静”地承受,并同意我们胡乱利用本人的内存,这恰是很多程序毛病的本源。但是,Java可保存我们这受这一成绩的伤害,办法是一旦凌驾界限,就天生一个运转期毛病(即一个“背例”,这是第9章的主题)。固然,因为必要反省每一个数组的会见,以是会损耗必定的工夫和过剩的代码量,并且没有举措把它封闭。这意味着数组会见大概成为程序效力低下的主要缘故原由——假如它们在关头的场所举行。但思索到因特网会见的平安,和程序员的编程效力,Java计划职员仍是应当把它看做是值得的。
程序编写时代,假如不晓得在本人的数组里必要几元素,那末又该怎样办呢?此时,只需复杂地用new在数组里创立元素。在这里,即便筹办创立的是一个基础数据范例的数组,new也能一般地事情(new不会创立非数组的基础范例):
  1. //:ArrayNew.java
  2. //Creatingarrayswithnew.
  3. importjava.util.*;
  4. publicclassArrayNew{
  5. staticRandomrand=newRandom();
  6. staticintpRand(intmod){
  7. returnMath.abs(rand.nextInt())%mod+1;
  8. }
  9. publicstaticvoidmain(String[]args){
  10. int[]a;
  11. a=newint[pRand(20)];
  12. prt("lengthofa="+a.length);
  13. for(inti=0;i<a.length;i++)
  14. prt("a["+i+"]="+a[i]);
  15. }
  16. staticvoidprt(Strings){
  17. System.out.println(s);
  18. }
  19. }///:~
复制代码
因为数组的巨细是随机决意的(利用新近界说的pRand()办法),以是十分分明,数组的创立实践是在运转时代举行的。除此之外,从这个程序的输入中,人人可看到基础数据范例的数组元素会主动初始化成“空”值(关于数值,空值就是零;关于char,它是null;而关于boolean,它倒是false)。
固然,数组大概已在不异的语句中界说和初始化了,以下所示:
int[]a=newint[pRand(20)];
若操纵的是一个非基础范例对象的数组,那末不管怎样都要利用new。在这里,我们会再一次碰到句柄成绩,由于我们创立的是一个句柄数组。请人人察看封装器范例Integer,它是一个类,而非基础数据范例:
  1. //:ArrayClassObj.java
  2. //Creatinganarrayofnon-primitiveobjects.
  3. importjava.util.*;
  4. publicclassArrayClassObj{
  5. staticRandomrand=newRandom();
  6. staticintpRand(intmod){
  7. returnMath.abs(rand.nextInt())%mod+1;
  8. }
  9. publicstaticvoidmain(String[]args){
  10. Integer[]a=newInteger[pRand(20)];
  11. prt("lengthofa="+a.length);
  12. for(inti=0;i<a.length;i++){
  13. a[i]=newInteger(pRand(500));
  14. prt("a["+i+"]="+a[i]);
  15. }
  16. }
  17. staticvoidprt(Strings){
  18. System.out.println(s);
  19. }
  20. }///:~
复制代码
在这儿,乃至在new挪用后才入手下手创立数组:
Integer[]a=newInteger[pRand(20)];
它只是一个句柄数组,并且除非经由过程创立一个新的Integer对象,从而初始化了对象句柄,不然初始化历程不会停止:
a=newInteger(pRand(500));
但如果健忘创立对象,就会在运转期试图读取空数组地位时取得一个“背例”毛病。
上面让我们看看打印语句中String对象的组成情形。人人可看到指向Integer对象的句柄会主动转换,从而发生一个String,它代表着位于对象外部的值。
亦可用花括号关闭列表来初始化对象数组。可接纳两种情势,第一种是Java1.0同意的独一情势。第二种(等价)情势自Java1.1才入手下手供应撑持:
  1. //:ArrayInit.java
  2. //Arrayinitialization
  3. publicclassArrayInit{
  4. publicstaticvoidmain(String[]args){
  5. Integer[]a={
  6. newInteger(1),
  7. newInteger(2),
  8. newInteger(3),
  9. };
  10. //Java1.1only:
  11. Integer[]b=newInteger[]{
  12. newInteger(1),
  13. newInteger(2),
  14. newInteger(3),
  15. };
  16. }
  17. }///:~
复制代码
这类做法年夜多半时分都很有效,但限定也是最年夜的,由于数组的巨细是在编译时代决意的。初始化列表的最初一个逗号是可选的(这一特征使长列表的保护变得加倍简单)。
数组初始化的第二种情势(Java1.1入手下手撑持)供应了一种更烦琐的语法,可创立和挪用办法,取得与C的“变量参数列表”(C一般把它简称为“变参表”)分歧的效果。这些效果包含未知的参数(自变量)数目和未知的范例(假如如许选择的话)。因为一切类终极都是从通用的根类Object中承继的,以是能创立一个办法,令其猎取一个Object数组,并象上面如许挪用它:
  1. //:VarArgs.java
  2. //UsingtheJava1.1arraysyntaxtocreate
  3. //variableargumentlists
  4. classA{inti;}
  5. publicclassVarArgs{
  6. staticvoidf(Object[]x){
  7. for(inti=0;i<x.length;i++)
  8. System.out.println(x[i]);
  9. }
  10. publicstaticvoidmain(String[]args){
  11. f(newObject[]{
  12. newInteger(47),newVarArgs(),
  13. newFloat(3.14),newDouble(11.11)});
  14. f(newObject[]{"one","two","three"});
  15. f(newObject[]{newA(),newA(),newA()});
  16. }
  17. }///:~
复制代码
此时,我们对这些未知的对象其实不能接纳太多的操纵,并且这个程序使用主动String转换对每一个Object做一些有效的事变。在第11章(运转期范例标识或RTTI),人人还会进修怎样查询拜访这类对象的正确范例,使本人能对它们做一些风趣的事变。
Java编译的是字节码,跟C++相反,启动不够快,效率不够高,难以精确控制内存,但是优点是编程比C++容易,代码比较安全但是容易留下性能隐患,跨平台靠字节码在各个平台复制(一处编译到处调试)
不帅 该用户已被删除
沙发
发表于 2015-1-21 10:57:45 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
活着的死人 该用户已被删除
板凳
 楼主| 发表于 2015-1-29 10:47:47 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
海妖 该用户已被删除
地板
发表于 2015-2-1 17:19:51 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
金色的骷髅 该用户已被删除
5#
发表于 2015-2-3 16:47:38 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-2-3 21:10:31 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
蒙在股里 该用户已被删除
7#
发表于 2015-2-6 16:48:07 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
第二个灵魂 该用户已被删除
8#
发表于 2015-2-9 07:32:56 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
小女巫 该用户已被删除
9#
发表于 2015-2-27 04:28:09 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
谁可相欹 该用户已被删除
10#
发表于 2015-3-3 14:48:41 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
山那边是海 该用户已被删除
11#
发表于 2015-3-8 17:31:56 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
飘灵儿 该用户已被删除
12#
发表于 2015-3-10 22:01:04 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
柔情似水 该用户已被删除
13#
发表于 2015-3-11 01:28:10 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
飘飘悠悠 该用户已被删除
14#
发表于 2015-3-15 22:24:25 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
莫相离 该用户已被删除
15#
发表于 2015-3-22 17:08:22 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
兰色精灵 该用户已被删除
16#
发表于 2015-3-27 00:11:09 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
若天明 该用户已被删除
17#
发表于 2015-4-1 17:24:49 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
精灵巫婆 该用户已被删除
18#
发表于 2015-4-10 10:12:01 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
19#
发表于 2015-4-17 02:05:05 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
老尸 该用户已被删除
20#
发表于 2015-4-21 06:08:59 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 07:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表