版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章Java入門
1.1Java簡介Java的崛起面向對象的程式設計語言Java平臺和虛擬機兩類Java程式Java程式開發環境——SDKJava的崛起1991年4月8日,從工作站起家的Sun公司為了把市場擴大到消費電子產品,成立了一個專門的工作小組,著手代號為“Green”的專案,目的是開發一個分佈式代碼系統,讓人們可以把E-mail發給電冰箱、電視機等家用電器,對它們進行控制,同它們進行資訊交流應用的C++進行開發。但是C++太複雜,安全性也差,最後不得不定義一套新的語言系統,於是便有了Oak的問世Oak一方面汲取了C++中的有益成分,同時融進了網路應用特性,可以稱上是一種的精巧而安全的語言了MarkArdreesen的Mosaic和Netscape的巨大成功給Oak專案組成員帶來了新的希望,他們重整旗鼓,對Oak進行了一次新的整合,並取名為Java,後用Java編制了HotJava流覽器,吹響了進軍Internet的號角Java所特有的“writeonce,runanywhere.”(一次編寫,到處運行)的平臺無關性的概念,與Internet的異構網路互連一拍即合,它特別適合於在網路開發中使用面向對象的程式設計語言Java語言是一種面向對象的程式設計語言,它通過描述對象本身以及對象間的相互關係,並通過激發對象間的相互作用,來求解問題對現實世界中事物的對象,要由兩個部分來描述,一是其靜態屬性——對象的狀態,用“數據”來描述;一是其動態屬性——對象的行為,用“方法”來描述在面向對象的程式設計語言中,並不是去定義一個一個的對象,而是先定義同一類對象的範本——類(class),再從類創建其對象電子時鐘的Java描述電子時鐘的靜態屬性——電子時鐘的狀態,用變數hour(時)、minute(分)、second(秒)描述電子時鐘的動態屬性——電子時鐘的行為,如顯示時間,設置時間等,用以下方法描述:
·getMinute()——顯示“分”;
·getHour()——顯示“時”;
·setSecond()——設置“秒”;
·setMinute()——設置“分”;
·setHour()——設置“時”。classTimeClock{ privateintiSecond,iMinute,iHour; publicintgetMinute(); //顯示“分”
publicintgetHour(); //顯示“時”
publicvoidsetSecond(); //設置“秒”
publicvoidsetMinute(); //設置“分”
publicvoidsetHour(); //設置“時”}類描述符類名整數描述符語句結束符注釋符類體類的首部私有訪問許可權修飾符公共訪問許可權修飾符相關說明從結構上看,類由類的首部和類體構成類體由緊隨類的首部的一對花括弧及花括弧中的一些語句組成類體中含有類的數據部分和類的方法部分,分別稱為類的成員變數和成員方法,它們都是類的成員方法由方法首部和方法體組成有些方法執行後要向調用者(不是標準輸出)送回一個數據,這樣的數據稱為方法的返回值注釋是對程式、程式的局部或一個語句的說明,用於增加程式的可讀性這個TimeClock是一個時鐘類的介面,當此介面中所有方法的方法體都定義後,就構成了一個時鐘類,由這個時鐘類可以創建多個時鐘對象Java是區分大小寫字母的語言程式員可以自己定義類,也可以使用事先已經定義好的類本例只是電子時鐘類的設計的一個例子,它不是唯一的計算圓的周長和麵積classCircle{ floatr; //半徑
finaldoublePI=3.14159; //最終變數
Circle(floatd){ //構造方法
r=d; }
doublecircum(){ //求圓周長的方法
return2*PI*r; }
doublearea(){ //求圓面積的方法
returnPI*r*r; }}Circle類中含有兩個數據成員半徑r和一個常數PI(π),r使用了float型,PI使用了double型數據類型名(關鍵字)佔用記憶體空間數值範圍十進位表數精度int4位元組-231~231-1float4位元組(±3.4028235E+38f)~(±1.40239846E-45f)6~7位double8位元組(±1.79769313486231570E+308)~(±4.94065645841246544E-324)15位finalPI由於加了“final”,表示在程式執行過程中其值不能再變化,PI稱為最終變數。最終變數在程式中一般用大寫Circle類中定義了方法的結構方法首部方法體{}
方法首部描述方法名方法的返回值類型參數及其類型其他修飾符Java基本的運算符+(加),-(減或負),*(乘),/(除)>(大於),>=(大於等於),==(等於),<(小於),<=(小於等於),!=(不等於)=稱為賦值號,意即將其右面的值送到左面的變數中,相當於往一個記憶體單元中存放入一個數據值。類的構造方法類的構造方法與類同名,描述由類生成對象的操作,在創建對象時由系統調用。下麵的主類定義中給出了構造方法的作用主類Java應用程式由很多類組成,其中有且只有一個主類。含有主方法main()的類稱為Java應用程式的主類。Java規定,主類名必須與主類所在的檔案名相同。程式運行後,Java首先執行主類主方法中的第一個語句主類—UseCircle的定義classUseCircle{ publicstaticvoidmain(Stringargs[]){ CircleaCirc=newCircle(5.3f); //生成一個圓對象
doubles=aCirc.circum(); //計算該圓對象的周長
doubled=aCirc.area(); //計算該圓對象的面積
System.out.println("半徑為:"+aCirc.r+"的圓的周長為:"+s); //輸出周長
System.out.println("半徑為:"+aCirc.r+"的圓的面積為:"+d); //輸出面積
}}說明UseCircle類中,首先用new命令來調用Circle類的構造方法來創建一個Circle類的對象aCirct用語法形式:對象名.成員名;調用Circle類中的成員調用系統方法System.out.println()輸出結果Java平臺Java平臺是一種純軟體平臺,它需要其他基於硬體的平臺(如Window2000,Linux等)的支持。Java平臺由Java虛擬機(JavaVM)和Java應用程式介面(JavaAPI)兩部分組成。Java虛擬機易於被移植到基於不同硬體的平臺上,是Java平臺的基礎;Java應用程式介面由大量已做好的Java組件(組件是一種類)構成,這個介面提供了豐富的Java資源。Java虛擬機由於不同的機器有不同的機器語言,並且由於操作系統環境的排他性,使得在一種平臺上開發的程式運行到另一個平臺上時,多少還要進行一些修改,這樣就比較麻煩Java破解各機器不同的機器語言的策略是定義出自己的一套虛擬機器——Java虛擬機Java虛擬機的工作原理編寫Java程式Java編譯器Java源代碼(*.java檔)位元組碼(*.class檔)Java虛擬機Java解釋器forWindowsJava解釋器forUnixJava解釋器forMacOSPC電腦Unix伺服器Mac電腦Java一臺Java虛擬機就是一臺Java解釋器。經過Java解釋器的解釋,才得到具體的機器可以執行的代碼通常把Java程式的翻譯過程稱為半編譯、半解釋。而其他語言程式要麼是全編譯,要麼是全解釋Java既是一種語言,也是一種平臺。作為一種語言,Java通過所謂“半編譯、半解釋”使得Java程式具有“一次編寫,到處運行”的特點兩類Java程式按照運行環境的不同,可將普遍使用的Java程式分為兩種:Java應用程式(JavaApplication)。其是在本機上由Java解釋程式來啟動Java虛擬機JavaApplet(Java小應用程式)。其是通過流覽器來啟動Java虛擬機它們都是在Java虛擬機中執行JavaApplication在Java語言中,每個應用程式都是以類的形式出現的。一個程式中既可以只包含一個類,也可以包含多個類,此時稱為是一個多類程式。Java提供了一個特殊的方法——main()方法,每個應用程式的執行都是從主方法main()開始的,沒有main()方法的應用程式是不能執行的。包含了main()方法的類叫做主類,程式的主文件名必須與主類相同一個問候程式該程式的功能是在螢幕上顯示一個問候:
Hello,World!問候程式Java代碼classHelloWorld{ publicstaticvoidmain(StringArgs[]) { System.out.println(“Hello,World!”); }}main()方法main()方法是JavaApplication程式的入口,有著固定的書寫格式:publicstaticvoidmain(Stringargs[]){…}其中:·public表明所有的類都可以使用這一方法;·static指明該方法是一個靜態方法,可以通過類名來直接調用;·void則表示main()方法不返回任何值;·main(Stringargs[])是該方法的頭部,圓括號內是該方法可接受的參數。Java解釋器總是從main()方法開始解釋和執行應用程式,因此一個可執行的Application必須而且只能有一個main()方法本例中只有一條語句:System.out.println("Hello,World!");其中,System是一個系統類,System.out指代了標準輸出流,通過它的println()方法可以往標準輸出設備上輸出數據JavaAppletimportjava.applet.Applet; //將java.applet包中的系統類Applet引入本程式importjava.awt.Graphics; //將java.awt包中的系統類Graphics引入本程式publicclassHello_AppletextendsApplet{ publicvoidPaint(Graphicsg) { g.drawString(“Hellowold!),50,25); }}引入系統類語句類的首部類體關鍵字表示引入系統類import關鍵字import用於將系統類引入本程式本例中引入了兩個系統類——Applet和Graphics。這兩個系統類分別位於不同的系統包java.applet和java.awt中引用一個系統類時需要指明它們所在的包名類的聲明Applet與Application在結構上是有較大不同的,最主要體現在Applet中沒有main()方法一般來說,Applet中的類必須是公共的(用public來修飾)或有一個public型的構造方法,而且必須有一個類是系統類Applet的子類所謂一個類是另一個類的子類,就是說一個類繼承了另一個類,兩個類之間存在繼承關係。類的派生AppletHello_Applet…子類父類JavaApplet程式JavaApplet不像JavaApplication那樣是一個獨立的程式,它雖然也要先經過半編譯生成位元組碼檔,但是這個位元組碼檔不能夠直接被執行和使用。按照約定,它必須由支持Java的WWW流覽器(如IE、Netscape、Hotjava等)或appletviewer加載執行Applet運行的完整過程源代碼(*.java檔)位元組碼(*.class)檔Java編譯器HTML檔……Applet嵌入標記……WWW伺服器②下載HTML檔①請求HTML檔WWW流覽器③請求Applet位元組碼④下載Applet位元組碼⑤解釋執行Applet位元組碼Java程式開發環境——SDK工欲善其事,必先利其器。為了支持用戶的Java程式開發但是,SUN公司開發的Java2SDK(Java2SoftwareDevelopmentKit)比較適合初學者使用SDK集成有如下一些功能Java編譯器;Java解釋器:內附Appletviewer——AppletBytecode解釋器;內附Java——Application解釋器。簡單的除錯工具。1.2Java程式開發過程1Java應用程式開發過程舉例2JavaApplet開發過程舉例1.2Java程式開發過程Java應用程式開發過程舉例編輯——創建Java根源程式.根源程式用Java編程語言直接編寫的程式,通常是由一個或多個類組成的正文檔,尾碼為.java
半編譯——用Java編譯器(Javac)將Java根源程式翻譯成Java虛擬機(theJavaVirtualMachine,簡稱JavaVM)能理解的指令、再將這些指令組織為位元組碼檔將根源程式編譯為位元組碼檔(尾碼為.class)的過程半解釋(運行)——Java虛擬機(Java)解釋、運行包含在位元組碼檔中的程式創建原始檔案保存過程輸入完畢,檢查無錯後,應將這些代碼保存到一個檔中。Java規定,Java應用程式源代碼尾碼名必須為.java
半編譯在JDK中,Java的編譯器是javac.exe。使用javac命令,就可以將Java原始檔案編譯成位元組碼javac命令的一般格式為:
javac<檔案名>.java
path路徑設置path環境變數應指定操作系統到什麼地方去查找Java工具,並可以將當前所用機器的Java工具所在的路徑(一般在JDK檔夾下的BIN子檔夾中)賦給path環境變數。例如:path=%path%;c:\JDK1.2.2\BIN半解釋——運行編譯生成的位元組碼檔可以在本機中由java解釋器——java.exe運行。java命令的一般格式為: java檔案名
classpath環境變數classpath環境變數指定Java工具到什麼地方去查找類檔(.class檔)。系統提供的類檔相關資訊一般在JDK檔夾下的LIB子檔夾中,然後還需將用戶自己的類檔所在檔夾賦給classpath環境變數。例如:setclasspath=c:\jdk1.2.2\lib\.;d:\javaprogramHelloWorld程式的編譯、運行過程向應用程式傳遞參數Java應用程式通常是在命令行下運行的,允許用戶在這個命令行中向它傳遞資訊,運行時向程式傳送數據,增加了該程式的通用性假設用下麵的命令來運行程式:javaWhoSayWhatMarry"GoodDay!"那麼程式的運行結果為:Marrysay:GoodDay!JavaApplet開發過程舉例JavaApplet的創建過程也是分為三步:編輯、編譯和運行,其前兩個步驟與Application大致相同。但由於Applet是不獨立的小應用程式,所以不能直接用java命令來執行第二步生成的位元組碼檔,而是應該另外創建一個可以嵌入該Applet位元組碼的HTML檔,然後由支持Java的WWW流覽器或appletviewer來加載執行。創建原始檔案半編譯用Java編譯器來進行原始檔案的編譯,格式如下:
javacHello_Applet.java結果也是在當前檔夾下產生位元組碼檔Hello_Applet.class創建HTML檔Applet是不獨立的程式,不能夠直接被執行和使用,必須由支持Java的WWW流覽器或appletviewer加載執行。在執行小應用程式之前,必須先準備一個供其棲身的HTML檔,使用特殊的HTML標記,把Applet嵌入其中HTML標記形式<appletcode="……"width=……height=……>……</applet>其中,<applet>和</applet>說明在此插入一個Applet,位元組碼檔的名字放在“code=”後(擴展名.class,必不可少!),而width和height參數說明了此Applet佔用的寬度和高度Hello.html檔運行Appletviewer程式可以在JDK的bin檔夾下找到,用它可以流覽嵌有Applet的HTML檔。appletviewer.exe的一般格式為:appletviewer<檔案名>.html在MS-DOS平臺上,要流覽本例,只需輸入命令:
appletviewerHello.html
方法設計方法的基本概念運算符與運算式流程控制語句演算法設計舉例方法的基本概念Java類由狀態(或屬性)和行為兩部分組成。屬性是保存描述類對象狀態數據的途徑,但屬性並不具備任何活動能力。一個類要真正能完成一定的操作,就必須為類創建行為。行為描述了該類需要完成的每項具體任務所用的不同程式段,每個這樣的就叫做“方法”方法分類在Java程式中,用“數據”來描述類的屬性,用“方法”來實現類的行為。方法可分為成員方法(instancemethod)和類方法(classmethod,即由static修飾的方法,又叫做靜態方法)兩種方法的聲明描述方法的處理過程及其所需的參數,並用一個方法名來標識這個處理過程方法定義中的參數並沒有實際值,僅僅是為了描述處理過程而引入的,因此稱為形式參數(簡稱形參)方法的使用
通過向客體發送消息執行方法所定義的處理功能。使用方法時給出參數的實際值,這些實際值稱為實際參數(簡稱實參)方法首部的聲明語法形式如下:
[方法修飾符]方法返回值類型
方法名([形式參數表])其中:方法修飾符可以是static、final以及public、private和protected等。static、final本書不作專門介紹,“方法修飾符”是可選的語法部分。方法返回值類型說明方法返回值的數據類型,可是Java基本數據類型,也可是複合數據類型。當無返回值時,其返回值類型須說明為void。方法名標識所聲明的方法,必須是合法的Java識別字;形式參數表說明方法所需要的參數,當方法有多個參數時,參數間需用逗號“,”隔開;當方法沒有參數時,可以沒有“形式參數表”部分。形式參數的作用域是整個方法體。方法體方法體是一個語句序列,這一語句序列具體描述方法的返回值、方法的參數和方法所在類的成員變數之間的關係,以實現方法的功能。方法體中可以定義其內部使用的局部變數,其作用域是整個方法體。方法的返回值若方法的返回值類型不是void時,方法體中必須用return語句來返回一個方法聲明時指定類型的值。return語句的語法形式為:
return[運算式];其中,return是關鍵字。方法聲明的例子方法setCNumber:voidsetCNumber(intxNumber) //方法首部聲明:無方法修飾符,方法名為//setCNumber,方法的參數為xNumber,這一方法//無返回值{//方法體開始
cNumber=xNumber; //方法體中的語句,描述方法的功能}//方法體結束方法getCNumberintgetCNumber()//方法首部聲明:無方法修飾符,方法名為//getCNumber,這一方法無參數,這一方法
//的返回值類型為int{//方法體開始returncNumber;//將cNumber的值作為getCNumber方法的返回值}//方法體結束方法的調用與參數傳遞調用對象成員方法的語法形式為:
對象名.成員方法名([實際參數表]);對象名指定所使用的對象;成員方法名指定所要調用的成員方法;實際參數表是0個或多個運算式構成,多個運算式之間用逗號“,”分隔。實際參數的個數、順序及類型應與被調用方法的形式參數表中的形式參數一致。調用對象成員方法的語義計算實際參數表中(各)運算式的值,並將它(們)一一傳送給被調用方法中對應的形式參數,執行被調用方法的方法體。方法調用的結果就是被調用方法的執行結果實現兩float型數相加的方法例子classMethodDemo1{ floatadd(floatx,floaty)
//建議所取的方法名有助於說明方法的功能,以便閱讀程式和記憶
{ floatz;
//z是方法體的局部變數,作用域是整個add方法的方法體
z=x+y; returnz; }}classTryMethodDemo1{ //主類
publicstaticvoidmain(Stringargs[]){ MethodDemo1a=newMethodDemo1(); System.out.println(a.add(5,8)); }}實現兩float型數相加的方法例子二classObjPara{//定義對象作為參數的類,為便於舉例,本方法只有一個成員變數
floattemp;}classMethodDemo2{voidadd(floatx,floaty,ObjParaz){//方法首部聲明,此方法沒有返回值。
z.temp=x+y;//將x+y的結果存入類變數z的成員變數temp中。
}}classTryMethodDemo2{//主類
publicstaticvoidmain(Stringargs[]){ObjParab=newObjPara(); MethodDemo2a=newMethodDemo2(); a.add(4,6,b); System.out.println(b.temp); }}演示方法之間的消息發送與參數傳遞classMethodDemo3{ floatadd(floatx,floaty){ floatz; z=x+y; returnz; } voidcallAdd(floatm,floatn){ floatt; t=add(m,n);
/*向方法add發消息,將參數m,n的值分別傳遞給x,y,然後執行 方法add的方法體,計算x+y,計算結果作為add的返回值傳回給t*/ System.out.print(m+"+"+n+"="+t); }}classTryMethodDemo3{ //主類
publicstaticvoidmain(Stringargs[]){ MethodDemo3a=newMethodDemo3(); a.callAdd(4,6); }}方法間的消息發送與參數傳遞演示二classObjPara{ floattemp;}classMethodDemo4{ voidadd(floatx,floaty,ObjParaz){ z.temp=x+y; } voidcallAdd(floatm,floatn){ ObjParak=newObjPara(); add(m,n,k);/*向方法add發消息,將參數m,n的值分別傳遞給x,y,並將k的存儲地址值傳送給z,然後執行方法Add的方法體,計算x+y,計算結果通過對象k的成員temp傳回*/ System.out.print(m+"+"+n+"="+k.temp); } //k.temp的值即為m+n}classTryMethodDemo4{ //主類
publicstaticvoidmain(Stringargs[]){MethodDemo4a=newMethodDemo4(); a.callAdd(4,6); }}2.2運算符與運算式1賦值運算2算術運算3關係運算4邏輯運算5位運算符6三元運算7其他運算符基本定義對數據進行的操作稱為運算表示各種不同運算的符號稱為運算符參於運算的數據稱為運算元(operand)運算式(Expression)是由運算元和運算符按一定的語法形式組成的符號序列通過算術運算符將運算對象連接起來的式子,就稱為算術運算式
Java語言的運算符分類運算符結合性一元運算符+-++--!~()*右算術運算符*/%左+-移位運算符<<>>>>>左比較運算符<<=>>=instanceof左==!=按位運算符&左^|短路運算符&&左||條件(三元)運算符?:右賦值運算符=“op=”(複合賦值運算符)右1賦值運算給新定義的變數進行初始化或修改變數的內容需要用到賦值運算。賦值運算的一般形式為:
變數
=運算式;複合賦值運算符
在賦值運算符“=”之前加上其他運算符<op>,就構成了複合賦值運算符“<op>=”複合賦值運算符“<op>=”集成了計算和賦值兩大功能,對於任何類型相容的運算式x和y來說,x<op>=y複合賦值運算符包括:*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=和|=2算術運算算術運算符作用於整型或浮點型數據,完成算術運算。按運算元個數來分,有一元算術運算符和二元算術運算符
一元算術運算符運算符用法描述++op正值--op負值++++op或op++加1----op或op--減1++和--算術運算符稱為增一運算符和減一運算符可以作為首碼運算符可以作為尾碼運算符++和--運算符及用法運算符用法描述++x++運算式x++的值為x,然後x的值增1++++x運算式++x的值為x+1,x的值增1--x--運算式x--的值為x,然後x的值減1----x運算式--x的值為x-1,x的值減1二元算術運算符運算符用法描述+op1+op2運算元op1加上op2-op1-op2運算元op1減去op2*op1*op2運算元op1乘以op2/op1/op2運算元op1除以op2%op1%op2求運算元op1除以op2的餘數(取模)整數算術運算的除法和取模遵循以下等式 (a/b)*b+(a%b)==a對於浮點算術運算來說
a%b和a-((int)(a/b)*b)的語義相同在取模運算時,假設運算元中至少有一個負數,那麼一般採取這樣一個有用的規則先忽略掉所有運算元的符號來計算得到結果,然後將“%”左邊的操作符的符號賦給它得到最終答案一個算術運算的例子publicclassArithmaticOp{publicstaticvoidmain(Stringargs[]){ inta=5,b=3; intc=++a/b; intc2=a--/b; intc3=a*2%b; doubled=2.5; doubled2=d%3; System.out.println("c="+c); System.out.println("c2="+c2);
System.out.println("c3="+c3); System.out.println("d2="+d2);}}3關係運算關係運算實際上就是比較運算,它的運算結果是一個布爾類型的值。如果兩個運算對象符合關係運算符所要求的比較關係,則關係運算結果為true,否則為false。Java語言提供的關係運算符都是二元運算符關係運算符運算符用法功能>op1>0p2如果op1大於op2則結果為true,否則為false>=op1>=op2如果op1大於或等於op2則結果為true,否則為false<op1<op2如果op1小於op2則結果為true,否則為false<=op1<=op2如果op1小於或等於op2則結果為true,否則為false==op1==op2如果op1等於op2則結果為true,否則為false!=op1!=op2如果op1不等於op2則結果為true,否則為false關係運算式
用關係運算符將兩個相同類型的運算式連接起來的的式子,稱為關係運算式
3>5 ‘a’<’z’ x+y!=z都是合法的關係運算式賦值(“=”)和等價比較(“==”)關係運算符(<、<=、>、>=)一般適用於兩側的運算元均為整數型、浮點型或字元型數據的情形,布爾型數據只能用在==或!=比較中。關係運算符(<、<=、>、>=)連接的運算式本身不能是關係運算式。例如:x>y>z是非法的。關係運算的結果不能存放在一個非布爾型變數中一個關係運算的例子publicclassRelationOp{publicstaticvoidmain(Stringargs[]){inta=25,b=3;booleand=a>b; booleand1=3.5<2.6; booleand2='A'<='A'; booleand3=false!=true; booleane=a>=a*2-b*9;System.out.println("d="+d); System.out.println("d1="+d1); System.out.println("d2="+d2); System.out.println("d3="+d3); System.out.println("e="+e);}}4邏輯運算關係運算只能表示一個簡單的條件,而邏輯運算可以將幾個關係運算式或者布爾值連接起來,表示一個較複雜的條件邏輯運算的運算對象必須是布爾值類型的運算式,運算結果也是布爾值類型的數據邏輯運算符運算符用法功能分類!(邏輯非)!op1op1為true,則結果為false,否則為true。一元&&(邏輯與)op1&&op2op1和op2都為true,則結果為true,否則為false。二元||(邏輯或)op1||op2op1和op2都為false,則結果為false,否則為true。邏輯運算的真值表xy!x!yx&&yx||ytruetruefalsefalsetruetruetruefalsefalsetruefalsetruefalsetruetruefalsefalsetruefalsefalsetruetruefalsefalse短路運算符
“&&”和“||“又叫做短路運算符在由它們連接組成的邏輯運算式的求解過程中,總是先求出運算符左邊的運算式的值,再根據具體情況決定是否需要計算運算符右邊的運算式對“||”運算,如果左邊的運算式的值為true,則不必對運算符右邊的運算式再進行運算,整個運算式的結果就為true對“&&”運算,如果左邊的運算式的值為false,則不必對運算符右邊的運算式再進行運算,整個運算式的結果就為false。關係運算符和邏輯運算符共用的例子publicclassRelationAndConditionOp{publicstaticvoidmain(Stringargs[]){inta=28,b=3;inte=3;if(e!=0&&a/e>5)System.out.println("a/e="+a/e);intf=0;//下麵不會發生除零溢出的錯誤,因為e!=0為false,所以不需要對a/f進行運算。
if(f!=0&&a/f>5)System.out.println("a/f="+a/f);elseSystem.out.println("f="+f);}}5位運算符位運算符用來對二進位位進行操作,其運算元只能為整型或字元型數提示:在Java中,使用補數來表示二進位數,最高位為符號位,正數的符號位為0,負數的符號位為1位運算符運算符用法描述分類~~op1按位取反運算按位運算符一元&op1&0p2按位與運算二元|op1|0p2按位或運算^op1^0p2按位異或運算<<op1<<0p2左移運算移位運算符>>op1>>0p2帶符號右移運算>>>op1>>>0p2不帶符號右移運算4種按位運算“~”是按位取反運算符“&”是按位與運算符“|”是按位或運算符“^”是按位異或運算符按位取反運算符對數據的每個二進位位取反,即把1變成0,把0變成1。例如:
~00001111=11110000“&”是按位與運算符要求有兩個運算元進行運算。如果兩個相應位均為1,則該位的結果為1,否則結果為0。即:
0&0=00&1=0 1&0=01&1=1提示: 對某個數中某些特定的位清零 用來取某個數中某些指定的位“|”是按位或運算符只要兩個相應位中有一個為1,則該位的結果為1,否則結果為0。即:
0|0=00|1=1 1|0=11|1=1提示: 按位或運算可以用來將某個數中某些特定的位置1“^”是按位異或運算符同樣要求有兩個運算元進行運算。如果兩個相應位相同,則該位的結果為0,否則結果為1。即:
0^0=00^1=1 1^0=11^1=0提示:
用來使某個數中某些特定的位取反 實現兩個值的交換,而不需使用臨時變數
布爾型運算元上時的運算規則Op1Op2Op1&Op2Op1|Op2Op1^Op2truetruetruetruefalsetruefalsefalsetruetruefalsetruefalsetruetruefalsefalsefalsefalsefalse其他3種移位運算(a)左移運算(<<)(b)帶符號右移運算(>>,又稱為算術右移)(c)不帶符號的右移運算(>>>,又稱為邏輯右移)移位運算的例子x(十進位表示)x的二進位補數表示x<<2x>>2x>>>23000011110011110000000011100000111-17111011111011110011111011001110116三元運算條件運算符“?:”比較特殊,是Java語言中僅有的一個三元運算符,它的一般形式為:
運算式1?運算式2:運算式3其中運算式e1的值必須是布爾值類型,如果該值為true,則對運算式e2進行求值,並將e2的求值結果作為整個運算式的值;否則對運算式e3進行求值並將e3的結果作為整個運算式的值。一個條件運算符的例子/*編程從三個整數x,y,z中選出最大和最小者。*/classMax2{publicstaticvoidmain(Stringargs[]){intx=335;inty=212;intz=38;inta,b,max,min;System.out.println("原來的整數的值為:x="+x+",y="+y+",z="+z);a=(x>y?x:y);max=(a>z?a:z);b=(x<y?x:y);min=(b<z?b:z);System.out.println("最大的元素的值為:"+max);System.out.println("最小的元素的值為:"+min);}}7其他運算符這裏主要介紹對象運算符instanceof
它也可以說是一種比較運算符,用來判斷一個運行時的對象是否屬於某個指定類或其子類的實例,如果是則返回true,否則返回false其一般形式為:
對象名
instanceof類名對象運算符的用法publicvoidmethod(Employeee){if(einstanceofManager){…//dosomethingasaManager}elseif(einstanceofContractor){ …//dosomethingasaContractor}else{ …//dosomethingelse} }2.3流程控制語句語句類型關鍵字迴圈while,do-while,for選擇if-else,switch-case轉向控制break,continue,label:,return*異常處理try-catch-finally,throw重點說明流程控制語句1迴圈結構(LoopConstructs)2選擇語句(SelectionStatements)LoopConstructs迴圈的作用是反復執行同一塊代碼直到滿足結束條件三種迴圈語句:
1)while語句
2)do-while語句
3)for語句while語句while語句實現“當型”迴圈,它的語法形式為:
while(布爾運算式)
循環體
while語句用於在布爾運算式(即測試條件)的值保持為真(true)時反復地執行其中的內嵌語句(一般叫做循環體)
while語句的流程圖循環體布爾運算式true例求100以內所有奇數的和
publicclassWhileDemo{publicstaticvoidmain(String[]args){inti,sum;sum=0; //計數器清0i=1; //i的初始值為1(因為1是最小的奇數)
while(i<=100){sum+=i;i+=2; //奇數的間隔為2}System.out.println(sum);}}do-while語句do-while語句實現“直到型”迴圈,它的語法形式如下:
do
循環體
while(布爾運算式);
do-while語句執行的過程為:先執行一次循環體中的語句,然後測試布爾運算式的值。如布爾運算式的值為真,那就返回執行循環體中的內容
do-while語句的流程圖布爾運算式循環體falsetrue例求100以內所有奇數的和
publicclassDoWhileDemo{ publicstaticvoidmain(String[]args){ inti,sum; sum=0; //計數器清0 i=1; //i的初始值為1 do{ sum+=i; i+=2; }while(i<=100); System.out.println("sum="+sum); }}do-while語句和while語句的不同之處do-while語句總是先進入迴圈,然後檢測條件,再決定是否繼續迴圈while語句是先測試條件,再決定是否進入迴圈所以,用do-while語句時,循環體至少執行一次。體會while語句publicclassWhileDemo2{ publicstaticvoidmain(String[]args){ inti=88; while(i<88){ System.out.println("Print"+i); i++; } }}此例的運行結果是什麼也不輸出體會do-while語句publicclassDoWhileDemo2{ publicstaticvoidmain(String[]args){ inti=88; do{ System.out.println("Print"+i); i++; }while(i<88); }}此例的運行結果是:Print88for語句實現“當型”迴圈,它的語法形式為:
for(運算式1;運算式2;運算式3)
循環體
每個for語句都有一個用於決定迴圈開始和結束的變數,通常稱這個變數為迴圈控制變數
for語句的執行過程先求解運算式1;求解運算式2,若其值為true,則執行for語句中的循環體,然後執行下麵第(3)步。若值為false,則結束迴圈,轉到第(5)步。求解運算式3。轉回上面第(2)步繼續執行。執行for語句下麵的一個語句。for語句的流程圖求解運算式1運算式2循環體求解運算式3for語句的下一語句truefalse例求100以內所有奇數的和
publicclassForDemo{ publicstaticvoidmain(String[]args){ intsum; sum=0; //計數器清0 for(inti=1;i<=100;i+=2){ sum+=i; } System.out.println(sum); }}例求1+2+…+999的和
/*試for後分號的作用*/publicclassForDemo2{ publicstaticvoidmain(String[]args){ intsum=0; inti; for(i=1;i<1000;i++);//注意此處圓括號後面有一個分號
{ sum+=i; } System.out.println("i="+i);System.out.println("sum="+sum);}}迴圈的嵌套一個循環體內又包含另一個完整的迴圈結構,稱為迴圈的嵌套內嵌的迴圈中還可以嵌套迴圈,這就是多重迴圈上述三種迴圈(while迴圈,do-while迴圈和for迴圈)語句之間可以相互嵌套使用。例輸出一個0~9的乘法表
publicclassMultiTable{ publicstaticvoidmain(Stringargs[]){ intb,c,a; for(b=0;b<=9;b++){ for(a=0;a<=b;a++) System.out.print(a+"*"+b+"="+a*b+'\t'); System.out.println(); } }}迴圈結構中的continue語句continue語句的一般語法格式為:
continue[標號];其中,用“[]”括起的標號部分是可選的,分兩種使用情況:不帶標號的使用情況:此時,continue語句用來結束本次迴圈(對於for語句,在進行迴圈條件的判斷之前,還要先改變迴圈控制變數的值(即先執行運算式3))帶標號的使用情況:此時,continue語句跳過標號所指語句塊中所有餘下部分的語句,回到標號所指語句塊的條件測試部分進行條件判斷,以決定迴圈是否繼續執行。例不帶標號的continue語句classEndInnerLoop{ publicstaticvoidmain(Stringargs[]){ System.out.println("21世紀的閏年有:"); intn=0; //計數
for(intyear=2000;year<3000;year+=4){ if(year%100==0&&year%400!=0) continue; System.out.print(year+"\t"); n++; if(n<10) continue; System.out.println(); n=0; } }}例帶標號的continue語句classContinueLabel{ publicstaticvoidmain(Stringargs[]){ outer: for(inti=0;i<10;i++){ for(intj=0;j<10;j++){ if(j>i){ System.out.println(""); continueouter; } System.out.print(""+i+"*"+j+"="+(i*j)); } } }}列印一個三角形的0至9的乘法表break語句測試的條件為true,也希望迴圈立即終止,這時可以用break語句實現此功能break語句與continue語句一樣,對迴圈的執行起限定轉向的作用與continue語句只能在迴圈中使用不同,break語句除了可以用在迴圈語句中之外,亦可以用於switch語句中continue語句只結束本次迴圈,而不是終止整個迴圈的執行。而break語句則是結束整個迴圈語句的執行break語句的一般語法格式break語句的一般語法格式為:
break[標號];其中,用“[]”括起的標號部分是可選的。分兩種使用情況:不帶標號的情況:其功能是終止break所在的迴圈,轉去執行其後的第一條語句。在執行時有兩個特點:一是在有多重迴圈時,它只能使迴圈從本層的迴圈跳出來;二是此時程式一定轉移到本層迴圈的下一個語句。帶標號的情況:其功能是終止由標號指出的語句塊的執行,並從緊跟該塊的第一條語句處開始往下執行。典型用法是實現從其所處的多重迴圈的內部直接跳出來,只要在欲跳出的迴圈開始處加上標號即可。例不帶標號的break語句publicclassBreakDemo{publicstaticvoidmain(String[]args){ intn=0; //計算素數的個數
intb=999;outer: //外層迴圈,定義一個標號
do{ b+=2; intm=(int)(Math.ceil(Math.sqrt(b))); for(inti=2;i<=m;i++){//內層迴圈,判斷b是否為素數
if(b%i==0) continueouter; } n++; if(n==3) break; }while(true); System.out.println("大於1000的第三個素數為:"+b);}}例帶標號的break語句publicclassBreakDemo{ publicstaticvoidmain(String[]args){ intsum=0; coloop: //定義標號
while(sum<=100){ for(intcount=1;count<10;count++){ sum+=count; if(sum>60) breakcoloop; } } System.out.println("sum="+sum); }}SelectionStatements選擇語句提供了一種控制機制,使得程式根據相應的條件去執行對應的語句Java中的選擇語句有兩個:
1)負責實現兩路分支的if-else語句
2)負責實現多路分支的switch語句。if-else語句簡單形式
if-else語句的一般語法形式為:if(布爾運算式){
語句1}[else{
語句2
}]if語句的流程圖無else部分
truefalse語句1後續語句布爾運算式if語句的流程圖有else部分布爾運算式truefalse語句1語句2後續語句例沒有else部分的if語句classIfExam{publicstaticvoidmain(String[]args){ System.out.println("請輸入一個要求其絕對值的數:"); if(args.length!=1){ System.err.println("請重新執行,一定要輸入一個數!"); System.exit(-1); } doublenumber=Double.valueOf(args[0]).doubleValue(); System.out.print("你輸入的數是:"+number); if(number<=0) number=-number; System.out.println("該數的絕對值為:"+number); }}例有else部分的if語句classIfTry{publicstaticvoidmain(String[]args){ System.out.println("請輸入你的成績:"); if(args.length!=1){ System.err.println("請重新執行,一定要輸入一個整數!"); System.exit(-1); } intnumber=Integer.parseInt(args[0]); if(number>=60){ System.out.println("祝賀你,你及格了!"); } else{ System.out.println("真遺憾,你沒及格,請繼續努力!"); }}}if-else語句嵌套形式 if語句中內嵌的語句1或語句2又是if語句的情況稱為if語句的嵌套,其常用形式為:
if(布爾運算式1) {
語句1 } …… elseif(布爾運算式m) {
語句m } else {
語句n }例實現多重嵌套classIfSeason{publicstaticvoidmain(String[]args){ System.out.println("請輸入一個有效月份:"); if(args.length!=1){ System.err.println("請重新執行,一定要輸入一個整數!"); System.exit(-1);} intmonth=Integer.parseInt(args[0]); System.out.print("你輸入的月份是:"+month); Stringseason; if(month==12||month==1||month==2){ season="冬天"; }elseif(month==3||month==4||month==5){ season="春天"; }else{ season=“無效的月份或夏天、秋天!請重新執行。";} System.out.println("所處季節為:"+season);}}switch語句上面所講的if語句的嵌套形式雖然能夠實現多路分支,滿足程式流程控制的要求,但是它欠缺靈活性,程式書寫比較麻煩,而且可讀性不太好在Java中,為多路選擇流程控制專門提供了一個語句--switch語句switch語句根據一個供進行判斷的運算式的結果來執行多個操作中的一個語法形式switch(運算式){case常量1:
語句1 [break;]case常量2:
語句2 [break;] …case常量n:
語句n [break;][default:
缺省處理語句
[break;]}switch語句的流程圖常量1語句1缺省處理語句default常量n運算式常量2語句2語句nbreakbreakbreakbreak…後續語句switch語句的注意點使用switch語句時,要注意用作判斷的運算式必須是符合byte,char,short,int類型的運算式,而不能使用浮點類型或long類型,也不能為一個字串;switch語句將運算式的值依次與每個case子句中的常量值相比較。如果匹配成功,則執行該case子句中常量值後的語句,直到遇到break語句為止;case子句中常量的類型必須與運算式的類型相容,而且每個case子句中常量的值必須是不同的;default子句是可選的,當運算式的值與任一case子句中的值都不匹配時,就執行default後的語句。(e)break語句用來在執行完一個case分支後,使程式跳出switch語句,執行switch語句的後續語句。(f)在一些特殊的情況下,例如多個不同的case值要執行一組相同的操作,可以寫成如下形式:
case常量n:
case常量n+1:語句
[break;](g)case分支中包括多個執行語句時,可以不用花括弧“{}”括起;(h)通過if-else語句可以實現switch語句所有的功能。但通常使用switch語句更簡練,且可讀性強,程式的執行效率也高;例用switch語句實現判斷某月份
classSwitchSeason{publicstaticvoidmain(String[]args){System.out.println("請輸入一個有效月份:");
if(args.length!=1){ System.err.println("請重新執行,一定要輸入一個整數!"); System.exit(-1); }intmonth=Integer.parseInt(args[0]); System.out.print("你輸入的月份是:"+month);Stringseason;switch(month){case12:case1:case2:seaso
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年重庆市巫溪县数学中考三模
- 医疗笔试试题及答案
- 急性心梗考试题及答案
- 洁净服管理规程
- 水泥厂能耗降低办法
- 某家具厂工艺改进准则
- 生成式大模型项目实战教案 项目7 实现 AIGC 视频工业化-数字人创作与智影平台全链路解析
- 202暑假培训机构代课教师短期聘用协议三篇
- 安徽省2026八年级数学下册第17章一元二次方程及其应用17.4一元二次方程的根与系数的关系课件新版沪科版
- 2026年农资门店安全管理试题及答案
- 混凝土养护委托协议书
- 雨课堂在线学堂《马克思与当代欧陆思想》单元考核测试答案
- 安全工伤培训总结课件
- 山东省潍坊市2024-2025学年高二下学期期末考试政治试题(含答案)
- 2025年1月国家开放大学汉语言文学本科《外国文学专题》期末纸质考试试题及答案
- 轧钢机械装备及其智能化技术 课件 第7章 剪切机
- 04S520埋地塑料排水管道施工标准图集
- 锅炉更换烟管安装施工方案
- 安徽大学《数据结构与算法》2023-2024学年第一学期期末试卷
- 中建企业定额数据库(劳务分包库)
- 四川省成都市第十一中学2024-2025学年高一上学期入学分班质量检测数学试题(原卷版)
评论
0/150
提交评论