Java,为什么叫Java呢?貌似和Oak有关,也貌似与爪哇有关,这是为啥呢?说到这,让我想起了一首歌:不要问究竟。
前面篇简单文字,使自己有了部分入手的感觉,因此今天我们来看一些比轻微复杂的Java项。
【Java 数组】
在Java中,也提供了与C/C++类似的数组的概念,在Java中数组强调的是Set的概念,即具有集合的特征。在Java中声明数组非常简单,语法格式如下
所示:
datatype array_name[];
或者
datatype[] array_name;
这样声明的数组仅是定义数组名,并没有构造数组对象,为了构造数组对象,我们需要使用new操作符进行构造,如下所示:
datatype[] arrayname;
array_name=new datatype[array_length];
数组引用和C一样,通过下标(index)进行索引;其index_min=0、 index_max=array_length-1;
下面我们对数组进行一个测试:
/* This program test the control flow chart */ import java.util.*; public class Cfc { public static void main(String[] args) { //array test int[] array_int; array_int=new int[10]; Scanner GetData=new Scanner(System.in); for(int i=0;i<array_int.length;i++) { System.out.println("Enter the "+(i+1) + " number:"+~0x7FFF+"<="+" number "+"<="+0x7FFF); array_int[i]=GetData.nextInt(); } for(int i=0;i<array_int.length;++i) { System.out.println("array_int["+i+"]:"+array_int[i]); } } }
上面的程序段,定义一个array_int数组,通过Scanner对象输入10个数值,然后将数组打印出来。执行如下所示:
从这里我们可以看到我们可以通过数组的length属性获取数组的长度,这是与C/C++不一样的地方,在C中需要程序员自己来控制这个长度,时间常量
容易造成混乱。
有时需要变长数组,在C89里面没有提供变长数组的支持,而好像C99提供有有限的支持,在Java中通过类库也提供了变长数组的支持,我们以后再讨论。
知道了数组的定义和使用,我们就来做一件稍具挑战的事情,对输入的数据进行排序,下面我们对上面的程序稍加变化,来实现这个功能:
/* This program test the control flow chart */ import java.util.*; public class Cfc { public static void main(String[] args) { //数组测试 int[] array_int; array_int=new int[10]; Scanner GetData=new Scanner(System.in); //提示用户输入数据: System.out.println("Enter 10 numbers:"+~0x7FFF+"<="+" number "+"<="+0x7FFF); for(int i=0;i<array_int.length;i++) { array_int[i]=GetData.nextInt(); } //打印数组 for(int i=0;i<array_int.length;++i) { System.out.println("array_int["+ i +"]:"+array_int[i]); } System.out.print("\n\n"); //对数组进行排序,最简单的冒泡法 int temp=0; for(int i=0;i<array_int.length;++i) for(int j=array_int.length-1;j>i;j--) { if(array_int[j]<array_int[j-1]) { temp=array_int[j-1]; array_int[j-1]=array_int[j]; array_int[j]=temp; } } //打印数组 for(int i=0;i<array_int.length;++i) { System.out.println("array_int["+ i +"]:"+array_int[i]); } } }
上面的代码运行的结果是:
在Java中对数组的处理还有几点特殊的地方:
1、数组初始化,不需要new进行初始化。
int[] int_array={1,2,3,4}; //定义了一个int型的数组变量,int_array, 数组具有index=0、1、2、3
2、匿名数组
int[] int_array=new int[] {1,2,3 ,4,5}; // 后面的int[] {1,2,3,4,5}为匿名数组
这里我们通过匿名数组来初始化数组数组,注意这里的初始化与C语言中的初始化意义相同
3、数组复制
Java提供了一个数组复制的机制,利用Arrays类的copyOf()方法可以实现数组的复制。
还可以利用System.arraycopy方法来进行数组的截取复制。其语法格式是:System.arraycopy(from,index_start,to,copy_length);
这两个方法主要的作用是用来增加数组的长度。具体应用我们就不举例子了。
【Java if语句】
IF语句的使用频率非常之高,因此这里我们介绍一下IF语句;如果你接触过C/C++的话,那么Java的IF语句的使用将会是非常简单的,在Java中
IF语句和C/C++中一样。其语法格式如下所示:
Style 1:
if(boolen condition) statement; other statement; // 如果if语句括弧中的判断条件为真,则执行statement;否则就执行other statement。
Style 2:
if(boolean condition)
IF_statement;
else
Else_statement;
Other_statement;
如果boolean condition为True,那么就执行IF_statement语句(可以为语句块),然后执行Other_statement; 如果boolean condition为False,那么就
执行Else_statmetn(可以为语句块),然后执行Other_statement。
Style 3:嵌套IF语句
嵌套IF语句遵循上面两条规则,同时Else部分将于最近的IF部分匹配。如下:
if (boolean condition 1)
if(boolean condtion 2)
statement;
else
statement;
如上所示,else子句就与boolean condition 2的if子句匹配,构成一个内部嵌套IF子句;为了程序代码的可读性,建议每个IF语句中
加上{}构成语句块,这样能更好的区别IF、ELSE的匹配情况,如下:
if (boolean condition 1)
{
if(boolean condtion 2)
statement;
else
statement;
} //End of boolean condition 1 IF
【Java While循环语句】
Java中while循环语句与C/C++语言中while语句也非常相似;这里就不多说了。
Java中还提供了一个do....while循环,do...while循环的循环体,必须至少执行一次。
注: 有些书籍将while循环叫做“当型”循环,即当条件不为真时结束循环;而将do..while循环叫做“直到型”循环,直到条件不成立时结束循环。
【Java For循环语句】
Java的循环For循环,通常用于循环次数确定的循环(当然,循环次数不确定的也可以用);Java中For循环和C/C++的结构类似,这里也不介绍了;
值得说明的是:
可以再for循环语句中定义for语句中可用的变量,这些变量只是在for语句中可见;当在for语句中定义的变量与for语句外的变量重名时,那么就会出现
符号重定义的错误,如下所示:
/* This program test the control flow chart */ import java.util.*; public class Cfc { public static void main(String[] args) { //数组测试 int[] array_int; array_int=new int[10]; //定义i变量,看是否会影响for语句中i变量 int i; i=100; Scanner GetData=new Scanner(System.in); //提示用户输入数据: System.out.println("Enter 10 numbers:"+~0x7FFF+"<="+" number "+"<="+0x7FFF); for(int i=0;i<array_int.length;i++) { array_int[i]=GetData.nextInt(); }
这是与C/C++中,小作用域变量屏蔽大作用域变量的机制不一样的地方,需要注意。
在For语句和while语句中还有一点必须注意:就是必须保证for循环体中的每一条语句都有机会执行到,否则就会报错,这在很多C/C++程序中也是
经常会出现的。
1 public class Break 2 { 3 public static void main(String args[]) 4 { 5 int int_var=10; 6 7 for(;int_var>1;) 8 { 9 break; 10 System.out.println("Can you see this statement!!!"); 11 } 12 13 System.out.println("Break statement hava interupt the if statemtn"); 14 } 15 }
上面的代码编译的结果如下:
【Java 枚举类型】
为啥在这个地方说枚举类型呢? 因为接下来要说switch语句,可以看到switch语句和枚举类型具有“天然”的联系。
Java中也提供了枚举类型,这种类型在处理一些问题的时候,非常方便。例如: 月份、星期、商城果品种类等。在Java中定义枚举类型也非常的容易;
其语法格式如下所示:
enum Week {Mon、Thu、Wend、Ths、Fri、Sat、Sun};
这样就定义了一个Week的枚举类型(在这里我们不分别声明和定义,不拘束于C/C++中声明与定义的差异),我们可以利用它来定义变量:
Week Vication;
Vication=Week.Mon ; //这里需要注意,赋初值的时候,需要指定枚举的类型。但也写特殊的情况不需要指定枚举类型。这里我们就不多说了。下面是我
通过度娘搜索的一个链接:http://www.cnblogs.com/Fskjb/archive/2009/08/03/1537917.html 里面有关于枚举类型的详细的介绍。
要点:
枚举类型变量可以赋值为null,表示枚举类型变量没有初始化;注意的是null并不表示枚举变量没有指向确定的内存,定义枚举变量后就已经分配内存了,这
与C语言中null不一样。
【Java switch语句】
swith语句适用于知道选择项目集合的情况,例如我们到商城买衣服,里面有不同的品牌,我们通过enum定义一个衣服类别的类型,然后我么就可以
根据用户的选择来判断价钱、折扣等信息。
Java中switch语句和C/C++中的机制一样,这里不多说。具体可以参考上面的链接。
需要说明的一点是:如果在Java中结合使用enum和swith语句,那么在swith语句的case 子句部分不需要指定枚举的类型信息,如:
Week workday=Week.Sun;
switch(workday)
{
case Mon:
statement;
break;
case Week.Thu:
statement;
break;
.......
}
可以看到,这时在case子句中不需要指定枚举类型名Week,当然也可以指定,如上实例所示。
要点:
1、break, 在每个Case子句后一般需要加上break语句;当然这不是必须的,我们可以选择几个case子句执行一个语句(语句块)。
2、default 在switch语句中可以用default子句,这个与C语言一样。具体不多说。
【Java break和continue语句】
break语句用来中断正常的控制流程,它一般用来跳出循环和switch语句。
例如:
/* This program test break statement */ public class Break { public static void main(String args[]) { int int_var=10; //can execute forever ?? for(;int_var>1;) { System.out.println("Can you see this statement how many times???"); break; } System.out.println("Break statement hava interupt the if statement"); } }
执行结果如下:
那么下面的程序能执行多少次呢?
1 /* 2 This program test break statement 3 */ 4 5 public class Break 6 { 7 public static void main(String args[]) 8 { 9 int int_var=4; 10 12 for(;int_var>1;int_var--) 13 for(int i=0;i<5;i++) 14 { 15 System.out.println("How many times can you see this statement ???"); 16 break; 17 } 18 19 System.out.println("Break statement hava interupt the if statement!!!"); 20 } 21 }
这个谜题大家自己怎么看? 这里我就不说出结果了,有兴趣的可以自己试试,当然在测试之前你可以说一下for循环体重的语句究竟会输出几行??。
有时候,在嵌套循环中,为了跳出整个大循环,就是跳出来执行循环后面的语句,我们应该怎么办呢? 在Java中提供了另外一种机制:break label机制。我们
对上面的代码稍微做一点改变,看结果又会是怎样:
/* This program test break statement */ public class Break { public static void main(String args[]) { int int_var=3; //测试break label机制: break_label: for(;int_var>1;int_var--) for(int i=0;i<5;i++) { System.out.println("How many times can you see this statement ???"); break break_label; } System.out.println("Break statement hava interupt the if statement!!!"); } }
这段代码执行后又是什么结果呢?我们就卖关子了:
看到没,for循环体的语句仅执行了一次。
要点:
break语句跳出循环体包含的循环,而break label语句可以跳出break label标志的循环。即break与最”近“的循环体匹配,而break label则与
break label所标志的循环匹配。
continue语句与C语言中的机制一样,就是会中断本次循环体的执行过程,而不会跳出本循环。我们可以通过下面的程序比较break和continue的差别:
1 /* 2 This program test break statement 3 */ 4 5 public class Break 6 { 7 public static void main(String args[]) 8 { 9 int int_var=4; 10 11 12 for(;int_var>1;int_var--) 13 for(int i=0;i<5;i++) 14 { 15 if(i==1) 16 continue; 17 18 System.out.println("How many times can you see this statement ???"); 19 20 } 21 22 23 System.out.println("Break statement hava interupt the if statement!!!"); 24 } 25 }
上面的程序执行结果:
我们在看下一段代码:
我们看到了,continue并不能跳出循环体,而break可以跳出循环体。
这次小结,主要的是对Java的结构化编程的控制流程进行大致的描述,后面还会进一步进行讨论。
因为我感觉写这些东西都是自己学习的过程的小结,自己以前接触过C/C++;因此有些时候写的内容会有点穿插。但是这样的穿插可能不适合
完全没有基础过计算机编程的人员。