Java基礎(chǔ)_高級類特性_第1頁
Java基礎(chǔ)_高級類特性_第2頁
Java基礎(chǔ)_高級類特性_第3頁
Java基礎(chǔ)_高級類特性_第4頁
Java基礎(chǔ)_高級類特性_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 static 關(guān)鍵字 final 關(guān)鍵字 抽象類(abstract 關(guān)鍵字) 接口(interface 關(guān)鍵字) 內(nèi)部類(了解既可)static static 關(guān)鍵字關(guān)鍵字靜態(tài)屬性靜態(tài)初始化靜態(tài)方法單子模式理解main方法的語法 final 關(guān)鍵字抽象類(abstract 關(guān)鍵字)接口(interface 關(guān)鍵字)內(nèi)部類 當(dāng)我們編寫一個類時,其實就是在描述其對象的屬性和行為,而并沒有產(chǎn)生實質(zhì)上的對象,只有通過new關(guān)鍵字才會產(chǎn)生出對象,這時系統(tǒng)才會分配內(nèi)存空間給對象,其方法才可以供外部調(diào)用。我們有時候希望無論是否產(chǎn)生了對象或無論產(chǎn)生了多少對象的情況下,某些特定的數(shù)據(jù)在內(nèi)存空間里只有一份,例如

2、所有的中國人都有個國家名稱,每一個中國人都共享這個國家名稱,不必在每一個中國人的實例對象中都單獨分配一個用于代表國家名稱的變量。class Circleprivate double radius;public Circle(double radius)this.radius=radius;public double findArea()return Math.PI*radius*radius;創(chuàng)建兩個Circle對象 Circle c1=new Circle(2.0);/c1.radius=2.0 Circle c2=new Circle(3.0);/c2.radius=3.0 Circle類

3、中的變量radius是一個實例變量(instance variable),它屬于類的每一個對象,不能被同一個類的不同對象所共享。 上例中c1的radius獨立于c2的radius,存儲在不同的空間。c1中的radius變化不會影響c2的radius,反之亦然。如果想讓一個類的所有實例共享數(shù)據(jù),請用類變量如果想讓一個類的所有實例共享數(shù)據(jù),請用類變量 在Java類中聲明變量、方法變量、方法和內(nèi)部類內(nèi)部類時,可使用關(guān)鍵字static做為修飾符。 staticstatic標(biāo)記的變量或方法由整個類標(biāo)記的變量或方法由整個類( (所有實例所有實例) )共享,共享,如訪問控制權(quán)限允許,可不必創(chuàng)建該類對象而直接

4、如訪問控制權(quán)限允許,可不必創(chuàng)建該類對象而直接用類名加用類名加 . .調(diào)用調(diào)用。 staticstatic成員也稱類成員或靜態(tài)成員成員也稱類成員或靜態(tài)成員,如:類變量、類方法、靜態(tài)方法等。 類變量(類屬性)由該類的所有實例共享類變量(類屬性)由該類的所有實例共享public class Person private int id; public static static int total total = 0; public Person() totaltotal+; id = totaltotal; PersonPerson+total : int = 0 -id : intp1 : Per

5、sonp1 : Personid=1p2 : Personp2 : Personid=2Person p1=new Person();Person p2=new Person(); 類屬性類似于全局變量類屬性類似于全局變量class Person private int id; public static static int total total = 0; public Person() totaltotal+; id = totaltotal; public static void main(String args) Person Tom=new Person()Tom.id=0;tot

6、al=100; / / 不用創(chuàng)建對象就可以訪問靜態(tài)成員不用創(chuàng)建對象就可以訪問靜態(tài)成員 public class OtherClass public static void main(String args) Person.total Person.total = 100; / / 不用創(chuàng)建對象就可以訪問靜態(tài)成員不用創(chuàng)建對象就可以訪問靜態(tài)成員 / /訪問方式:類名訪問方式:類名. .類屬性類名類屬性類名. .類方法類方法 System.out.println(Person.total); Person c = new Person(); System.out.println(c.total);/

7、 /輸出輸出101101 class Person private int id; private static int total = 0; public static int getTotalPerson() return total; public Person() total+; id = total; public class TestPerson public static void main(String args) System.out.println(Number of total is +Person.getTotalPerson();/沒有創(chuàng)建對象也可以訪問靜態(tài)方法 Pe

8、rson p1 = new Person(); System.out.println( Number of total is + Person.getTotalPerson(); 沒有對象的實例時,可以用類名沒有對象的實例時,可以用類名. .方法名方法名() ()的形式訪問由的形式訪問由staticstatic標(biāo)記的類方法標(biāo)記的類方法。The output is:Number of total is 0Number of total is 1 在在staticstatic方法內(nèi)部只能訪問類的方法內(nèi)部只能訪問類的staticstatic屬性,不能訪問屬性,不能訪問類的類的非非staticstat

9、ic屬性屬性。class Person private int id; private static int total = 0; public static int getTotalPerson() id+;/非法return total; public Person() total+; id = total; 因為不需要實例就可以訪問因為不需要實例就可以訪問staticstatic方法,因此方法,因此staticstatic方法內(nèi)部不能有方法內(nèi)部不能有this,(this,(也不能有也不能有super ?super ? ) )class Person private int id; pri

10、vate static int total = 0; public static void setTotalPerson(int total) this.total=total; /非法,在static方法中不能有this,也不能有super public Person() total+; id = total; public class TestPerson public static void main(String args) Person.setTotalPerson(); 在靜態(tài)方法里只能直接調(diào)用同類中其它的靜態(tài)成員(包括變量和方法),而不能直接訪問類中的非靜態(tài)成員。這是因為,對于非

11、靜態(tài)的方法和變量,需要先創(chuàng)建類的實例對象后才可使用,而靜態(tài)方法在使用前不用創(chuàng)建任何對象。 靜態(tài)方法不能以任何方式引用this和super關(guān)鍵字。與上面的道理一樣,因為靜態(tài)方法在使用前不用創(chuàng)建任何實例對象,當(dāng)靜態(tài)方法被調(diào)用時,this所引用的對象根本就沒有產(chǎn)生。 main() 方法是靜態(tài)的,因此JVM在執(zhí)行main方法時不創(chuàng)建main方法所在的類的實例對象,因而在main()方法中,我們不能直接訪問該類中的非靜態(tài)成員,必須創(chuàng)建該類的一個實例對象后,才能通過這個對象去訪問類中的非靜態(tài)成員,這種情況,我們在以后的例子中會多次碰到。 類屬性作為該類各個對象之間共享的變量。在設(shè)計類時在設(shè)計類時, ,分析

12、哪些類屬分析哪些類屬性性不因?qū)ο蟮牟煌淖儾灰驅(qū)ο蟮牟煌淖?,將這些屬性設(shè)置為類屬性。相應(yīng)的方法設(shè)置為,將這些屬性設(shè)置為類屬性。相應(yīng)的方法設(shè)置為類方法。類方法。 如果方法與調(diào)用者無關(guān),則這樣的方法通常被聲明為類方法,由于不需如果方法與調(diào)用者無關(guān),則這樣的方法通常被聲明為類方法,由于不需要創(chuàng)建對象就可以調(diào)用類方法,從而簡化了方法的調(diào)用要創(chuàng)建對象就可以調(diào)用類方法,從而簡化了方法的調(diào)用練習(xí)1:編寫一個類,實現(xiàn)銀行賬戶的概念,包含的屬性有“帳號”、“密碼”、“存款余額”、“利率”、“最小余額”,定義封裝這些屬性的方法。賬號要自動生成。編寫主類,使用銀行賬戶類,輸入、輸出3個儲戶的上述信息??紤]:哪

13、些屬性可以設(shè)計成static屬性。 Bank.javastaticstatic塊通常用于初始化塊通常用于初始化static (static (類類) )屬性屬性class Person public static int total;static static total = 100;/ total = 100;/為為totaltotal賦初值賦初值 /其它屬性或方法聲明 class Person public static int total; static total = 100;System.out.println(in static block!); public class Test

14、 public static void main(String args) System.out.println(total = + Person.total);System.out.println(total = + Person.total);輸出:輸出:in static blocktotal=100total=100設(shè)計模式是在大量的實踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問題的思考方式解決問題的思考方式。設(shè)計模式就想是經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜,免得我們自己再去思考和摸索。所謂類的單態(tài)設(shè)計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,所謂類的單態(tài)設(shè)計模

15、式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法。如果我們要讓類在一個虛擬機中只能產(chǎn)生一個對象,我們首先必須將類的構(gòu)造方法的訪問權(quán)限設(shè)置為private,這樣,就不能用new 操作符在類的外部產(chǎn)生類的對象了,但在類內(nèi)部仍可以產(chǎn)生該類的對象。因為在類的外部開始還無法得到類的對象,只能調(diào)用該類的某個靜態(tài)方法以返回類內(nèi)部創(chuàng)建的對象,靜態(tài)方法只能訪問類中的靜態(tài)成員變量,所以,指向類內(nèi)部產(chǎn)生的該類對象的變量也必須定義成靜態(tài)的。class Single private static Single onlyone

16、= new Single();/私有的,只能在類的內(nèi)部訪問 private String name;public static Single getSingle() /getSingle()為static,不用創(chuàng)建對象 /即可訪問 return onlyone; private Single() /private的構(gòu)造器,不能在類的外部創(chuàng)建該類的對象 public class TestSinglepublic static void main(String args) Single s1 = Single.getSingle(); /訪問靜態(tài)方法Single s2 = Single.getSi

17、ngle();if (s1=s2) System.out.println(s1 is equals to s2!); 理解main方法的語法 由于java虛擬機需要調(diào)用類的main()方法,所以該方法的訪問權(quán)限必須是public,又因為java虛擬機在執(zhí)行main()方法時不必創(chuàng)建對象,所以該方法必須是static的,該方法接收一個String類型的數(shù)組參數(shù),該數(shù)組中保存執(zhí)行java命令時傳遞給所運行的類的參數(shù)。 public class CommandPara public static void main(String args) for ( int i = 0; i args.lengt

18、h; i+ ) System.out.println(args + i + = + argsi); /運行程序CommandPara.javajava CommandPara lisa bily Mr Brown/輸出結(jié)果:args0 = lisaargs1 = bilyargs2 = Mr Brownstatic 關(guān)鍵字final final 關(guān)鍵字關(guān)鍵字抽象類(abstract 關(guān)鍵字)接口(interface 關(guān)鍵字)內(nèi)部類 在Java中聲明類、屬性和方法時,可使用關(guān)鍵字final來修飾。 finalfinal標(biāo)記的變量標(biāo)記的變量( (成員變量或局部變量成員變量或局部變量) )即成為常量

19、,只能賦即成為常量,只能賦值一次值一次。 finalfinal標(biāo)記的類不能被繼承。提高安全性,提高程序的可讀性標(biāo)記的類不能被繼承。提高安全性,提高程序的可讀性。 finalfinal標(biāo)記的方法不能被子類重寫。增加安全性。標(biāo)記的方法不能被子類重寫。增加安全性。 finalfinal標(biāo)記的成員變量必須在聲明的同時或在每個構(gòu)造方法中標(biāo)記的成員變量必須在聲明的同時或在每個構(gòu)造方法中顯式賦值,然后才能使用。顯式賦值,然后才能使用。 final PI=3.14;public final class Testpublic static int totalNumber= 5 ;public final int

20、 id;public Test()id = +totalNumber;/只能在構(gòu)造方法中給final變量賦值 public static void main(String args) Test t = new Test();System.out.println(t.id);final int i = 10;final int j;j = 20;j = 30; /非法 static 關(guān)鍵字final 關(guān)鍵字抽象類(抽象類(abstract abstract 關(guān)鍵字)關(guān)鍵字)抽象抽象類類抽象方法抽象方法接口(interface 關(guān)鍵字)內(nèi)部類隨著繼承層次中一個個新子類的定義,類變得越來越具體,而父

21、類則更一般,更通用。類的設(shè)計應(yīng)該保證父類和子類能夠共享特征。有時將一個父類設(shè)計得非常抽象,以至于它沒有具體的實例,這樣的類叫做抽象類。用abstractabstract關(guān)鍵字來修飾一個類時,這個類叫做抽象類抽象類;用abstractabstract來修飾一個方法時,該方法叫做抽象方法抽象方法。抽象方法:只有方法的聲明,沒有方法的實現(xiàn)。以分號結(jié)束。抽象方法:只有方法的聲明,沒有方法的實現(xiàn)。以分號結(jié)束。 abstract int abstractMethod1( int a );abstract int abstractMethod1( int a );含有抽象方法的類必須被聲明為抽象類。含有抽象

22、方法的類必須被聲明為抽象類。抽象類不能被實例化抽象類不能被實例化。抽象類是用來被繼承的,抽象類的子類必須重寫父類的抽象方法,并提供方法體。不能用不能用abstractabstract修飾私有方法,構(gòu)造方法,靜態(tài)方法修飾私有方法,構(gòu)造方法,靜態(tài)方法。abstract class A abstract void m1( ); public void m2( )System.out.println(A類中定義的m2方法); class B extends A void m1( )System.out.println(B類中定義的m1方法); public class Test public stat

23、ic void main( String args )A c = new B( );c.m1( );c.m2( ); 在航運公司系統(tǒng)中,Vehicle類需要定義兩個方法分別計算運輸工具的燃料效率和行駛距離。抽象類是用來模型化那些父類無法確定全部實現(xiàn),而是由其子類提供具體實現(xiàn)的抽象類是用來模型化那些父類無法確定全部實現(xiàn),而是由其子類提供具體實現(xiàn)的對象的類。對象的類。問題:卡車(Truck)和駁船(RiverBarge)的燃料效率和行駛距離的計算方法完全不同。Vehicle類不能提供計算方法,但子類可以。解決方案解決方案JavaJava允許類設(shè)計者指定:超類聲明一個方法但不提供實現(xiàn),該方法的實現(xiàn)由

24、子允許類設(shè)計者指定:超類聲明一個方法但不提供實現(xiàn),該方法的實現(xiàn)由子類提供。這樣的方法稱為類提供。這樣的方法稱為抽象方法抽象方法。有一個或更多抽象方法的類稱為。有一個或更多抽象方法的類稱為抽象類抽象類。VehicleVehicle是一個抽象類,有兩個抽象方法。是一個抽象類,有兩個抽象方法。public abstract class Vehiclepublic abstract double calcFuelEfficiency();/計算燃料效率的抽象方法public abstract double calcTripDistance();/計算行駛距離的抽象方法public class Truc

25、k extends Vehiclepublic double calcFuelEfficiency( ) /寫出計算卡車的燃料效率的具體方法 public double calcTripDistance( ) /寫出計算卡車行駛距離的具體方法 public class RiverBarge extends Vehicle public double calcFuelEfficiency( ) /寫出計算駁船的燃料效率的具體方法 public double calcTripDistance( ) /寫出計算駁船行駛距離的具體方法注意:抽象類不能實例化 new Vihicle()是非法的stati

26、c 關(guān)鍵字final 關(guān)鍵字抽象類(abstract 關(guān)鍵字)接口(接口(interface interface 關(guān)鍵字)關(guān)鍵字)內(nèi)部類OracleMySQLSQLServerDB2Java APPOracleMySQLSQLServerDB2Java APPJDBC有時必須從幾個類中派生出一個子類,繼承它們所有的屬性和方法。但是,Java不支持多重繼承。有了接口,就可以得到多重繼承的效果。接口接口(interface)(interface)是抽象方法和常量值的定義的集合是抽象方法和常量值的定義的集合。從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和接口是一種特殊的抽象類,這種抽象

27、類中只包含常量和方法的定義,而沒有變量和方法的實現(xiàn)。方法的定義,而沒有變量和方法的實現(xiàn)。接口定義舉例public interfaceinterface Runner int id = 1;public void start();public void run();public void stop(); 接口的特點: 用用 interface interface 來定義來定義。 接口中的所有成員變量都默認是由接口中的所有成員變量都默認是由public static finalpublic static final修飾的。修飾的。 接口中的所有方法都默認是由接口中的所有方法都默認是由public

28、abstractpublic abstract修飾的。接口沒有構(gòu)造修飾的。接口沒有構(gòu)造方法。方法。 實現(xiàn)接口的類中必須提供接口中所有方法的具體實現(xiàn)內(nèi)容。實現(xiàn)接口的類中必須提供接口中所有方法的具體實現(xiàn)內(nèi)容。 多多個無關(guān)的類可以實現(xiàn)同一個接口個無關(guān)的類可以實現(xiàn)同一個接口 一一個類可以實現(xiàn)多個無關(guān)的接口個類可以實現(xiàn)多個無關(guān)的接口 與與繼承關(guān)系類似,繼承關(guān)系類似,接口與實現(xiàn)類之間存在多態(tài)性接口與實現(xiàn)類之間存在多態(tài)性 接口也可以繼承另一個接口,使用接口也可以繼承另一個接口,使用extendsextends關(guān)鍵字關(guān)鍵字。 實現(xiàn)接口的類中必須提供接口中所有方法的具體實現(xiàn)內(nèi)容。實現(xiàn)接口的類中必須提供接口中所有

29、方法的具體實現(xiàn)內(nèi)容。 多個無關(guān)的類可以實現(xiàn)同一個接口多個無關(guān)的類可以實現(xiàn)同一個接口 一個類可以實現(xiàn)一個類可以實現(xiàn)多個多個無關(guān)的接口無關(guān)的接口 與繼承關(guān)系類似,接口與實現(xiàn)類之間存在多態(tài)性與繼承關(guān)系類似,接口與實現(xiàn)類之間存在多態(tài)性 定義Java類的語法格式: class extends implements ,* *public interface Runner public void start();public void run();public void stop();public class Person implements Runner public void start() / 準備

30、工作:彎腰、蹬腿、咬牙、瞪眼/ 開跑public void run() / 擺動手臂/ 維持直線方向public void stop() / 減速直至停止、喝水。Runner+start()+run()+stop()Person+start()+run()+stop()+dance()Car+start()+run()+stop()+fillFuel()+crack()Bird+start()+run()+stop()+fly() 一個類可以實現(xiàn)多個無關(guān)的接口interface Runner public void run();interface Swimmer public double s

31、wim();class Animal public int eat() class Person extends Animal implements Runner,Swimmerpublic void run() public double swim() public int eat() 與繼承關(guān)系類似,接口與實現(xiàn)類之間存在多態(tài)性public class Testpublic static void main(String args)Test t = new Test();Person p = new Person();t.m1(p);t.m2(p);t.m3(p);public String

32、 m1(Runner f) f.run(); public void m2(Swimmer s) s.swim();public void m3(Animal a) a.eat();如果實現(xiàn)接口的類中沒有實現(xiàn)接口中的全部方法,必須將此類定義為抽象類。 接口也可以繼承另一個接口,使用接口也可以繼承另一個接口,使用extendsextends關(guān)鍵字關(guān)鍵字。interface MyInterfaceString s=“MyInterface”;public void absM1();interface SubInterface extends MyInterfacepublic void absM2

33、();public class SubAdapter implements SubInterfacepublic void absM1()System.out.println(“absM1”);public void absM2()System.out.println(“absM2”); 實現(xiàn)類SubAdapter必須給出接口SubInterface以及父接口MyInterface中所有方法的實現(xiàn)。定義一個接口用來實現(xiàn)兩個對象的比較。定義一個接口用來實現(xiàn)兩個對象的比較。 interface CompareObjectinterface CompareObject public int comp

34、areTo(Object o); public int compareTo(Object o); / /若返回值是若返回值是 0 , 0 , 代表相等代表相等; ; 若為正數(shù),代表當(dāng)前對象大;負數(shù)代表當(dāng)前對象小若為正數(shù),代表當(dāng)前對象大;負數(shù)代表當(dāng)前對象小 定義一個定義一個CircleCircle類。類。定義一個定義一個ComparableCircleComparableCircle類,繼承類,繼承CircleCircle類并且實現(xiàn)類并且實現(xiàn)CompareObjectCompareObject接口。在接口。在ComparableCircleComparableCircle類中給出接口中方法類中給

35、出接口中方法compareTocompareTo的實現(xiàn)體,用來比較兩個圓的的實現(xiàn)體,用來比較兩個圓的半徑大小。半徑大小。定義一個測試類定義一個測試類TestInterfaceTestInterface,創(chuàng)建兩個,創(chuàng)建兩個ComaparableCircleComaparableCircle對象,調(diào)用對象,調(diào)用compareTocompareTo方法比較兩個類的半徑大小。方法比較兩個類的半徑大小。思考:參照上述做法定義矩形類思考:參照上述做法定義矩形類RectangleRectangle和和ComparableRectangleComparableRectangle類,在類,在ComparableRectangleComparableRectangle類中給出類中給出compareTocompareT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論