- SCJP 认证考试指南
- SCJP – Sun Certified Java Programmer (Sun Java 程序员认证)
- 第1 章 声明和访问控制
- 目标一 创建数组
- 数组
- Java 中的数组跟C/C++这些语言中的数组的语法结构很相似。但是,Java 去掉了C/C++中的可以通过[]或者使用指针来访问元素的功能。这种在C/C++中被普遍接受的功能虽然强大,但是也让Bug 横行的软件更容易出现。因为Java 不支持这种直接通过指针来操纵数据,这类的Bug 也被消除了。
- 数组是一类包含被称为元素的值的对象。这就为你在程序中移动或保存一组数据以很方便的支持,并且允许你根据需要访问和改变这些值。用一个小例子来说:你可以创建一个String 类型的数组,每一个都包含一个运动队队员名字。数组可以传送给一个需要访问每个队员名字的方法。如果一个新队员加入,其中一个老队员的名字可以被修改成新队员的名字。这就显得比player1、player2、player3 等等很随意的不相关的变量方便很多。跟变量通过变量名来访问不同的是,元素通过从0 开始的数字来访问。因此,你可以一个个的访问数组的每个元素。
- 数组跟对象很相似,它们都是用new 关键字来创建,并且有属于主要父对象类的方法。数组可能存储简单类型或者对象的引用。
- 数组的每个元素必须是同一类型的。元素的类型在数组被声明时确定。如果你需要存储不同类型元素的方式,你可以选择collection 类,collection 类是Java2 考试中的新增的考点,我们将会在第十部分讨论它。你可以用数组来存储对象的句柄,你能像使用其它任意对象引用一样访问,摘录或者使用它。
- 声明但不分配空间
- 声明一个数组不需分配任何存储空间,它仅仅是代表你试图创建一个数组。跟C/C++声明一个数组的明显区别就是空间的大小没有被特别标识。因此,下面的声明将会引起一个编译期错误。
- int num[5];
- 一个数组的大小将在数组使用new 关键字真正创建时被给定,例如:
- int num[];
- num = new int[5];
- 你可以认为命令new 的使用跟初始化一个类的实例的使用是类似的。例子中数组名num说明数组大小可以是任意大小的整形数据。
- 同时声明和创建数组
- 这个例子也可以使用一行语句完成:
- int num[] = new int[5];
- 方括号也可以放在数据类型后面或者数组名后面。下面的两种都是合法的:
- int[] num;
- int num[];
- 你可以读作:
- 一个名字为num 的整型数组
- 一个数据类型为整型名字为num 的数组
- Java 和C/C++数组的比较
- Java 数组知道它的大小,并且Java 语言支持对意外的移动到数组末端的保护。
- 如果你从Visual Basic 背景下转到Java 开发,并且还不习惯于一直从0 开始计数,这点是很方便的。这也可以帮你避免一些在C/C++程序中很难发现的错误,例如移动到了数组末端并且指向了任意内存地址。
- 例如,下面的程序会引起一个ArrayIndexOutOfBoundsException 异常。
- int[] num= new int[5];
- for(int i =0; i<6; i++){
- num[i]=i*2;
- }
- 访问一个Java 数组的标准习惯用法是使用数组的length 成员
- 例如:
- int[] num= new int[5];
- for(int i =0; i<num.length; i++){
- num[i]=i*2;
- }
- 数组知道它的大小
- 假如你跳过了C/C++的对照,Java 中的数组总是知道它们的大小,这表现在length 字段。
- 因此,你可以通过下面的语句动态移动数组:
- int myarray[]=new int[10];
- for(int j=0; j<myarray.length;j++){
- myarray[j]=j;
- }
- 注意,数组有length 字段,而不是length()方法。当你开始用一组字符串的时候,你会像s.length()这样使用字符串的length 方法。
- 数组中的length 是域(或者说特性)而不是方法。
- Java 数组和Visual Basic 数组的对照
- Java 中的数组总是从0 开始。如果使用了Option base 声明,Visual Basic 可能从1 开始。Java 中没有跟Visual Basic 中可以使你不删除内容就改变数组大小的redim preserve 命令等价的语句。但你可以建立一个同样大小的新数组,并且复制现有元素到里面。
- 一个数组声明可以有多个方括号。Java 形式上不支持多维数组,但是它可以支持数组的数组,就是我们常说的嵌套数组。
- C/C++中那样的多维数组和嵌套数组的最主要区别就是,每个数组不需要有同样的长度。如果你将一个数字当作一个矩阵,矩阵不一定是矩形。按照Java 语言规范:(http://java.sun.com/docs/books/jls/html/10.doc.html#27805)“括号里的数指明了数组嵌套的深度”
- 在其他语言中,就要跟数组的维度相符。因此,你可以建立一个类似于下面的形式的二维数组:
- int i[][];
- 第一个维度可以匹配X,第二个维度可以匹配Y。
- 声明和初始化相结合
- 一个数组可以通过一个语句来创建并初始化,这就代替了通过数组循环来初始化的方式。这种方法很适合小数组。下面的语句创建了一个整型数组并且赋值为0 到4:
- int k[]=new int[] {0,1,2,3,4};
- 注意,你没有必要确定数组元素的数量。你可能在测验中被问到下面的语句是不是正确的问题:
- int k=new int[5] {0,1,2,3,4} //Wrong, will not compile!
- 你可以创建数组的同时确定任何数据类型,因此,你可以创建一个类似于下面形式的字符串
- 数组:
- String s[]=new String[] {"Zero","One","Two","Three","Four"};
- System.out.println(s[0]);
- 这句将会输出String[0]。
- 数组的默认值
- 不同于其他语言中的变量在类级别创建和本地方法级别创建有不同的动作,Java 数组总是被设定为默认值。
- 无论数组是否被创建了,数组中的元素总是设为默认值。因此,整型的数组总是被置0,布尔值总是被置false。下面的代码编译时不会出错,并且输出0。
- public class ArrayInit{
- public static void main(String argv[]){
- int[] ai = new int[10];
- System.out.println(ai[0]);
- }
- }
- 问题
- 问题1)怎样通过一个语句改变数组大小同时保持原值不变?
- 1) Use the setSize method of the Array class
- 2) Use Util.setSize(int iNewSize)
- 3) use the size() operator
- 4) None of the above
- 问题2) 你想用下面的代码查找数组最后一个元素的值,当你编译并运行它的时候,会发生什么?
- public class MyAr{
- public static void main(String argv[]){
- int[] i = new int[5];
- System.out.println(i[5]);
- }
- }
- 1) Compilation and output of 0
- 2) Compilation and output of null
- 3) Compilation and runtime Exception
- 4) Compile time error
- 问题3)作为一个好的Java 程序员,你已忘记了曾经在C/C++中知道的关于数组大小信息的知识。如果你想遍历一个数组并停止在最后一个元素处。你会使用下面的哪一个?
- 1)myarray.length();
- 2)myarray.length;
- 3)myarray.size
- 4)myarray.size();
- 问题4)你的老板为了你写出了HelloWorld 而很高兴地为你升职了,现在她给你分配了一个新任务,去做一个踢踏舞游戏(或者我小时候玩的曲棍球游戏)。你认为你需要一个多维数组,下面哪一个能做这个工作?
- 1) int i =new int[3][3];
- 2) int[] i =new int[3][3];
- 3) int[][] i =new int[3][3];
- 4) int i[3][3]=new int[][];
- 问题5)
- 你希望找到一个更优雅的方式给你的数组赋值而不使用for 循环语句,下面的哪一个能做到?
- 1)myArray{
- [1]="One";
- [2]="Two";
- [3]="Three";
- }
- 2)String s[5]=new String[] {"Zero","One","Two","Three","Four"};
- 3)String s[]=new String[] {"Zero","One","Two","Three","Four"};
- 4)String s[]=new String[]={"Zero","One","Two","Three","Four"};
- 问题6)当你试着编译运行下面的代码的时候,可能会发生什么?
- public class Ardec{
- public static void main(String argv[]){
- Ardec ad = new Ardec();
- ad.amethod();
- }
- public void amethod(){
- int ia1[]= {1,2,3};
- int[] ia2 = {1,2,3};
- int ia3[] = new int[] {1,2,3};
- System.out.print(ia3.length);
- }
- }
- 1) Compile time error, ia3 is not created correctly
- 2) Compile time error, arrays do not have a length field
- 3) Compilation but no output
- 4) Compilation and output of 3
- 答案
- 答案1)
- 4) None of the above
- 你不能改变一个数组的大小。你需要创建一个不同大小的临时数组,然后将原数组中的内容放进去。Java 支持能够改变大小的类的容器,例如Vector 或者collection 类的一个成员。
- 答案2)
- 3) Compilation and runtime Exception
- 当你试着移动到数组的末端的时候,你会得到一个运行时错误。因为数组从0 开始索引,并且最后一个元素是i[4]而不是i[5]。
- 答案3)
- 2) myarray.length;
- 答案4)
- 3) int[][] i=new int[3][3];
- 答案5)
- 3)String s[]=new String[] {"Zero","One","Two","Three","Four"};
- 答案6)
- 4) Compilation and output of 3
- 所有的数组的声明都是正确的。如果你觉得不太可能,可以自己编译这段代码。
- 目标二 定义类和变量
- 定义类,内部类,方法,实例变量,静态变量和自动(本地方法)变量,需要合适的选用允许的修饰词。(例如public,final,static,abstract 诸如此类)。这些修饰词或者单独使用或者联合使用,定义了包的关系。
- 本目标需要注意的
- 我发现目标中用了“诸如此类”,这让我有些烦恼,我想你需要弄明白下面词的意思:
- native
- transient
- synchronized
- volatile
- 什么是类?
- 一个类的的定义把它很生硬描述为“方法和数据的集合”。它把面向对象编程出来之前的编程思想结合起来,这对理解该概念很有帮助。在类和面向对象程序设计前的主要概念是结构化程序设计。结构化程序设计的理念是程序员将复杂问题划分为小块的代码,一般称为函数或子程序。这符合“做一件很大很复杂的事情的好办法是把它分成一系列比较小但更容
- 易管理的问题”的理念。
- 尽管结构化程序设计在管理复杂性方面很有用,但它不能容易的解决代码重用问题。程序员发现他们总是“重复发明”轮子。在试着对现实物理对象的思考中,程序设计方面的思想家找到了面向对象的理念(有时被称为OO)。举例来说,一个计算机厂商准备生产一种新型个人电脑,如果计算机厂商使用类似于程序设计的方式的话,就要求他建立新团队来设计新CPU 芯片,新声卡,没准还需要另一个团队设计规划制造新的主板。事实上,这根本不可能出现。由于电脑组件接口的标准化,计算机厂商只需要联系配件供应商,并商议好他们要生产的新型号的说明书就行了。注意组件接口标准化的重要性。
- 比较C++/VB 和Java 的类
- 因为Java 被设计成容易让C++程序员学习的语言,因此两种语言在处理类上有很多相似的地方。C++和Java 都有继承,多态和数据隐藏特性,并使用显式的修饰词。有一些不同也是因为使Java 更容易学习和使用。C++语言实现了多态继承,这样,一个类就可以比一个的父类(或基类)更强大。Java只允许单继承,这样就只有一个父类。为了克服这个限制,Java 有一个被称作接口的特性。Java 语言的设计者确定接口能够提供多态继承的好处而没有坏处。所有Java 类都是Object
- 类的后代。
- 对象在Visual Basic 中是语言设计之后才加入的想法。Visual Basic 有时被称作基于对象的语言而不是面向对象的语言。这就好像是语言的设计者认为类很酷,然后随着VB4 的发布,他们决定加入一个新类型的模块,称它为类并且加上冒号,让它看起来更像C++。VB 的类概念中失去了至关重要的元素:继承。微软在VB5 中加入了跟Java 的接口很相似的接口的概念。VB 类和Java 类的最主要相似之处是引用的使用和new 关键字。
- Java 中类的角色
- 类是Java 的心脏,所有的Java 代码都在一个类里。Java 里没有自由独立代码的概念,甚至最简单的HelloWorld 应用都是包含在类里被创建的。为了指出一个类是另一个类的派生类,我们使用extend 关键字。如果extend 关键字没有被使用,这个类将是基类Object 派生的。这可以使它有一些基本的功能,比如打印自己的名字和其他一些在线程中可能需要用到的功能。
- 类的最简单特性
- 定义一个类至少需要class 关键字,类名和一对花括号。如:
- class classname {}
- 如果不是有特别作用的类,它在语法上是正确的(我很惊讶的发现,当我举例说明继承时,我定义了一个跟着类似的类)。通常,一个类还会包括一个访问修饰符,放在关键字class 前面,还会有程序体放在花括号之间。下面的是一个更好的类模版:
- public class classname{
- //Class body goes here
- }