面向对象程序设计课件_第1页
面向对象程序设计课件_第2页
面向对象程序设计课件_第3页
面向对象程序设计课件_第4页
面向对象程序设计课件_第5页
已阅读5页,还剩263页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

面向對象程式設計

【學習目標】瞭解Java的歷史和發展瞭解Java的工作方式初步接觸Java程式的兩種方式:

JavaApplication和JavaApplet學習閱讀Java幫助文檔,並安裝Java開發環境和幫助文檔第一章Java編程語言概述1.1Java的歷史與發展1.1.1Java的歷史最初命名為Oak(橡樹)小組主要成員:JamesGosling等最初目的:與家用電器一起使用1994年,小組意識到Oak非常適合用於Internet於1995年5月發佈第一個非試用版本於1996年發佈Java技術是免費的JamesGoslingJavaOne大會1996年5月,第一界JavaOne大會在三藩市召開。1.1.2Java的發展1995.5.23Java誕生1997.2.18JDK1.1(Java1.1API)

VJ++、cafe、JBuilder….支持

1998.12JDK1.2(Java2SDK1.2)

目前版本J2SDK1.4.2網址(查詢新動向)《ThinkinginJava》,BruceEckel, 機械工業出版社1.1.3Java的設計目標

創建一種面向對象的程式設計語言

易於移植到不同的平臺(一次編譯,到處運行)

吸收C和C++的優點,使程式員容易掌握

去掉C和C++中影響程式健壯性的部分,例如指針、記憶體申請和釋放,使程式更安全穩定

實現多線程,使得程式能夠同時執行多個任務

為分佈式環境提供動態下載程式代碼的機制

提供代碼校驗機制以保證安全性1.2Java的工作方式電腦的高級編程語言類型: -編譯型

-解釋型編譯型:跨平臺性差解釋型:跨平臺,速度慢Java檔類型.java Java原始檔案.class 二進位位元組碼檔Java編譯器Importjava.io.*;classtest{….}test.javaDFBA0988……..test.class編譯過程Java虛擬機Java虛擬機的建立需要針對不同的軟硬體平臺做專門的實現,既要考慮處理器的型號,也要考慮操作系統的種類。如下圖所示,目前在SPARC、X86、MIPS和PPC等嵌入式處理晶片上、在UNIX、Linux、windows和部分即時操作系統上都有java虛擬機的實現。Java根源程式編譯位元組碼檔Java虛擬機執行LinuxWindowsMac

1.2.2Java平臺 TheJavaVirtualMachine(JVM)

TheJava應用編程介面(JavaAPI):

Java應用編程介面是已編譯的可在我們的程式中使用的代碼庫(基礎類庫)。它們使我們能夠添加現成的可定制的功能,以節約編程時間。

JavaPlatform2J2SE:StandardEdition針對桌面電腦開發(主要有JavaApplet和JavaApplication應用程式J2EE:EnterpriseEdition用來開發企業應用的平臺,基於組件技術的應用開發框架J2ME:MircoEdition針對嵌入式技術1.3Java語言的特點

Asimple,object-oriented,distributed,interpreted,robust,secure,architecture-neutral,portable,high-performance,multi-threaded,dynamiclanguage1.簡單、面向對象和分佈式

2.解釋執行、魯棒並且安全

3.結構中立並且可以移植

4.高性能

5.多線程並且是動態的簡單:KISSC++like無指針自動記憶體回收面向對象完全基於類、對象封裝、繼承、多態取消多繼承、模版、運算符重載分佈式動態下載程式代碼的機制完全是為了適應網路分佈式計算的特點Java簡化了網路支持,使得網路編程比較簡單。遠程方法調用(RMI)技術使得分佈式計算實現起來非常容易。Java對XML的強大支持進一步提高了分佈式環境下的計算。解釋執行穩定性檢查數據類型的匹配,數組下標越界檢查無指針自動記憶體管理,保護記憶體數據、程式碎片收集例外控制機制,正確處理運行時錯誤

安全性代碼檢測垃圾收集機制,自動記憶體回收無指針可移植

JVM統一的數據類型

int-32bit char-16bitunicode高效JIT(Just-In-Time)及時編譯器的代碼生成技術可按需編譯位元組代碼為機器代碼,提高運行速度。多線程支持多任務動態動態下載程式代碼的機制,程式可以根據需要把代碼即時的從伺服器中下載過來執行

對象(object)我們可以把生活所在的真實世界(RealWorld)當作是由許多大小不同的對象所組成的。對象可以是有生命的個體,比如一個人或一只鳥。對象

對象也可以是無生命的個體,比如一輛汽車或一臺電腦。對象也可以是一件抽象的概念,如天氣的變化或滑鼠所產生的事件。對象的特徵

對象有兩個特徵:屬性和行為例如: 人有他的身高或體重作屬性,有他的行為——如唱歌、打球、騎摩托車、開汽車。 狗有它的顏色作屬性,有它的行為,如吠叫或跳躍。

電視機有它的外形、尺寸和顏色,有它的行為,如開、關,接收信號,轉換頻道,調節音量。換檔開大燈煞車開冷氣顏色排檔數排氣量輪胎型號汽車對象

以汽車為例,我們可定義其屬性與方法如:

本教程

中使用下麵的示例來應用面向對象的分析與設計原理。公司名稱:DirectClothing公司按月生成目錄客戶可以打電話、使用郵寄和傳真必須每個檢查訂購項的存貨水準DirectClothing接受支票和信用卡案例研究

系統建模技術嘗試描述一個系統在現實生活中的情形定義系統的:對象——讓對象工作的問題對象屬性——對象的特徵對象操作——所能執行的任務面向對象概述

對象:

找出問題描述領域中的主要名詞對象可能是:簡單的或複雜的(襯衣,銀行)真實的或概念的(銀行出納員,帳戶)對象有:屬性(顏色,尺寸)操作(下訂單,取消訂單)確定對象

屬性:是對象的特徵可以是數據或對象對Order對象來說,可能包括orderID和items操作:是對象執行的動作可以是對象做出的或施加給對象的動作對Order對象來說,可能是place和cancel確定對象屬性和操作

建模對象

屬性類型

與問題域的相關性對象是否在問題陳述的界限之內?系統是否必須有此對象才能完成任務?在用戶與系統的交互中是否必須有此對象?獨立存在性屬性和操作測試對象

分析問題域實驗目標:找出問題域中的對象,及其屬性和操作步驟:1、列出有關的對象(名詞)

2、列出這些對象的屬性和操作

3、為對象設置合理的屬性和操作

4、應用上述的3條評判規則檢驗對 象的有效性練習 Anobject-orienteddesignforaJavaapplicationthattrackssoccerscores.Theprogramshouldtrack:ThenumberofgoalseachplayerscoresineachgameWhatteamstheplayersplayforandwhatseasonthegameswereplayin

類(class)在真實世界裏,有許多同“種類”的對象。而這些同“種類”的對象可被歸類為一個“類”。例如我們可將世界上所有的汽車歸類為汽車類,所有的動物歸為動物類。動物類汽車類什麼是類?是同種對象的集合與抽象

類與對象的關係 類

對象抽象定義實例

電視機

一臺長虹電視機學生

學生王強

類與對象如果將對象比作汽車,那麼類就是汽車的設計圖紙。所以面向對象程式設計的重點是類的設計,而不是對象的設計。

實例(instance)汽車類有些共同的狀態(汽缸排氣量,排檔數,顏色,輪胎數……)和行為(換檔,開燈,開冷氣……),但每一臺汽車個別的狀態及方法可不同於且獨立於其他汽車。你的汽車只是這世界中許多汽車中的一個。我們就稱你的汽車對象是汽車類中的一個實例(instance)。汽車類(class)實例(instance)NEW你的車OO的真正意義

OO的真正意義是使得軟體開發接近人類的正常思維,將許多原來由人完成的工作交給機器去完成:

-機器語言 組合語言 高級語言

-面向過程 面向模組 面向對象

OO包括一套比較完整的方法,程式設計只是其中一個環節。

-面向對象的分析

-面向對象的設計

-面向對象的程式設計

-代碼重用面向對象與面向過程公共數據函數函數函數函數演算法+數據結構屬性數據方法方法屬性數據方法方法過程式程式設計OOP程式設計對象+消息消息面向過程面向對象OOP三大特性:封裝、繼承與多態

封裝(encapsulation)

封裝是一種資訊隱藏技術。是指利用抽象數據類型將數據和基於數據的操作封裝在一起,數據被保護在抽象數據類型的內部,系統的其他部分只有通過在數據外面的被授權的操作才能夠與這個抽象數據類型進行交互。在面向對象的編程中,用類來封裝相關的數據和方法,保證了數據的安全和系統的嚴密性。

倉庫屬性操作價格表,物品,帳單,電話,等等提供物品,帳單等等考慮一個倉庫,外部只能通過管理員獲取物品。抽象封裝的優點隱藏類的實現細節,實現了資訊的隱藏及安全性;提高了程式的模組化,且易於維護;具體實現是編寫該類的人控制的,讓使用者只能通過事先定制好的方法來訪問數據,可以方便地加入控制邏輯,限制對屬性的不合理操作繼承(inheritance)

OOP是以類來定義一個對象的。當一個類擁有另一個類的所有數據和方法時,就稱這兩個類之間具有繼承關係。現以下圖來說明:汽車類轎車巴士計程車轎車、計程車、巴士都是汽車,故屬汽車類,我們稱其繼承(inherit)汽車類,而轎車、計程車、巴士也都可自成一種類。這樣汽車類就稱為超類(superclass)或父類,而轎車、計程車、巴士就稱作子類。繼承交通工具車船飛機汽車火車父類/超類(superclass)子類(subclass)Java僅支持單繼承優點: 使程式結構清晰,減少了編碼和維護的工作量,子類可以使用父類所提供的方法,實現了代碼的複用。多態用同一個名字調用實現不同操作的方法方式1:父類和子類之間的同名方法(覆蓋:子類方法的名稱和參數與父類方法的名稱和參數相同,在執行過程中,子類的方法將覆蓋父類的方法)方式2:同一類中參數不同的同名方法(重載:不是子類對父類同名方法的重新定義,而是類對自身已有的同名方法的重新定義。重載方法的參數必須不同,或者是參數個數不同,或者是參數類型不同)使用方便,且降低了維護和編程量

覆蓋

classA { publicintx,y; A(inta,intb) { x=a; y=b; } publicvoiddisplay() { intz; z=x+y; System.out.println(“add=”+z); } } classBextendsA { B(inta,intb) { super(a,b); } publicvoiddisplay() { intz; z=x*y; System.out.println(“product=”+z); } }classABextendsB { AB(intx,inty) { super(x,y); } publicstaticvoidmain(String[]args) { Anum1=newA(4,10); Bnum2=newB(4,10); ABnum3=newAB(4,10); num1.display(); num2.display(); num3.display();

} }重載classMethodOverloading { voidreceive(inti) { System.out.println(“一個整數”); System.out.println(“i=”+i); } voidreceive(intx,inty) { System.out.println(“兩個整數”); System.out.println(“x=”+x+”y=”+y); } voidreceive(doubled) { System.out.println(“一個浮點數”); System.out.println(“d=”+d); } voidreceive(Strings) { System.out.println(“一個字串”); System.out.println(“s=”+s); } }

publicclassMethodOverloadingTest { publicstaticvoidmain(String[]args) { MethodOverloadingMO=newMethodOverloading(); mo.receive(1); mo.receive(2,3); mo.receive(12.56); mo.receive(“Hello”);

} }面向對象的三大特徵1.封裝:將數據成員(DataMember)和屬於此數據的操作方法(OperatingMethod),放在同一個實體(Entity)或對象中。2.繼承:父類定義(Define)一些通用的屬性與行為,其孩子繼續使用。3.多態:在同一個類中可有許多同名的方法,但其參數數量與數據類型不同,而且操作過程與返回值也可能會不同。(1)模組化

(2)資訊隱藏

(1)實現代碼複用

(2)簡化設計過程解決其他語言中不能重名的問題

接口Interface這個英文字的意思是一種裝置或系統,使得不同性質的實體(entities)能夠交互地運作。比如,電腦的操作系統(operatingsystem),可把它稱作是一種“人機介面”。可使得使用者(人)與電腦(機),通過滑鼠或鍵盤等裝置,而作為一種溝通介面,來與電腦做溝通,以指揮電腦做事。另外像RS232串行端口,常作為輸入/輸出設備傳輸介面,是電腦與輸入/輸出設備間的介面。而在Java裏,設計介面的用意,是可使得類不必受限於單一繼承的關係,而可靈活地同時繼承一些共有的特性,達到多重繼承的目的,而免去C++中多重繼承的複雜關係所產生的bug。像下圖中的計程車,可繼承“營業車”、“小車”、“汽油車”等類,卻不一定非要與同樣繼承“自用車”、“小車”,“汽油車”的轎車有上下繼承的關係。汽車類自用車營業車小車大車汽油車柴油車轎車計程車巴士上類介面次類改變程式的一部分不影響其他部分。程式的其他部分與類的介面(“外部”)進行交互更改類的實現(“內部”)而不更改介面封裝的汽車:實現細節隱藏在車蓋下;駕駛員不必知道汽車是怎樣工作的汽車的部分零件改變或更換,駕駛員不必改變對汽車的駕駛介面和實現

介面的定義

介面可以理解為一個特殊的類,只有常量和抽象方法組成的特殊類。

interfaceCollection { intMAX_NUM=100; voidadd(inta); voiddelete(intb); intfind(intc); intcurrentCount(); }以前編寫的操作可以在其他工程中再次使用,可提高開發效率,縮短開發週期複用

繼承概述有重複成員的類繼承:Manager和CSR繼承Employee繼承的定義一個類中定義一些公共成員(變數和方法),其他類可以擴展該類而共用成員被擴展的類是:超類或父類繼承了的類是:子類查看結果:Employee.java繼承:Employee和Customer繼承Person測試繼承類一次只能繼承一個父類(單繼承)使用“是一個(isa)”短語驗證繼承Employee、Manager和CSR示例中繼承是正確的一個Manager是一個Employee一個CSR是一個Employee測試繼承錯誤原因:不滿足“isa”短語正確原因:滿足“isa”短語查看結果:AddTest.javasupersuper用來引用當前對象的父類(1)訪問父類被隱藏的成員變數,如:

super.variable;(2)調用父類中被重寫的方法,如:

super.Method([paramlist]);(3)調用父類的構造函數,如:

super([paramlist]);查看結果:OverTest.java包import語句格式:importpackage1[.package2…].(classname|*);從目錄classpath\package1\package2…中查找。

classname指明所要引入的類,例如:

importjava.awt.Button;*表明要從一個包中引入多個類,例如:

importjava.awt.*;新術語在Java技術中:變數=屬性方法=操作類仍然稱作類所謂類就是一類屬性(變數)和操作(方法)的描述。其中,屬性可用一系列的變數表達,而操作用一系列方法表示。一類人員Person:抽象出下列屬性:名字、年齡、身高、婚否、性別,分別用變數name、age、height、marriage、sex表示(見名知義),吃飯,講話,走路等行為可表示為相應的方法eat(),speak(),walk()等。用Java語言描述Person類如下:classPerson{//以下5個是變數Stringname;intage;doubleheight;booleanmarriage;charsex;

speak(…)//方法{…}

eat(…)//方法{…}}

對Person類中某一特定的人,上述變數就有特定的值,如name(張三),age(20),height(1.76),marriage(false),sex(’m’)。主要的應用程式組件類代碼塊是程式的主要結構變數是程式執行所使用的數據方法代碼塊是用於程式操作的結構使用大括弧{和}來定義代碼塊在操作的結尾使用分號查看結果:Shirt.java

javacHello.javaD:\Lesson3>

javaHelloD:\Lesson3>Hello,JavaWorld!編譯、運行應用程式Application:Debugging調試檢查錯誤消息中指出的行檢查分號檢查大括弧數是否為偶數使用基本數據類型將數據存儲在變數中基本類型包括:整型——byte,short,int和long浮點型——float和double字元型——char邏輯型——boolean基本數據類型

數據類型名佔用記憶體空間數值範圍缺省值說明byte1位元組(-128)~1270整型short2位元組(-32768)~327670int4位元組(-2147483648)~21474836470long8位元組(-9223372036854775808)~92233720368547758070float4位元組0.0F浮點型double8位元組0.0Dchar2位元組字元型boolean——true或falsefalse布爾型類型長度範圍byte8bit-27~27-1(-128~127)short16bit-215~215-1(-32768~32767)int32bit-231~231-1(-2147483648~2147483647)long64bit-263~263-1(-9223372036854775808~9223372036854775807)存儲沒有小數部分的數據類型

Java各整數類型有固定的表數範圍和字段長度,而不受具體操作系統的影響,以保證Java程式的可移植性1、整型

數值20在內存中的存儲形式

00010100

byte(1位元組)00000000

00010100

short

(2位元組)高位置000000000

00000000

00000000

00010100

int

(4位元組)00000000

00000000

00000000

00000000

00000000

00000000

00000000

00010100

Long

(8位元組)2、浮點型

浮點型是帶有小數部分的數據類型,包括兩種不同的數據類型:float和double。float類型的變數佔用4個位元組(32位),double類型的數據則需要8個位元組(64位)記憶體。在許多程式中,就其表示的數值範圍而言,使用float類型來存儲浮點數已經足夠了。浮點數據有兩種表示形式十進位數形式,必須含有小數點,例如: 3.14314.0.314科學記數法形式,如3.14e23.14E-12Java浮點數據默認為double型,如要聲明一個常量為float型,則需在數字後面加f或F,如:

doubled=3.14; floatf=3.14f;3、布爾型(boolean)

布爾數據類型用於表達兩個邏輯狀態之一的值:true(真)或false(假)。布爾型數據只有兩個值true和false,且它們不對應於任何整數值。布爾型變數的定義如:

booleanb=true;

4、字元型(char)字元型數據類型用於存放單個字元,每個字元佔用2個位元組(16位)的存儲空間。將一個字元放到一個字元變數中,實際上並不是把該字元本身放到記憶體單元中去,而是將該字元的相應的Unicode代碼放到存儲單元中。

charc1=‘t’; charc2=‘3’;char基於Unicode編碼,\u首碼標誌著這是一個Unicode值 例如,\u0061代表字元’a’。識別字Java保留字(又稱關鍵字)

關鍵字不能作為識別字; 關鍵字是具有專門的意義和用途,不能當作一般的識別字使用,這些識別字稱為保留字(reservedword),下麵列出了java語言中的所有保留字:abstractdoimplementsprotectedthrowsbooleandoubleimportpublictransientbreakelseinstanceofreturntruethisthrowbyteextendsintshorttrysynchronizedcasefalseinterfacestaticvoidcontinuecatchfinallongstrictpfvolatilegotodefaultcharfinallynativesuperwhilepackageclassfloatnewswitchconstfornullifprivatejava中的關鍵字均用小寫字母表示。合法的識別字identifieruserNameUser_Name_sysval$change A98_23

_abc非法的識別字

2mail room# classA-4

3_1

>the變數(屬性)

變數是用來存放指定類型的數據,其值在程式運行過程中是可變的。

在使用Java中的每個變數之前,都必須對它進行聲明。變數的聲明形式如下:

類型

變數名;

變數聲明包括指明變數的數據類型、變數名和作用域其中數據類型說明了這個變數能存放什麼樣的數據。變數名是用來標識該變數的,我們存取變數的內容(變數的值)都是通過變數名來實現的。變數名

在Java中用識別字來表示變數名。象Person這個類,我們使用了name、age、tall、marriage、sex這幾個識別字,分別定義了五個變數。程式員應該為變數取有意義的名稱,以利於程式的閱讀和理解。(見名知義)但變數取名時還有一些限制:變數名由字母、數字、下劃線或美元符“$”組成的變數名不能以數字作為第一個字元區分大小寫下麵是合法的變數名:

Month(不同於month),student_name,class1,dollar$,$abc而下麵的變數名都不合法:

3a46,a>b,abc-d,#ef.

變數名

變數名中字母大寫和小寫是有區別的,name和Name表示兩個不同的變數名。Java中約定,變數名以小寫字母開頭,若一個變數名由超過一個單詞所組成,則第一個單詞之後的所有單詞都以大寫字母開頭,以便於理解該變數名。例如:anIntVar表示一個整型變數。變數的初始化

賦予變數一個初值,稱為變數的初始化。可在定義變數的同時進行變數的初始化,如:intanIntVar=1;charaCharVar=’A’;floataFloatVar=1.23f;booleanaBooleanVar=true;也可定義變數後再單獨初始化,如:intanIntVar;charaCharVar;floataFloatVar;booleanaBooleanVar;anIntVar=1;aCharVar=’A’;aFloatVar=1.23f;aBooleanVar=true;兩種方法都完成了定義變數:anIntVar、aCharVar、aFloatVar、aBooleanVar,並分別給它們賦初值:1、’A’、1.23、true。變數的作用域

變數的作用域:變數的使用範圍。假定在某代碼段中能夠使用一特定變數,則此段代碼即是該變數的作用域。在類中聲明的類成員變數,可在該類的各個成員方法中使用;在某個方法體中或參數表中聲明的變數,只能在該方法體中使用;在某個語句塊中聲明的變數,只能在該語句塊中使用。變數的作用域publicclassVariableLifeTime{ publicstaticvoidmain(String[]args) { intsum=0;

intA=10; for(intx=1;x<=5;x++) {

inty=0; y=y+A; sum=sum+y; System.out.print("x="+x); System.out.print("y="+y); System.out.println("sum="+sum); } System.out.println("sum="+sum); }}查看結果:VariableLifeTime.javaclassPerson{//以下5個成員變數

Stringname; intage; doubletall; booleanmarriage; charsex;

//以下2個方法

eat(Stringeatwhat){ System.out.println(name+”ateupthe“+eatwhat); }}

Speak(Stringsaywhat,inttime){inti;for(i=0;i<time;i++)System.out.println(name+”say:”+saywhat);}變數name、age、tall、marriage、sex的作用域變數i的作用域下圖為變數作用域的示意圖:由左圖可以看出,變數name、age、tall、marriage、sex和變數i的作用域是不同的。變數name、age、tall、marriage、和sex的作用域是整個類,在類的方法中也可使用它們。這種變數稱之為成員變數。確切地講,成員變數是在類當中、但不是在其類的方法中定義的變數。而變數i是定義在speak方法中,它的作用域僅限於speak方法中。這類定義在某方法中的變數叫做局部變數。注意:同一作用域中不可有同名的變數。如上面的代碼在speak方法中不能再定義一個名字為i的變數。常量

常量是指在程式運行過程中其值不變的量。定義常量的方法有兩種:(1)在定義變數的類型前面加final關鍵字,並同時進行初始化,如下所示:finalintaFinalVar=0;finaldoublePI=3.14159;

(2)在定義變數的類型前面加final關鍵字,不進行初始化。通過另外的語句進行賦值。如下所示:finalintaFinalVar;…aFinalVar=0;常量和變數常量與變數之間最根本的區別是:常量在經過定義並給它一個值之後,不能再對它進行修改。而變數則無此限制。對於常量a,進行如下的操作是錯誤的:finalinta=1;….a=2;

而對於變數a,如下這段代碼則是正確的。inta=1;…a=2;示例:

publicclassAssign{

publicstaticvoidmain(String[]args) {

intx;

inty;//定義x,y兩個整型變數

floatz=1.234f;//指定變數z為float型,且賦初值為1.234

doublew=1.234;//指定變數w為double型,且賦初值為1.234

booleanflag=true;//指定變數flag為boolean型,且賦初值為true

charc;//定義字元型變數c

Stringstr;//定義字串變數str

Stringstr1="Hi";//指定變數str1為String型,且賦初值為Hi

c='A';//給字元型變數c賦值'A'

str="bye";//給字串變數str賦值"bye"

x=12;//給整型變數x賦值為12

y=x;//給整型變數y賦值為12

}

}

Java區分大小寫類定義不能嵌套一個程式中可以有一個或多個類,但其中只能有一個public類根源程式編寫完畢,應該以主類名作為檔案名,再加尾碼.java存儲編寫Java程式需要注意的幾點在Java中嵌套的程式塊的內層和外層,不允許定義相同的變數名,否則將導致編譯錯誤。publicclassScopeError{ publicstaticvoidmain(String[]args) { intE=999;

{ intE=999; System.out.println(“E="+E); }

}}變數類型轉換短類型

長類型:默認長類型

短類型:強制例:inta; longb; b=a; a=(int)b;不同類型數據間的優先關係如下:

低------------------------------------------->高byte,short,char->int->long->float->double高級數據類型要轉換成低級數據類型,需要用到強制類型轉換。 其一般形式為:(類型名)(運算式)如:int i;byteb;i=356;b=(byte)i;//強制轉換後丟失一部分數據,使得b的值為100。一般使用強制類型轉換可能會導致數值溢出或精度的下降,應儘量避免。

創建一個引用對象的變數需要分3個步驟:1、聲明一個對對象的引用2、創建對象3、賦值創建對象引用變數

步驟1——聲明

ClassName

identifier;例:Shirt

myShirt;變數類型是reference_to_ClassName(對Shirt的引用)步驟2——初始化

identifier=newClassName();

例:myShirt=newShirt();或者聲明和初始化同時進行ClassNameidentifier=newClassName();例:ShirtmyShirt=newShirt();步驟3——賦值還未給對象變數賦值,如myShirt.price變數初始化為缺省值。要給對象變數賦值:聲明並初始化對象變數設定值時指定對象引用創建對象

基本數據類型的值:428802,’A’等對象引用的值:對對象的引用,指向對象變數的值基本變數和對象引用變數的值查看結果:Equivalence.java查看結果:BoxDemo.java查看結果:Assign.java

使用String類存儲一串非數值型字元。在JavaAPI中包含有String。形成String有兩種方式:使用或不使用new修飾符。將String類用作數據類型聲明

ClassName

identifier;例:String

myName;初始化和賦值

identifier=newClassName(“string_value”);例:myName=newString(“DavidSt.Hubbins”);或者在一行中完成兩個步驟:

StringmyName=newString(“DavidSt.Hubbins”);StringmyString=newString(“Thisisatest”);使用String和new修飾符聲明

ClassName

identifier;例:String

myName;初始化和賦值

identifier=string_value;例:myName=“DavidSt.Hubbins”;或者在一行中完成兩個步驟:

StringmyName=“DavidSt.Hubbins”;StringmyString=“Thisisatest”;System.out.println(myString);使用String但不用new修飾符類似於基本類型:字元常量Stringname=”NigelTufnel“;運算式:Stringname=”Nigel”+“Tufnel“;其他變數:StringhisName=”NigelTufnel“;StringmyName=hisName;方法調用“abCDef”.toUpperCase();Strings=“abCDef”;s.toUpperCase();可以賦給String的值方法包含程式要做的工作。所有的類都可以使用“全能”的main方法。main方法是JVM的入口點。main調用並協調程式的其餘部分。使用main方法查看結果:Hello.java查看結果:CustomerInfo.java使用pringln添加回車換行;print則沒有。 System.out.print(“Carpediem”);System.out.println(“Seizetheday”); System.out.println();可以用空的顯示語句來顯示一個空行在一個語句中顯示多個內容:文本用引號括起來;使用空格時將空格放在引號內用+連接多個內容(”Priceis:”+price)還可以顯示運算式結果(price*discount)使用System.out.println利用(Stringargs[])可以將值從命令行傳遞到main。

publicclassIntroductions{publicstaticvoidmain(Stringargs[]){System.out.println(“Mynameis”+ars[0]+”andIam”+args[1]);}}

命令行輸入:javaintroductionsFloyd29顯示:MynameisFloydandIam29使用main方法獲取命令行輸入查看結果:Introductions.javamain將所有參數都看作是String。使用Integer.parseInt可以將參數轉換成int

Integer.parseInt(variable_to_convert)例:Intgrade=Integer.parseInt(args[0]);將String參數轉換成整數查看結果:Introductions.java區分引用變數和變數如果數據類型是一個類的名字,就是引用變數String

是個類firstNumber,secondNumber是引用變數如果數據類型是一個基本數據類型,就是變數double

是一個基本數據類型number1,number2是變數StringfirstNumber;

StringsecondNumber;

doublenumber1;

doublenumber2;

寫類聲明來表示基於OOD的對象。類聲明中包含類名稱、變數、方法。聲明類查看結果:Person.java

算術運算符:運算符優先順序別優先順序規則:()

乘除(從左到右)

加減(從左到右)複雜的運算式:C=25-5*4/2-10+4;從左到右的規則求值,結果是:34按照優先順序規則求值,結果是:9用()來表述想要的結構升級和類型轉換賦值和運算式可能引起計算的數據類型與保存結果的存儲位置之間的不匹配。右邊的數據類型小於左邊的數據類型:

bytenum1=53;bytenum2=47;longnum3;num3=num1*num2;

右邊的數據類型大於左邊的數據類型:

intnum1=53;intnum2=47;bytenum3;num3=num1+num2;右邊的數據類型和數據大於左邊的數據類型:intnum1=53;intnum2=47;bytenum3;num3=num1*num2;注意:Java是強類型語言,因此,在進行賦值操作時要對類型進行檢查;當將占位數少的類型賦值給占位數多的類型時,Java自動使用隱式類型轉換(升級);當將占位數多的類型賦值給占位數少的類型時,需要由用戶使用顯式的強制類型轉換;

其一般形式為: (類型名)(運算式)類型轉換短類型

長類型:自動升級長類型

短類型

:強制轉換自動升級規則

1.(byte或short)opint→int2.(byte或short或int)oplong→long3.(byte或short或int或long)opfloat→float4.(byte或short或int或long或float)opdouble→double5.charopint→int其中,箭頭左邊表示參與運算的數據類型op為運算符(如加、減、乘等)右邊表示運算結果的數據類型。如:3+4.5,因為4.5是float型,所以3先被轉換為float型,然後再於4.5相加,其結果也為float型。

例:自動升級實例

publicclassPromotion{publicstaticvoidmain(Stringargs[]){byte b=10;char c='a';int i=90;float f=3.5f;doubled=1.234;float f1; f1=f*b;int i1; i1=c+i;doubled1; d1=f1/i1–d; }}

查看結果:Test.java查看結果:Promotion.java強制類型轉換類型轉換可縮小值的範圍例:inta; longb; b=a; a=(int)b;/*把long型變數b強制轉換為int型*/ intx=365; bytey=(byte)x;/*把int型變數i強制轉換為byte型*///強制轉換後丟失一部分數據,使得y的值為100。一般使用強制類型轉換可能會導致數值溢出或精度的下降,應儘量避免。浮點類型轉換為整數類型將使所有小數部分丟失。

publicclassAge{ publicstaticvoidmain(Stringargs[]) { intageYears; intageDays; longageSeconds; ageYears=Integer.parseInt(args[0]); ageDays=ageYears*365; ageSeconds=(ageYears*365*24L*60*60); System.out.print(“Youare”+ageDays+”daysold.”); System.out.print(“Youare”+ageSeconds+”secondsold.”); }}查看結果:Age.java

邏輯運算符:

布爾運算符:JAVA的流程控制語句結構化程式設計的三種基本控制語句順序分支迴圈按語句書寫的先後順序執行在若干路徑中有條件地擇一執行當某條件成立時,反復執行一段代碼條件語句if-else if(boolean-expression) statement1; [elsestatement2;]注意:1、boolean-expression必須返回為布爾型數據的運算式,不能用整型數值代替;2、每個單一語句後邊都要有分號;3、如果statement1、statement2為多條語句,那麼要用{}將它們括起來。4、else總是與最近的if配合If結構的基本部分If條件AIf條件B{ 1……… }else{ 2……… }

例:比較兩個數的大小,並按照從大到小的順序輸出到螢幕上。publicclassCompareTwo{publicstaticvoidmain(Stringargs[]) {doubled1=23.4;doubled2=56.9;if(d1>=d2)System.out.println(d1+”>=“+d2);elseSystem.out.println(d2+”>=“+d1);}}

查看結果:Coffee.java

多重If結構

查看結果:Coffee.java

測試String之間的等同性使用==比較String在內存中的引用是否相等要測試兩個字串之間是否具有等同性用equalsif語句中內嵌的語句1或語句2又是if語句的情況稱為if語句的嵌套。如: if(布爾運算式1) {

語句1 }elseif(布爾運算式2) {

語句2 }……

elseif(布爾運算式m) {

語句m }

else

{

語句n }if語句的嵌套

if(x==1)

{if(y==1)aa=1;elseaa=2;}if(x==1){

if(y==1)aa=1;}elseaa=2;

程式從上往下依次判斷運算式的條件,一旦某個條件滿足,就執行相關的語句,然後就不再判斷其餘的條件,直接轉到if語句的後續語句執行。如果需要,可以通過使用{}來改變配對關係。使用if的程式

switch語句

switch語句根據運算式的結果來執行多個操作中的一個,它的語法形式如下:switch(運算式){case判斷值1:語句塊1;

[break;]case判斷值2:語句塊2;

[break;]…case判斷值n:語句塊n;

[break;][default:缺省處理語句;

break;]}1.要注意運算式必須是符合byte,char,short,int類型的運算式,而不能使用浮點類型或long類型,也不能為一個字串;2.

將運算式的值依次與每個case子句中的判斷值相比較。如果匹配成功,則執行該case子句中常量值後的語句,直到遇到break語句為止;3.

case子句中判斷值的類型必須與運算式的類型相容,且每個case子句中判斷值的值必須是不同的;4.default子句是可選的,當運算式的值與任一case中的判斷值都不匹配時,就執行default後的語句。如果運算式的值與任一case中的判斷值都不匹配且沒有default子句,則程式不執行任何操作,直接跳出switch語句,進入後續程式段的執行。switch語句的流程如圖所示:

運算式break語句1break語句2break語句nbreak缺省處理語句後續語句判斷值1判斷值2判斷值ndefault…….switch語句的注意點5.

break語句用來在執行完一個case分支後,使程式跳出switch語句,執行switch語句的後續語句。因此一般情況下,在每個case分支後,要用break來終止後面的case分支語句的執行;6.

在一些特殊的情況下,例如多個不同的case值要執行一組相同的操作,可以寫成如下形式:

…case判斷值n:

case判斷值n+1:語句

[break;]…7.case分支中包括多個執行語句時,可以不用花括弧“{}”括起;8.通過if-else語句可以實現switch語句所有的功能。但通常使用switch語句更簡練,且可讀性強,程式的執行效率也高;9.if-else語句可以基於一個範圍內的值或一個條件來進行不同的操作,但switch語句中的每個case子句都必須對應一個單值。

查看結果:SwitchTest.java

查看結果:SwitchDaysInMonth.java迴圈迴圈語句的作用是反復執行同一塊代碼直到滿足結束條件。在現實世界的許多問題中需要用到迴圈控制。例如:累加求和。while迴圈

語法形式為:while(布爾運算式){

語句組;}執行過程:1、先計算布爾運算式2、若為真則執行語句組,並轉回再計算布爾運算式3、若為假

則跳出迴圈,執行後面的語句。小心:一定不要在while(布爾運算式)後面加;while迴圈的流程圖

truefalse循環體布爾運算式例:用while語句求1+2+…+10的和。

publicclassWhileTry{ publicstaticvoidmain(String[]args){ inti; intsum=0;//累加器清0 i=1; //i的初始值為1

while(i<=10){ sum+=i; i++; }

System.out.println("sum="+sum); }}查看結果:WhileTry.java要列印一個如下所示的矩形@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@內部迴圈列印列,外部迴圈列印行“行慢列快”嵌套迴圈查看結果:NestedWhileLoop.java按照預先定義好的次數迴圈執行一組語句等同於while迴圈,但有更集中的結構for迴圈語法形式為:

for(運算式1;運算式2;運算式3) {

語句組;

}

例如,要使迴圈執行某一段代碼1000次,可以表達為:for(intnumber=0;number<1000;number++){ … //一段代碼}for迴圈的流程圖

每個for語句都有一個用於決定迴圈開始和結束的變數,通常稱這個變數為迴圈控制變數。運算式1用來給迴圈控制變數賦初值,它只在迴圈開始的時候執行一次。運算式2是一個布爾運算式,用來決定何時終止迴圈。運算式3用於改變迴圈控制變數的值。

for語句的執行過程如下:1、先求解運算式12、求解運算式2,若其值為true,則執行for語句中的循環體,然後執行下麵第3步。若值為false,則結束迴圈,轉到第5步3、求解運算式34、轉回上面第2步繼續執行5、執行for語句下麵的一個語句

truefalse求解運算式3運算式2循環體for語句的下一句求解運算式1

for迴圈示例for(inti=1;i<=100;i++)for(inti=100;i>=1;i--)for(inti=7;i<=77;i+=7)

嵌套for迴圈查看結果:NestedForLoop.java例:用for語句求1+2+…+10的和

publicclassForTry{ publicstaticvoidmain(String[]args){ inti,sum; sum=0; //累加器清0 for(i=1;i<=10;i++){ sum+=i; } System.out.println("sum="+sum); }}

do迴圈是:類似於while迴圈的迴圈一個一層/多層重複迴圈

while迴圈和for迴圈都是0層/多層重複迴圈do迴圈語法形式

do{

語句組;

}While(布爾運算式);執行過程:

先執行一次循環體中的語句,然後測試布爾運算式的值。如果布爾運算式的值為真,那就返回執行循環體中的內容。do-while語句將不斷地測試布爾運算式的值並執行循環體中的內容直到布爾運算式的值為假為止。

注意:While(布爾運算式)後面必須有;do迴圈do-while迴圈的流程圖

true循環體布爾運算式false查看結果:FindAThree.javado…while迴圈與while迴圈的不同在於:while是先檢查條件是否成立後執行語句而do…while是先執行語句後再檢查繼續的條件。While——可以無限次地重複執行語句,並且執行語句的次數可以是0次或多次Do——可以無限次地重複執行語句,並且執行語句的次數可以是1次或多次For——可以按照預先定義好的次數迴圈執行語句比較多種迴圈結構查看結果:TestDo.javacontinue語句

Continue語句只能用在while、for和do迴圈內部。 它和break語句的區別是:break語句使程式的流程從一個語句塊內部轉移出去。continue語句是終止當前這一輪的迴圈,直接進入下一輪的迴圈。而不是終止整個迴圈的執行。查看結果:BreakLoop.java和BreakLoop2.java查看結果:Multiples.java方法使用概述到目前為止所示的程式都是main內的操作使用方法,可以用適當的方法來執行操作。使用方法的優點要求對象做某一事情精確地定義對象可以做什麼獲取和設置值使程式的可讀性更好而且更易維護使開發和維護更快捷可重複使用軟體

方法有兩種:一種是標準方法,JavaAPI提供了豐富的類和方法,這些方法提供了程式員所需的許多功能。另一種是用戶自定義的方法,以解決用戶專門需要。

Java應用程式中,程式的執行從main方法開始,調用其他方法後又回到main方法,在main方法中結束整個程式的運行。操作方法和調用方法

publicclassAllInMain { publicstaticvoidmain(Stringargs[]) { intint1=42; intint2=24; System.out.println(int1+int2); } }這種方法是簡潔的,但是它:在較大的應用程式中是不現實的沒有使用面向對象的思想還有其他缺點操作方法和調用方法

調用方法讓對象用它的一個方法來為你做某件事情。調用方法除調用操作方法外,通常還有普通的方法操作對象的調用方法可以為您:獲得輸入資訊返回一條資訊查看結果:BoxDemo3.java調用方法與操作方法的獨立存在:聲明方法操作方法和調用方法具有相同的語法結構在所有示例中並不包含全部可能的方法查看結果:BoxDemo4.java調用方法

特別是從不同的方法中調用方法調用方法暫停,操作方法接著執行調用方法從它調用操作方法的調用點後繼續執行調用方法和操作方法可以在同一個類中或在不同的類中可以按任何順序調用方法傳遞參數將參數放在調用方法的括弧內傳遞字面值或變數按方法聲明中的順序列出參數查看結果:BoxDemo5.java參數傳遞

—基本數據類型的參數傳遞

查看結果:PassParam.java參數傳遞

—引用數據類型的參數傳遞

查看結果:PassObject1.java查看結果:CallByValue.java查看結果:PassObject2.java接收返回值返回值返回到代碼中調用它時所在的位置mathRef.add(2,4);調用了方法的運算式等於返回值使用返回值時,可以將調用和返回值的使用在同一行內完成intaddedNumbers=mathRef.add(2,4);方法體中如果指定了非void的返回值類型,方法中就必須包含一條return語句保證任何情況下都有返回值,return語句之後不能跟任何運算式;查看結果:BoxDemo4.java對象方法和Static(靜態)方法對象方法需要創建一個對象靜態方法的運行可以沒有對象這些方法與類相關,但又不對與某一特定對象關聯的變數進行操作

static方法是屬於整個類的,而不是屬於某個實例(具體的對象)。 而對象方法屬於每個實例,只能在類的實例和子類的實例中調用。static靜態變數

當我們編寫一個類時,其實就是在描述其對象的屬性和行為,而並沒有產生實質上的對象,只有通過new關鍵字才會產生出對象,這時系統才會分配記憶體空間給對象,其方法才可以供外部調用。我們有時候希望無論是否產生了對象或無論產生了多少對象的情況下,某些特定的數據在內存空間裏只有一份,例如所有的中國人都有個國家名稱,每一個中國人都共用這個國家名稱,不必在每一個中國人的實例對象中都單獨分配一個用於代表國家名稱的變數。查看結果:TestChinese.javastatic靜態方法在靜態方法裏只能直接調用同類中其他的靜態成員(包括變數和方法),而不能直接訪問類中的非靜態成員。這是因為,對於非靜態的方法和變數,需要先創建類的實例對象後才可使用,而靜態方法在使用前不用創建任何對象。

main()方法是靜態的,因此JVM在執行main方法時不創建main方法所在的類的實例對象,因而在main()方法中,我們不能直接訪問該類中的非靜態成員,必須創建該類的一個實例對象後,才能通過這個對象去訪問類中的非靜態成員。理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论