《Java程序设计》第一阶段导学资料.docx
《《Java程序设计》第一阶段导学资料.docx》由会员分享,可在线阅读,更多相关《《Java程序设计》第一阶段导学资料.docx(23页珍藏版)》请在冰豆网上搜索。
![《Java程序设计》第一阶段导学资料.docx](https://file1.bdocx.com/fileroot1/2022-12/30/34b4827d-9c85-4123-b397-bd1ad4f3f9e5/34b4827d-9c85-4123-b397-bd1ad4f3f9e51.gif)
《Java程序设计》第一阶段导学资料
《Java程序设计》第一阶段导学
一、重点解读
Java概述
Java编程语言是一种先进的具有革命性的语言,它融合了完美的语言设计和以前主要可见于专用语言的强大功能。
除了核心语言组件外,Java编程语言还发布了许多功能强大的用于数据库,网络和用户界面接口(GUI)等任务的支持软件库。
此屏重点讲述Java语言的核心特征。
Java语言是一种真正面向对象(OO)的编程语言。
此点最主要表现在:
为了用Java编写程序,你得用面向对象的结构进行工作。
面向对象语言为设计那些为再现真实世界里的实体(如汽车、职员、保险制度等等)的程序提供了一个框架。
而用非面向对象的语言来再现真实世界的实体是相当困难的,因为,对非OO的语言来说,为了描述象汽车这样的实体必须使用一些原始的语言结构类型如Pascal语言中的记录(record)、C语言中的结构(struct)或其他的仅代表数据的类型。
在非OO的语言中,实体的行为必须被过程或者函数这类语言结构单独处理,“过程化的编程语言”这个名词由此产生。
在这种分离下,程序员必须人为地将数据的结构与处理此数据的相关过程联系在一起。
与此相反,OO语言为用户定义的实体提供了一种更功能强大的结构-“类”(class)。
类支持用户定义数据类型的创建如Employee,既包含描述某个特定的employee的数据,也包含对此数据的操作和使用。
Java程序可以自由地使用用户定义数据类型。
二、难点解析
switch语句
使用switch语句可以根据一个整型表达式有条件地执行语句。
下面的例程SwitchDemo,声明了一个整型变量month,它的数值代表了月份。
这个程序显示了月份的名字,主要是根据month的数值并且使用了switch语句。
publicclassSwitchDemo{
publicstaticvoidmain(String[]args){
intmonth=8;
switch(month){
case1:
System.out.println("January");break;
case2:
System.out.println("February");break;
case3:
System.out.println("March");break;
case4:
System.out.println("April");break;
case5:
System.out.println("May");break;
case6:
System.out.println("June");break;
case7:
System.out.println("July");break;
case8:
System.out.println("August");break;
case9:
System.out.println("September");break;
case10:
System.out.println("October");break;
case11:
System.out.println("November");break;
case12:
System.out.println("December");break;
}
}
}
这个switch语句计算它的表达式,在这个例子中是计算month的数值,然后计算适当的case语句。
这样,程序的输出为:
August。
当然,你可以使用if语句来实现它:
intmonth=8;
if(month==1){
System.out.println("January");
}elseif(month==2){
System.out.println("February");
}
...
决定使用if语句还是switch语句的关键主要是根据可读型以及其它因素。
if语句可以在更大范围或者条件来决定,而switch只有根据单个整型变量来做决定。
同时,提供给case语句的数值必须是单一的。
另外一点是,switch语句在每个case之后有一个break语句。
每个break语句终止了swtich语句,并且控制流程继续switch块之后的第一个语句。
break语句是必须的,因为没有它,case语句就会失效,也就是说,没有break语句,控制流程按顺序执行case语句。
一般地,你可以使用break来在分支语句中终止循环。
最后你可以在switch最后使用缺省地语句来处理所有的上面没有处理的情况。
intmonth=8;
...
switch(month){
case1:
System.out.println("January");break;
case2:
System.out.println("February");break;
case3:
System.out.println("March");break;
case4:
System.out.println("April");break;
case5:
System.out.println("May");break;
case6:
System.out.println("June");break;
case7:
System.out.println("July");break;
case8:
System.out.println("August");break;
case9:
System.out.println("September");break;
case10:
System.out.println("October");break;
case11:
System.out.println("November");break;
case12:
System.out.println("December");break;
default:
System.out.println("Hey,that'snotavalidmonth!
");break;
}
JAVA编程语言支持下面的三种分支结构:
break语句
continue语句
return语句
下面逐个介绍:
(1)break语句
break语句有两种形式:
未标志的和标志的。
你在前面就已经看过了未标志的break语句。
一个未标志的break语句终止swtich语句,控制流程马上转到switch语句下方的语句。
下面的例程BreakDemo,它包含了一个for循环查找数组中特定的数值:
publicclassBreakDemo{
publicstaticvoidmain(String[]args){
int[]arrayOfInts={32,87,3,589,12,1076,
2000,8,622,127};
intsearchfor=12;
inti=0;
booleanfoundIt=false;
for(;iif(arrayOfInts[i]==searchfor){
foundIt=true;
break;
}
}
if(foundIt){
System.out.println("Found"+searchfor+"atindex"+i);
}else{
System.out.println(searchfor+"notinthearray");
}
}
}
当数值被找到的时候,这个break语句终止了for循环。
控制流程就转到for语句的下面的语句继续执行。
这个程序的输出为:
Found12atindex4
未标志形式的break语句被用来终止内部的switch、for、while或者do-while。
而标志形式的break语句终止一个外部的语句,它是通过在break语句中使用一个标志来实现的。
下面的例程BreakWithLabelDemo跟前面的例子有点相似,只不过它是在一个两维数组中搜索一个数值。
利用两个嵌套的for循环遍历了整个数组。
当数值被找到了,标志形式的break语句就终止标志的search语句,这个search语句是在for循环外部的:
publicclassBreakWithLabelDemo{
publicstaticvoidmain(String[]args){
int[][]arrayOfInts={{32,87,3,589},
{12,1076,2000,8},
{622,127,77,955}
};
intsearchfor=12;
inti=0;
intj=0;
booleanfoundIt=false;
search:
for(;ifor(j=0;jif(arrayOfInts[i][j]==searchfor){
foundIt=true;
breaksearch;
}
}
}
if(foundIt){
System.out.println("Found"+searchfor+"at"+i+","+j);
}else{
System.out.println(searchfor+"notinthearray");
}
}
}
这个程序的输出为:
Found12at1,0
这个语法看起来可能有点费解。
break语句终止了标志语句,它不能将控制流程转到这个标志处。
控制流程迅速将标志(终止的)后面的语句。
2)continue语句
你可以使用continue语句来跳过当前的for、while或者do-while循环。
未标志形式跳到内部循环体的末尾处并且计算控制循环的boolean表达式,跳过循环的其它部分。
下面的例程ContinueDemo遍历字符串中的所有字母。
如果当前字母不是一个p,contiue语句就忽略循环的其它部分并且处理下一个字符。
如果它是一个p字母,程序就对计数器增1,再将p转换维大写字母:
publicclassContinueDemo{
publicstaticvoidmain(String[]args){
StringBuffersearchMe=newStringBuffer(
"peterpiperpickedapeckofpickledpeppers");
intmax=searchMe.length();
intnumPs=0;
for(inti=0;i//interestedonlyinp's
if(searchMe.charAt(i)!
='p')
continue;
//processp's
numPs++;
searchMe.setCharAt(i,'P');
}
System.out.println("Found"+numPs+"p'sinthestring.");
System.out.println(searchMe);
}
}
这个程序的输出为:
Found9p'sinthestring.
PeterPiPerPickedaPeckofPickledPePPers
标志形式的continue语句将忽略外部给定标志的循环。
下面的例程ContinueWithLabelDemo,它使用了一个嵌套的循环来搜索一个子字符串。
程序如下:
publicclassContinueWithLabelDemo{
publicstaticvoidmain(String[]args){
StringsearchMe="Lookforasubstringinme";
Stringsubstring="sub";
booleanfoundIt=false;
intmax=searchMe.length()-substring.length();
test:
for(inti=0;i<=max;i++){
intn=substring.length();
intj=i;
intk=0;
while(n--!
=0){
if(searchMe.charAt(j++)!
=substring.charAt(k++)){
continuetest;
}
}
foundIt=true;
breaktest;
}
System.out.println(foundIt?
"Foundit":
"Didn'tfindit");
}
}
这个程序的输出为:
Foundit
(3)return语句
最后讲讲分支结构的最后一个return语句。
你可以使用return来退出当前的方法。
控制流程返回到调用方法的下一个语句。
这个return语句有两种形式:
一种是返回一个数值,另外一种没有返回数值。
为了返回一个数值,简单地,可以将数值放置在return关键字后面即可。
例如:
return++count;
由return返回的数值类型必须匹配方法声明返回的数值类型。
当方法被声明void,return的使用就不返回一个数值:
return
三、关键词
变量的总结
当你声明了一个变量,你就显性地设置了变量的名字和数据类型。
JAVA编程语言右两类的数据类型:
原始和引用。
原始数据的变量包含一个数值。
以下这张表显示了所有的原始数据类型以及它们的大小和格式。
关键字
描述
大小/格式
整型
byte
字节长度整型
8位两个补码
Short
短整型
16位两个补码
int
整型
32位两个补码
long
长整型
64位两个补码
实数
Float
单精度浮点型
32位IEEE754
Double
双精度浮点型
64位IEEE754
其它类型
Char
单个字符
16位Unicode字符
boolean
布尔型数值(true或者false)
真或假
变量声明的位置隐含地设置了变量的作用域,它决定了代码的哪一部分可以通过变量名来调用这个变量。
具体有以下四种类型的作用域:
成员变量作用域、本地变量作用域、参数作用域以及异常处理参数作用域。
你可以使用赋值操作符(=)来在声明的地方对变量进行初始化。
你也可以将变量声明为final。
Final变量的数值在初始化之后不能再被改变。
操作符
一个操作符利用一个、两个或者三个运算对象来执行了一个函数。
只需要一个运算对象的操作符称为单元运算符。
例如++是一个单元操作符,它是对运算对象自增1。
需要两个运算对象的操作符号称为双元操纵符。
比如等于号(=)就是一个双元操作符,它指定右边的运算对象给左边的运算对象。
最后,三元操作符需要三个运算对象。
JAVA编程语言有一个三元运算符?
:
,它是一个简要的if-else语句。
单元操作符支持前缀或者后缀记号。
前缀记号是指操作符出现在它的运算对象之前,例如:
operatorop//前缀记号
后缀记号是指运算对象出现在操作符之前,例如:
opoperator//后缀记号
所有的双元操作符使用中缀记号,即操作符出现在两个运算对象的中间:
op1operatorop2//中缀记号
三元操作符也是使用中缀记号,例如:
op1?
op2:
op3//中缀记号
操作除了执行一个操作,还返回一个数值。
返回数值和它的类型依靠于操作符号和运算对象的类型。
比如,算术操作符它完成基本的算术操作(加、减)并且返回数值作为算术操作的结果。
由算术操作符返回的数据类型依靠于它的运算对象的类型:
如果你对两个整型数相加,你就会得到一个整型数。
我们可以将操作符分成以下几类:
算术运算符
关系和条件运算符
移位和逻辑运算符
赋值运算符
其它的运算符
下面我们逐个介绍。
JAVA编程语言为所有的浮点型和整型数支持多种算术运算符。
这些运算符为+(加)、-(减)、*(乘)、/(除)以及%(模)。
下面的表总结了双元算术运算符。
运算符
使用
描述
+
op1+op2
op1加上op2
-
op1-op2
op1减去op2
*
op1*op2
op1乘以op2
/
op1/op2
op1除以op2
%
op1%op2
op1除以op2的余数
这里注意,当一个整数和一个浮点数用为运算符来执行单一算术操作的时候,结果为浮点型。
整型数是在操作之前转换为一个浮点型数的。
下面的表总结了根据运算对象的数据类型由算术操作符返回的数据类型。
它们是在操作执行之前进行数据转换的。
结果的数据类型
运算数据类型
long
任何一个运算对象都不是float或者doule型,而且最少有一个运算对象为long
int
任何一个运算对象都不是float或者doule型,而且还不能为long型
double
最少有一个运算对象为double
float
最少有一个运算对象为float,但不能是double型
除了双元的运算符+和-,还有以下单元运算符:
运算符
用法
描述
+
+op
如果op是一个byte、short或者char型的,op变成int型
-
-op
取op的相反数
另外两个简练的算术操作符为++和--。
++是完成自加1的作用;而—是完成自减的作用。
不管是++还是—都可能出现在运算对象的前面(前缀)或者后面(后缀),但是它们的作用是不一样的。
前缀的格式为:
++op或--op,它实现了在加/减之后才计算运算对象的数值;而后缀的格式为:
op++或op--,它实现了在加/减之前就计算运算对象的数值。
程序中其它两个循环使用了后缀的++。
在两个例子中,使用前缀或者后缀是没有问题的。
当其中一个运算符号返回的数值没有用到,则约定使用后缀的。
下面的表格总结自增/自减运算符:
运算符
用法
描述
++
op++
自增1;它是在自增之前计算op的数值的。
++
++op
自增1;它是在自增之后计算op的数值的。
--
op--
自减1;它是在自减之前计算op的数值的。
--
--op
自减1;它是在自减之后计算op的数值的。
关系运算符是比较两个数值并决定它们的关系。
比如!
=在如果两个运算对象不相等的情况下返回true。
以下这个表格总结了关系运算符:
运算符
用法
在什么情况下返回true
>
op1>op2
op1大于op2的时候
>=
op1>=op2
op1大于等于op2的时候
<
op1op1小于op2的时候
<=
op1<=op2
op1小于等于op2的时候
==
op1==op2
op1等于op2的时候
!
=
op1!
=op2
op1不等于op2的时候
关系运算符经常用在条件运算符中来构造更复杂的判断表达式。
JAVA变成语言支持六种条件运算符:
五个双元运算符和一个单元运算符,如下表所示;
运算符
用法
什么情况返回true
&&
op1&&op2
op1和op2都是true,有条件地计算op2
||
op1||op2
op1或者op2是true,有条件地计算op2
!
!
op
op为false
&
op1&op2
op1和op2都是true,总是计算op1和op2
|
op1|op2
op1或者op2是true,总是计算op1和op2
^
op1^op2
如果op1和op2是不同的,也就是说,有其中一个运算对象是真的而不是两个都为真的时候
&&运算符可以完成条件AND的操作。
你可以使用两个不同的关系运算符和&&来决定是否两个关系都为true。
下面的一行代码使用了这个技术来决定是否数组的索引处在两个边界之间。
它决定了是否索引都大于等于0并且小于等于NUM_ENTRIES(它是在之前被定义为常数)。
0<=index&&index这里注意在一些实例中,第二个运算对象可能不用运算,因为如果第一个运算对象是false,则结果就一个是false,因此不用在计算第二个运算对象了。
你看看以下的代码:
(numChars&&运算符只有在两个运算对象都为true的时候,才返回true。
因此,如果numChars大于等于LIMIT的时候,&&左边的运算对象就为false,这时就不用在计算右边的运算对象就返回了数值false。
在这个例子中,编译器将不会计算右边的运算对象。
如果右边运算对象有副效应的的话(比如读一个流、更新一个数值或者进行一个计算)这个有重要的含义。
当两边的运算对象都是boolean(布尔型),运算符号&跟&&执行相同运算。
但是,&总是要计算两边的运算对象然后再在两个运算对象同为true的时候才返回true。
同样地,当运算对象都为boolean(布尔型)的时候,|执行与操作符号||一样的功能。
这个|运算符总是要计算两边的运算对象然后在最少有一边为true的时候才返回true。
当它们的运算对象为数字的时候,&和|是按位操作的。
移位和逻辑运算符
移位运算符通过对第一个运算对象左移或者右移位来对数据执行位操作。
下面的这个表总结了JAVA编程语言中有效的移位运算符。
运算符
用法
操作
>>
op1>>op2
将op1右移op2个位
<<
op1<将op1左移op2个位
>>>
op1>>>op2
将op1右移op2个位(无符号的)
每一个运算符移动左边的运算对象的位数都是由右边的运算符给出的。
这个移位的方向取决于运算符本身。
比如,下面的语句是实现将整数13右移1位的目的:
13>>1;
13的二进制为1101.右移一位的结果为110,即为十进制的6.左边的位用零来填充。
下面的表给出了JAVA编程语言提供的四种运算符来对它们的运算对象执行按位操作:
运算符
用法
操作
&
op1&op2
按位与
|
op1|op2
按位或
^
op1^op2
按位异或
~
~op2
按位求补
当它的运算对象为数字的时候,&运算符为每一个运算对象的每位执行按位AND功能。
AND在运算对象的相应位为1的时候结果才为1