第1章声明和访问控制1.目标一创建数组(1)数组Java中的数组跟C/C++这些语言中的数组的语法结构很相似。但是,Java去掉了C/C++中的可以通过[]或者使用指针来访问元素的功能。这种在C/C++中被普遍接受的功能虽然强大,但是也让Bug横行的软件更容易出现。因为Java不支持这种直接通过指针来操纵数据,这类的Bug也被消除了。数组是一类包含被称为元素的值的对象。这就为你在程序中移动或保存一组数据以很方便的支持,并且允许你根据需要访问和改变这些值。用一个小例子来说:你可以创建一个String类型的数组,每一个都包含一个运动队队员名字。数组可以传送给一个需要访问每个队员名字的方法。如果一个新队员加入,其中一个老队员的名字可以被修改成新队员的名字。这就显得比player1、player2、player3等等很随意的不相关的变量方便很多。跟变量通过变量名来访问不同的是,元素通过从0开始的数字来访问。因此,你可以一个个的访问数组的每个元素。数组跟对象很相似,它们都是用new关键字来创建,并且有属于主要父对象类的方法。数组可能存储简单类型或者对象的引用。数组的每个元素必须是同一类型的。元素的类型在数组被声明时确定。如果你需要存储不同类型元素的方式,你可以选择collection类,collection类是Java2考试中的新增的考点,我们将会在第十部分讨论它。你可以用数组来存储对象的句柄,你能像使用其它任意对象引用一样访问,摘录或者使用它。(2)声明但不分配空间声明一个数组不需分配任何存储空间,它仅仅是代表你试图创建一个数组。跟C/C++声明一个数组的明显区别就是空间的大小没有被特别标识。因此,下面的声明将会引起一个编译期错误。intnum[5];一个数组的大小将在数组使用new关键字真正创建时被给定,例如:intnum[];num=newint[5];你可以认为命令new的使用跟初始化一个类的实例的使用是类似的。例子中数组名num说明数组大小可以是任意大小的整形数据。(3)同时声明和创建数组这个例子也可以使用一行语句完成:intnum[]=newint[5];方括号也可以放在数据类型后面或者数组名后面。下面的两种都是合法的:int[]num;intnum[];你可以读作:一个名字为num的整型数组一个数据类型为整型名字为num的数组(4)Java和C/C++数组的比较Java数组知道它的大小,并且Java语言支持对意外的移动到数组末端的保护。如果你从VisualBasic背景下转到Java开发,并且还不习惯于一直从0开始计数,这点是很方便的。这也可以帮你避免一些在C/C++程序中很难发现的错误,例如移动到了数组末端并且指向了任意内存地址。例如,下面的程序会引起一个ArrayIndexOutOfBoundsException异常。int[]num=newint[5];for(inti=0;i6;i++){num[i]=i*2;}访问一个Java数组的标准习惯用法是使用数组的length成员例如:int[]num=newint[5];for(inti=0;inum.length;i++){num[i]=i*2;}(5)数组知道它的大小假如你跳过了C/C++的对照,Java中的数组总是知道它们的大小,这表现在length字段。因此,你可以通过下面的语句动态移动数组:intmyarray[]=newint[10];for(intj=0;jmyarray.length;j++){myarray[j]=j;}注意,数组有length字段,而不是length()方法。当你开始用一组字符串的时候,你会像s.length()这样使用字符串的length方法。数组中的length是域(或者说特性)而不是方法。(6)Java数组和VisualBasic数组的对照Java中的数组总是从0开始。如果使用了Optionbase声明,VisualBasic可能从1开始。Java中没有跟VisualBasic中可以使你不删除内容就改变数组大小的redimpreserve命令等价的语句。但你可以建立一个同样大小的新数组,并且复制现有元素到里面。一个数组声明可以有多个方括号。Java形式上不支持多维数组,但是它可以支持数组的数组,就是我们常说的嵌套数组。C/C++中那样的多维数组和嵌套数组的最主要区别就是,每个数组不需要有同样的长度。如果你将一个数字当作一个矩阵,矩阵不一定是矩形。按照Java语言规范:“括号里的数指明了数组嵌套的深度”在其他语言中,就要跟数组的维度相符。因此,你可以建立一个类似于下面的形式的二维数组:inti[][];第一个维度可以匹配X,第二个维度可以匹配Y。(7)声明和初始化相结合一个数组可以通过一个语句来创建并初始化,这就代替了通过数组循环来初始化的方式。这种方法很适合小数组。下面的语句创建了一个整型数组并且赋值为0到4:intk[]=newint[]{0,1,2,3,4};注意,你没有必要确定数组元素的数量。你可能在测验中被问到下面的语句是不是正确的问题:intk=newint[5]{0,1,2,3,4}//Wrong,willnotcompile!你可以创建数组的同时确定任何数据类型,因此,你可以创建一个类似于下面形式的字符串数组:Strings[]=newString[]{Zero,One,Two,Three,Four};System.out.println(s[0]);这句将会输出String[0]。(8)数组的默认值不同于其他语言中的变量在类级别创建和本地方法级别创建有不同的动作,Java数组总是被设定为默认值。无论数组是否被创建了,数组中的元素总是设为默认值。因此,整型的数组总是被置0,布尔值总是被置false。下面的代码编译时不会出错,并且输出0。publicclassArrayInit{publicstaticvoidmain(Stringargv[]){int[]ai=newint[10];System.out.println(ai[0]);}}问题问题1)怎样通过一个语句改变数组大小同时保持原值不变?1)UsethesetSizemethodoftheArrayclass2)UseUtil.setSize(intiNewSize)3)usethesize()operator4)Noneoftheabove问题2)你想用下面的代码查找数组最后一个元素的值,当你编译并运行它的时候,会发生什么?publicclassMyAr{publicstaticvoidmain(Stringargv[]){int[]i=newint[5];System.out.println(i[5]);}}1)Compilationandoutputof02)Compilationandoutputofnull3)CompilationandruntimeException4)Compiletimeerror问题3)作为一个好的Java程序员,你已忘记了曾经在C/C++中知道的关于数组大小信息的知识。如果你想遍历一个数组并停止在最后一个元素处。你会使用下面的哪一个?1)myarray.length();2)myarray.length;3)myarray.size4)myarray.size();问题4)你的老板为了你写出了HelloWorld而很高兴地为你升职了,现在她给你分配了一个新任务,去做一个踢踏舞游戏(或者我小时候玩的曲棍球游戏)。你认为你需要一个多维数组,下面哪一个能做这个工作?1)inti=newint[3][3];2)int[]i=newint[3][3];3)int[][]i=newint[3][3];4)inti[3][3]=newint[][];问题5)你希望找到一个更优雅的方式给你的数组赋值而不使用for循环语句,下面的哪一个能做到?1)myArray{[1]=One;[2]=Two;[3]=Three;}2)Strings[5]=newString[]{Zero,One,Two,Three,Four};3)Strings[]=newString[]{Zero,One,Two,Three,Four};4)Strings[]=newString[]={Zero,One,Two,Three,Four};问题6)当你试着编译运行下面的代码的时候,可能会发生什么?publicclassArdec{publicstaticvoidmain(Stringargv[]){Ardecad=newArdec();ad.amethod();}publicvoidamethod(){intia1[]={1,2,3};int[]ia2={1,2,3};intia3[]=newint[]{1,2,3};System.out.print(ia3.length);}}1)Compiletimeerror,ia3isnotcreatedcorrectly2)Compiletimeerror,arraysdonothavealengthfield3)Compilationbutnooutput4)Compilationandoutputof3答案答案1)4)Noneoftheabove你不能改变一个数组的大小。你需要创建一个不同大小的临时数组,然后将原数组中的内容放进去。Java支持能够改变大小的类的容器,例如Vector或者collection类的一个成员。答案2)3)CompilationandruntimeException当你试着移动到数组的末端的时候,你会得到一个运行时错误。因为数组从0开始索引,并且最后一个元素是i[4]而不是i[5]。答案3)2)myarray.length;答案4)3)int[][]i=newint[3][3];答案5)3)Strings[]=newString[]{Zero,One,Two,Three,Four};答案6)4)Compilationandoutputof3所有的数组的声明都是正确的。如果你觉得不太可能,可以自己编译这段代码。2.目标二定义类和变量定义类,内部类,方法,实例变量,静态变量和自动(本地方法)变量,需要合适的选用允许的修饰词。(例如public,final,static,abstract诸如此类)。这些修饰词或者单独使用或者联合使用,定义了包的关系。(1)本目标需要注意的我发现目标中用了“诸如此类”,这让我有些烦恼,我想你需要弄明白下面词的意思:nativetransientsynchronizedvolatile(2)什么是类?一个类的的定义把它很生硬描述为“方法和数据的集合”。它把面向对象编程出来之前的编程思想结合起来,这对理解该概念很有帮助。在类和面向对象程序设计前的主要概念是结构化程序设计。结构化程序设计的理念是程序员将复杂问题划分为小块的代码,一般称为函数或子程序。这符合“做一件很大很复杂的事情的好办法是把它分成一系列比较小但更容易管理的问题”的理念。尽管结构化程序设计在管理复杂性方面很有用,但它不能容易的解决代码重用问题。程序员发现他们总是“重复发明”轮子。在试着对现实物理对象的思考中,程序设计方面的思想家找到了面向对象的理念(有时被称为OO)。举例来说,一个计算机厂商准备生产一种新型个人电脑,如果计算机厂商使用类似于程序设计的方式的话,就要求他建立新团队来设计新CPU芯片,新声卡,没准还需要另一个团队设计规划制造新的主板。事实上,这根本不可能出现。由于电脑组件接口的标准化,计算机厂商只需要联系配件供应商,并商议好他们要生产的新型号的说明书就行了。注意组件接口标准化的重要性。(3)比较C++/VB和Java的类因为Java被设计成容易让C++程序员学习的语言,因此两种语言在处理类上有很多相似的地方。C++和Java都有继承,多态和数据隐藏特性,并使用显式的修饰词。有一些不同也是因为使Java更容易学习和使用。C++语言实现了多态继承,这样,一个类就可以比一个的父类(或