第3 章控制结构 计算机程序是由若干条语句组成的语句序列,但是程序的执行并不一 定按照语句序列的书写顺序。程序中语句的执行顺序称为“程序结构”。 如果程序中的语句是按照书写顺序执行的,称其为“顺序结构”,它是最基 本的程序结构;如果某些语句是按照当时的某个条件来决定是否执行,称 其为“分支结构”;如果某些语句要反复执行多次,称其为“循环结构”。 3.1 分支结构 分支结构表示在某一条件成立的情况下,进行分流行为的程序结构。 分支结构在Java语言中有两种形式:条件分支结构与开关分支结构。其 中条件分支又有单分支、双分支的基本形式。将分支基本结构嵌套就成为 多分支结构,而开关分支结构则是另一种多分支结构。 3.1.1 if 语句 Java的if语句与其他编程语言中所用的if语句类似,分为单分支、双 分支的基本形式。 单分支结构的if语句为 if(条件表达式) 语句组 图3-1 if语句逻辑 其中,if括号中的条件表达式的值为true 时,其后的语句组将被执行;当条件表达式 值为false时,其后的语句组将不被执行。if 语句的逻辑如图3-1所示。 双分支结构也称为if-else结构,其语句 格式为 if(条件表达式) 语句组1 else 语句组2 58 JavaEE 零基础入门 其中,if括号中的表达式值可由任何表达式求得,当表达式值为true时,表示if括号中的 条件为逻辑真,其后的语句组1将被执行;当表达式值为false时,表示if括号中的条件为 图3-2 if-else语句逻辑 逻辑假,则语句组2将被执行。因此,语句组 1与语句组2在双分支结构中必定会有一个 将被执行。if-else语句的逻辑如图3-2所示。 if型的多分支结构的语句实际上是由if 结构嵌套而成的,其过程及分析与单、双分支 情况相同。在理论上,其嵌套的深度(层次) 没有限制,但嵌套太深,运行速度变慢,可读 性差,查错、调试困难,因此,除了非用此法的情况外,一般可用开关分支结构来代替多路 分支结构。 多分支结构的if语句为 if(条件表达式1) if(表达式1_1) 语句组1_1 else 语句组1_2 else if(条件表达式2) 语句组2_1 else 语句组2_2 在多分支结构中,每个if要与对应的else配对,当有多个if结构嵌套时,else将与最 近的if配对。若if需要与另一个else配对,就可将该if与else之间的所有语句用一对花 括号“{}”括起,这样就改变了if与最近的else配对的原则。 Java没有endif关键字,所以必须根据约定使用正确的缩排和空白,以使代码易于读 取,逻辑易于解释。 例3-1 if语句的应用。 程序清单:ch03\IfDemo.java public class IfDemo{ public static void main(String[] args){ int c1=2; int c2=3; if (c1==1){ System.out.println("c1=1"); } else if(c2<=1){ System.out.println("c2<=1"); } else{ System.out.println("c1 !=1, c2>1"); } } } 第3 章 控制结构 59 程序运行结果: c1! =1, c2>1 例3-2 将一个字符串中的小写字母变成大写字母,大写字母变成小写字母。 程序清单:ch03\ChangeLetter.java import java.util.*; public class ChangeLetter{ public static void main(String args[]){ String s=new String("abcABC123"); System.out.println(s); char a[]=s.toCharArray(); for(int i=0;i<a.length;i++){ if(Character.isLowerCase(a[i])){ a[i]=Character.toUpperCase(a[i]); }e lse if (Character.isUpperCase(a[i])){ a[i]=Character.toLowerCase(a[i]); } } s=new String(a); System.out.println(s); }} 程序运行结果: 输入: abcABC123 输出: ABCabc123 3.1.2 switch 语句 当程序中多分支结构的各分支之间没有相互依赖关系时,可以采用switch开关分支 结构,其语句为 switch(整型/字符型表达式) { case 整型/字符常量1: 语句1; [break;] case 整型/字符常量2: 语句2; [break;] . case 整型/字符常量n: 语句n; [break;] 60 JavaEE 零基础入门 [ default: 语句n+1; ] } 每一个case构成一个分支。根据switch中的整型/字符表达式值,依次判定case中 的整型/字符常量表达式是否与其相等。 (1)当有一个case的整型/字符常量与其相等,则其后的语句组被执行,若有break 语句,则跳出该switch语句;若无break语句,则继续执行下一个case项,直到遇到break 语句或右花括号“}”。当有一个以上case的整型/字符常量与其相等,则仅执行第一个 case项的语句组。 (2)当无任何case的整型/字符常量与其相等,且有default项,则跳过所有的case 项,执行default项的语句组;若无default项,则不执行switch中的任何语句。 (3)default项可以出现在switch语句中的任何位置。但无论default项出现在何 处,程序首先会检查所有的case分支,如没有相符合项,则再寻找default项。 (4)switch语句必须用一对花括号“{}”括起所有项内容。 JDK7以后的版本可以在switch中使用字符串,示例如下: String s="test"; switch (s) { case "test" : System.out.println("test"); break ; case "test1" : System.out.println("test1"); break ; default : System.out.println("break"); break ; } 例3-3 switch语句的应用。 程序清单:ch03\SwitchDemo.java public class SwitchDemo{ public static void main(String[] args){ int c=2; switch(c) { case 1: System.out.println("case 1 c="+c); break; case 3: System.out.println("case 3 c="+c); break; case 5: System.out.println("case 5 c="+c); break; default: System.out.println("default c="+c); } } } 第3 章 控制结构 61 该程序运行后输出:defaultc=2,表示不属于程序中列举的任一事件。 3.2 循环语句 循环是指在给定条件为真时,反复执行某个程序段。它包括当型与直到型循环。当 型循环有for与while两种形式,在进入循环体前必须先判定条件值是否为真(前判断循 环),因而,其最少循环次数为0。而直到型的形式为do-while,第一次进入循环体不必理 会循环条件是否为真(后判断循环),因而,其最少循环次数为1。 3.2.1 for 循环语句 for循环语句的基本形式为 for(表达式1;表达式2;表达式3) 循环体语句组 执行过程:先计算表达式1,得到循环变量的初值,代入表达式2中,求出表达式2的 逻辑值。当其逻辑值为真时,执行循环体语句组,否则,退出该循环。当执行完循环体语 句组后,再计算表达式3,再代入表达式2……。因此,for循环也可写成: for(初值;条件;增量) 循环体语句组 图3-3 for循环语句框图 表达式1给循环变量赋初值,不管循环多少次,它只执行一次;表达式2是循环条件, 当循环条件为真时,方可执行循环体的语句,否则将退出循环体;表达式3是每循环一次 都必须改变的循环变量表达式,是使循环条件由真变为假的必要过程,也是防止死循环的 重要环节。 三个表达式之间要用分号“;”分隔,for中的两个分号不能省略,而三个表达式可以 省略。省 略表达式1:for(;表达式2;表达式3),表达式1须在for之前执行。 省略表达式1和表达式3:for(;表达式2;),表达 式1须在for之前执行,表达式3须在循环体内执行。 省略表达式1、表达式2和表达式3:for(;;),表 达式1须在for之前执行,表达式3须在循环体内执 行。当省略表达式3时,将失去控制进入循环体的判 断条件,因而在循环体内还必须用break语句强制退 出本次循环,否则将产生死循环。for循环语句的框 图如图3-3所示。 循环体可以是单语句、复合语句,也可以是空语 句(用“;”表示)。 例3-4 用for循环语句对数组排序输出的例子。 程序清单:ch03\ForDemo.java 62 JavaEE 零基础入门 import java.util.*; public class ForDemo{ public static void main(String[ ] args) { 1 int[] a={22,2,222,-1,-110,0}; 2 Arrays.sort(a); 3 for(int i=0;i<=5;i++) System.out.print(a[i]+","); } } 程序运行结果: -110, -1, 0, 2, 22, 222, 由于程序中要用到Arrays类,java.util包中包含了这个类,所以第一行通过import 语句引入java.util包,*号表示引入包中所有的类。也可以将该语句改成: import java.util.Arrays; 这样就只引入java.util包中Arrays一个类,现在程序中只需要这个类,所以可以改用这 个语句。 语句1定义了一个int[]型数组a。 语句2调用Arrays类的sort()方法,将数组元素按数字升序重新排列。sort()方法 的原型为 public static void sort(int[] a) 由于这是一个static修饰的类方法,所以可通过类名Arrays调用。 语句3是for循环语句的应用。该语句将数组元素按照排列好的顺序,从第1个到 第6个逐一打印出来。从中可以看到数组元素的顺序已经按数字升序重新排列。 有时可能想在一个称为嵌套循环的循环中编写一个循环,这在处理排列成多行和多 列的数据时特别有用。可以使用外部循环在列之间移动,使用内部循环访问每一行。 下面的代码段演示了一个for循环位于另外一个for循环中。外部循环使用名为m 的循环计数器,内部循环使用名为n的循环计数器。 for (int m=1; m<=2; m++){ //外部循环 for (int n=1; n <=3; n++) { //内部循环 System.out.println("嵌套循环: m=" +m +", n=" +n); } } 在此示例中,外部循环执行两次,它每次执行时,内部循环都会执行3次。也就是说, 当变量m 包含1时,变量n就会从1递增到2,然后再递增到3。对于内部循环的每一次 迭代来说,都会显示这2个变量的内容。总共会调用6次println()方法。 例3-5 编写程序解决实际问题。已知公鸡5元1只,母鸡3元一只,小鸡1元3只, 要求用100元刚好买100只鸡,问有多少种采购方案。 第3 章 控制结构 63 程序清单:ch03\BuyChicken.java public class BuyChicken{ public static void main(String[] args) { int I,J,K; System.out.println(" 公鸡数I 母鸡数J 小鸡数K "); for (I=0;I<=20;I++) { //I 为公鸡数 for (J=0;J<=33;J++) { //J 为母鸡数 K=100-I-J; //K 为小鸡数 if (5*I+3*J+K/3.0==100) System.out.println(" "+I+" "+J+" "+K); } } } } 程序运行结果: 公鸡数I 母鸡数J 小鸡数K 0 25 75 4 18 78 8 11 81 12 4 84 例3-6 编写for循环嵌套程序,要求输出如下图形: * ** *** **** ***** ****** 程序清单:ch03\NestFor.java public class NestFor { public static void main(String[] args) { int i, j; for (i=0; i<6; i++) { for(j=0; j<=i; j++) { System.out.print("*"); } System.out.println(); } } } 例3-7 应用程序中main()方法中的参数args能接收从键盘输入的字符串。求若 64 JavaEE 零基础入门 干个数的平均数,若干个数以命令行参数的形式从键盘输入。 程序清单:ch03\Average.java public class Average{ public static void main(String [] args){ double n,sum=0.0; for (int i=0;i<args.length;i++){ sum=sum+Double.valueOf(args[i]).doubleValue(); } n=sum/args.length; System.out.println("平均数:"+n); } } 编译通过后,输入如下执行命令: java Average 23 45 67 (回车) 程序中的args[0]、arg[1]、arg[2]分别得到字符串"23"、"45" 和"67"。在源程序中 再将这些字符串转化为数值进行运算,得到的结果为 平均数: 45 例3-8 计算购房贷款利息。计算购房贷款月供的公式为R =PI(1+I)N/((1+ I)N -1)。R 为每月需付给银行的钱,简称月供。其中P 为总贷款额,N 为按月计算的 贷款期,I 为按月计算的贷款利息,简称月息。假设总贷款额为30万元,贷款期为30年, 年息4.59%,即月息I=0.0459/12。用for循环程序计算月供。 程序清单:ch03\TestLoan.java public class TestLoan{ public static void main(String args[ ]){ double dbp=300000; double dbi=0.0459/12; int nt=30*12; double dbpow=1; for(int i=0;i<nt;i++) dbpow=dbpow*(1+dbi); double dbr=dbp*dbi*dbpow/(dbpow-1); System.out.println("你每月需还贷款R="+dbr+"元"); } } 程序运行结果: 你每月需还贷款R=1536.1407316943316 元 3.2.2 for-each 循环语句 for-each循环是JDK1.5新增加的功能,提供一种更简洁的语句遍历集合(或数组) 第3 章 控制结构 65 的方法。它的一般形式为 for(循环变量类型 循环变量名: 被遍历的对象名){循环体} 其中,“循环变量类型”指定了循环变量的取值类型,循环变量用来接收“集合”中的元素。 每一次循环,会按顺序从“集合”中取出一个元素存储在循环变量中,如此重复,直到集合 中的所有元素都已取出为止。由于循环变量从集合中接收值,所以“循环变量类型”必须 与集合中存储的元素类型相同。 例3-9 for-each循环举例。 程序清单:ch03\ForEachTest.java public class ForEachTest { public static void main(String[] args) { int arr[]={1,2,3,4,5,6,7,8}; for (int a:arr) System.out.println(a); } } 运行结果为逐行输出数字1~8。 3.2.3 while 与do-while 语句 1.while语句 图3-4 while循环语句框图 while语句的基本形式为 while(表达式) { 循环体语句组 } while循环语句的框图如图3-4所示。 while循环语句功能和for循环语句相似,括号中的表达 式是一个判断条件,类似于for语句中的判断条件,如果条件 得到满足,循环才能继续下去。花括号中的语句构成循环体。 当while括号中的表达式值为true时,循环体语句被执行,否则,退出循环。 while中的循环变量初值要在该while语句之前给出,而循环变量的改变必须在循环 体或循环条件语句中完成,与for(;表达式2;)的功能相同。 while中的循环条件可为永真值,如while(true)。此时,要用break语句强制退出该 循环,否则会产生死循环。如: int i=5; 66 JavaEE 零基础入门 while(true) { if(i==0) break; i=i-1; System.out.println("sum="+i); } 例3-10 用while语句计算1+1/2!+1/3!+1/4! +…的前20项的和。 程序清单:ch03\WhileSum.java public class WhileSum { public static void main(String[] args) { double sum=0,a=1;int i=1; while(i<=20) { a=a*(1.0/i); sum=sum+a; i=i+1; } System.out.println("sum="+sum); } } 程序运行结果: sum=1.7182818284590455 2.do-while语句 do-while循环语句的基本形式为 do { 循环体语句组 } while(表达式); do-while循环语句的框图如图3-5所示。 图3-5 do-while循环 语句框图 do-while和前面形式的区别是,判断语句“while(表达式);” 处在循环体的后面,该语句必须以分号结尾。即使表达式不成 立,至少也要执行一次循环体中的语句。 该循环结构是先执行循环体一次,再判断while括号中表达 式的值,若为true值,就再次进入循环体,否则,退出循环。 循环变量初值要在该do-while语句之前给出,而循环变量的 改变必须在循环体中完成,其执行完一次循环体后与for(;表达 式2;)、while(表达式)循环结构功能相同。 while(表达式)后必须要有“;”,当循环体语句是复合语句 时,须用一对花括号“{}”括起。 第3 章 控制结构 67 下面的代码段是用do-while循环语句计算1~100之和的例子。 int sum=0, j=1; do { sun=sum +j; j++; } while(j <=100); 3.3 break与continue语句 break用于跳出整个循环语句,已经在前面的程序中用过。continue用于跳过本次循 环中尚未执行的语句,但是仍然继续执行下一次循环中的语句。 在循环结构中一旦遇到break语句,不管循环条件如何,程序立即退出所在的循 环体。例 3-11 break跳出整个循环举例。 程序清单:ch03\BreakLoop.java public class BreakLoop{ public static void main(String[] args){ int i, j; for (i=0; i<6; i++) { for(j=0; j<100; j++) { if (j==5) break; System.out.print("*"); } System.out.println(); } } } 程序输出如下: ***** ***** ***** ***** ***** ***** continue语句仅用于循环结构,在循环体中执行continue语句,就像执行循环结构的 右花括号“}”一样,返回到对循环条件的判断,以确定是否进入下次循环体。不管 continue与“}”之间还存在多少语句,一概不执行,因此,它又称短路语句。 break、continue语句一般与if语句配合使用。 68 JavaEE 零基础入门 在一个循环中,如循环50 次的循环语句中,如果在某次循环体的执行中执行了 break语句,那么整个循环语句就结束。如果在某次循环体的执行中执行了continue语 句,那么本次循环就结束,即不再执行本次循环中循环体中continue语句后面的语句,而 转入进行下一次循环。 例3-12 利用break和continue语句计算10以内的奇数之和并求10以内的所有 素数。程 序清单:ch03\Con_Break2.java class Con_Break2{ public static void main(String[] args) { int sum=0,i,j; for( i=1;i<=10;i++) { //计算1+3+5+7+9 if(i% 2==0) continue; sum=sum+i; } System.out.println("sum="+sum); for(j=2;j<=10;j++) { //求10 以内的素数 for(i=2;i<=j/2;i++) { if(j% i==0) break; } if(i>j/2) { System.out.println(""+j+"是素数"); } } } } 程序运行结果如下: sum=25 2 是素数 3 是素数 5 是素数 7 是素数 例3-13 从键盘读取若干个整数,以“-1”结束,计算平均值。 这里采用java.util.Scanner类的nextInt()方法读取键盘输入的整数。Scanner对象 使用如下方法读取指定类型的值:intnextInt();floatnextFloat();doublenextDouble(); longnextLong();byteNextByte();shortnextShort();booleannextBoolean()。String nextLine()读取一行的值并作为字符串返回。 程序清单:ch03\ReadKey.java 第3 章 控制结构 69 import java.util.Scanner; public class ReadKey { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int score=0; int sum=0; int count=-1; System.out.println("输入整数(-1 结束):"); while(score! =-1){ count++; sum+=score; score=scanner.nextInt(); } System.out.println("平均:"+(double)sum/count); } } 程序运行结果: 输入整数(-1 结束): 45 67 98 34 56 -1 平均: 60.0 习 题 3 1.结构化程序设计有哪三种流程? 它们分别对应Java中的哪些语句? 2.在一个循环中使用break、continue有什么不同? 3.下面的代码将输出。 int i=1; switch (i) { case 0: System.out.println("zero"); break; case 1: System.out.println("one"); case 2: System.out.println("two"); default:System.out.println("default"); } 4.下面的代码将输出。 class EqualsTest { public static void main(String[] args) { char a='\u0005'; String s=a==0x0005L?"Equal":"Not Equal"; System.out.println(s); 70 JavaEE 零基础入门 } } 5.编写程序,求两个整数的最大公约数。 6.编写程序,打印出如下九九乘法表。 *| 1 2 3 4 5 6 7 8 9 - |----------------------------- 1 | 1 2 | 2 4 3 | 3 6 9 4 | 4 8 12 16 5 | 5 10 15 20 25 6 | 6 12 18 24 30 36 7 | 7 14 21 28 35 42 49 8 | 8 16 24 32 40 48 56 64 9 | 9 18 27 36 45 54 63 72 81 7.下面的代码将输出。 int i=1; switch (i) { case 0: System.out.println("zero"); break; case 1: System.out.println("one"); case 2: System.out.println("two"); default:System.out.println("default"); } 8.下面的代码将输出。 class EqualsTest { public static void main(String[] args) { char a='\u0005'; String s=a==0x0005L "Equal":"Not Equal"; System.out.println(s); } } 9.编写程序,对A[]={30,1,-9,70,25}数组由小到大排序。 10.运行下面的代码将输出什么内容? int i=1; switch(i){ case 0: System.out.println("zero"); break; case 1: 第3 章 控制结构 71 System.out.println("one"); case 2: System.out.println("two"); default: System.out.println("default"); 11.编写程序,求2~1000内的所有素数,并按每行5列的格式输出。 12.编写程序,生成100个1~6的随机整数,统计1~6每个数字出现的概率。 13.编写程序,求1!+2!+3!+…+15!。 14.编写程序,分别用do-while和for循环计算1+1/2!+1/3!+1/4!+…前15项的和。 15.编写一个程序,用选择法对数组a[]={20,10,55,40,30,70,60,80,90,100}从大到小 排序。 16.编写程序,产生30个素数,按从小到大的顺序放入数组prime[]中。 17.一个数如果恰好等于它的因子之和,这个数就称为“完数”。编写程序求1000之内的 所有完数。 18.从键盘读取若干个数,以“-1”结束,按从小到大的顺序排序。 第4章类与对象的基本概念 4.1类与对象的概念 类是实现Java面向对象程序设计的基础,是对基本数据类型的扩充。 类封装了对象的行为和属性,它是具有相同特征的同类对象的抽象模型 (temp1ate),利用这个抽象模型可以构造具体的实例对象(instance)。 对象是Java程序中最核心、最基础的部分。对象在现实生活中是很普 通的概念。所有的物体都可以被视为对象,大到宇宙,小到原子,都可以将 其看作对象。我们时常与对象打交道,如钢笔、自行车、公交车等。而我们 经常见到的卡车、公交车、小轿车等都会涉及以下几个重要的变量:可乘载 的人数、运行速度、发动机的排量、耗油量、自重、轮子数目等。另外,还有 加速、减速、刹车、转弯、播放音乐等几个重要的功能,这些功能称为它们具 有的方法。一个对象具有本身的属性即特征,这些特征决定对象的状态, 对象还可以通过自己的行为不断改变自己的状态。 类与对象的关系犹如图纸与零件的关系,先有图纸后有零件,图纸描 述了零件的共同特征,零件是按图纸制造出来的。在程序中只能有类的一 个定义,但该类可以有多个实例对象。在Java编程语言中使用new运算 符实例化对象。 要学习Java编程就必须首先学会怎样去写类,即怎样用Java的语法 去描述对象共有的属性和功能。属性通过变量来刻画,功能通过方法来体 现。类把属性和对属性的操作封装成一个整体。Java程序设计就是从类 的设计开始的。 基于对象的编程更加符合人的思维模式,编写的程序更加健壮和强 大。更重要的是,面向对象编程鼓励创造性的程序设计。 4.1.1类的声明 类由关键词class定义。一个类的定义包括两个部分:类声明和类体。 类体的内容由两部分构成,一部分是变量的定义,用来刻画属性;另一部 74 JavaEE 零基础入门 分是方法的定义,用来描述功能。 类的结构如图4-1所示。 类 类声明 类体 变量声明 方法定义 方法声明 方法名 返回类型{ 方法体 { { { 图4-1 类的结构 类的定义的基本格式为 [public][abstract|final] class className [extends superclassName] [implements interfaceNameList] { [public | protected | private ] [static] [final] [transient] [volatile] type variableName; //成员变量 [public | protected | private ] [ static ] [ final | abstract ] [ native ] [synchronized] returnType methodName([paramList]) [throws exceptionList] {statements} //成员方法 } 其中,修饰符public、abstract、final说明了类的属性,className为类名,superclassName 为类的父类的名字,interfaceNameList为类所实现的接口列表。 1.类的成员变量 在类中声明的变量就是成员变量,作用域是整个类。类的成员变量分为类成员变量 和实例成员变量。类的成员变量的声明方式如下: [public | protected | private ] [static] [final] [transient] [volatile] type variableName; 其中: public:公有变量。 protected:保护变量。 private:私有变量。 static:静态变量(类成员变量),相对于实例成员变量。 final:常量。 transient:暂时性变量,用于对象存档。 volatile:贡献变量,用于并发线程的共享。 2.类的成员方法 成员方法描述对象所具有的功能或操作,反映对象的行为,是具有某种相对独立功能 的程序模块。一个类或对象可以有多个成员方法,对象通过执行它的成员方法对传来的 第4 章 类与对象的基本概念 75 消息作出响应,完成特定的功能。 成员方法一旦定义,便可在不同的场合中多次调用,故可增强程序结构的清晰度,提 高编程效率。 成员方法的结构包括两部分内容:方法声明和方法体。方法声明包括方法名、返回 类型和外部参数。其中参数的类型可以是简单数据类型,也可以是引用数据类型。 成员方法的定义方式如下: [ public | protected | private ] [ static ] [ final | abstract ] [ native ] [synchronized] returnType methodName ([paramList]) [throws exceptionList] { statements } 方法声明中的限定词的含义如下: public:公共访问控制符。 protected:保护访问控制符。 private:私有访问控制符。 static:类方法,可通过类名直接调用。 final:方法不能被重写。 abstract:抽象成员方法,没有方法体。 native:本地成员方法修饰符,集成其他语言的代码。 synchronized:控制多个并发线程的访问。 下面是一个类名为“梯形”的类,类体内容的变量定义部分定义了4 个float类型的 变量“上底”“下底”“高”和laderArea。方法定义部分定义了两个方法“计算面积()”和“修 改高()”。 class 梯形{ float 上底,下底,高,laderArea; float 计算面积() { laderArea=(上底+下底)*高/2.0f; return laderArea; } void 修改高(float h) { 高=h; } } 类体变量定义部分所定义的变量被称为类的成员变量。在方法体中定义的变量和方 法的参数被称为局部变量。 成员变量和局部变量的类型可以是Java中的任何一种数据类型,包括基本类型整 型、浮点型、字符型和引用类型。 76 JavaEE 零基础入门 成员变量在整个类内都有效,局部变量只在定义它的方法内有效。例如: class LocalVariable { int distance; int find() { int a=12; distance=a; //合法,distance 在整个类内有效 return distance; } void gety() { int y; y=a; //非法,a 是局部变量,这里无法访问 } } 例4-1 创建一个类,该类含有类的成员变量和成员方法,并对所创建的类进行 测试。程 序清单:ch04\Text1.java class Text1 { static int a; //当被定义为static 类型时,为类变量,可被对象或类调用 int b; //实例对象变量,只能被对象调用 public void display(int a,int b) { //成员方法 System.out.println("static int a="+a); System.out.println(" int b="+b); } public static void display(int b) { //类方法,可通过类名直接调用 System.out.println("static display: int b="+b); } public static void main(String[] args) { Text1 tt=new Text1(); //创建实例对象tt t t.display(5,6); //不可以用Text1.display(5,6);因为对象变量或对象方法 //只能被对象tt 调用 Text1.display(0); //当被定义为static 类型时,为类方法,可被对象或类调用 tt.display(23); tt.a=9; Text1.a=24; tt.b=3; tt.display(a,15); } } 运行结果: static int a=5 int b=6