5類(lèi)和對(duì)象(上)_第1頁(yè)
已閱讀1頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、5 類(lèi)和對(duì)象(上),1. 對(duì)象的概念通俗的說(shuō):對(duì)象就是我們周?chē)母鞣N各樣的事物。例如:衣服、盤(pán)子、寵物、朋友、電腦等。抽象來(lái)說(shuō):對(duì)象是指一組屬性以及這組屬性上的操作的封裝體。,一 基本概念,屬性的操作:小楊.改年齡(18)小楊.跳槽("好萊塢"),你的女朋友(對(duì)象),封裝,一些相似的對(duì)象,2類(lèi)的概念定義:類(lèi)是對(duì)具有相同屬性和相同操作的一組相似對(duì)象的定義。說(shuō)明:類(lèi)是對(duì)象的抽象,對(duì)象是類(lèi)的實(shí)例。,[修飾符]

2、 class 類(lèi)名{ 屬性 行為},二 類(lèi)的聲明,屬性聲明: [ = ]; 一般用“private”,指明僅能被所屬類(lèi)中的方法訪問(wèn),方法聲明: ( ) { } 一般用"public",指明可以被任何其它代碼訪問(wèn),修飾符一般用“public”指明可以被所有其它類(lèi)訪問(wèn),,,,示例,public class GF { priva

3、te String XM; private int AGE; private String GZDW; public void setXM(String xm) { XM=xm; } public String getXM() { return XM; } public void setAge(int a) { AGE=a; } public int getAge() { re

4、turn AGE; } public void setGZDW(String dw) { GZDW=dw; } public String getGZDW() { return GZDW; }},,屬性(一般為私有),,方法,(一般為公有),public class test {public static void main(String args[]) { GF gf1=new GF();

5、 gf1.setXM("小楊"); gf1.setAge(30); gf1.setGZDW("好萊塢"); System.out.print( gf1.getXM()+gf1.getAge()+gf1.getGZDW() );}},訪問(wèn)對(duì)象的成員,// 聲明對(duì)象(實(shí)例化),// 通過(guò)對(duì)象訪問(wèn)公有成員方法,,,一個(gè)新對(duì)象的初始化是去調(diào)用一個(gè)叫做構(gòu)造函數(shù)的方法來(lái)實(shí)

6、現(xiàn)的。例如:GF gf1=new GF(); 對(duì)象gf1就是由GF()這個(gè)構(gòu)造函數(shù)創(chuàng)建的。 每個(gè)類(lèi)至少要有一個(gè)構(gòu)造函數(shù),如果沒(méi)有編寫(xiě)構(gòu)造函數(shù),Java語(yǔ)言會(huì)為提供一個(gè)默認(rèn)的構(gòu)造函數(shù)。默認(rèn)的構(gòu)造函數(shù):不帶參數(shù),函數(shù)體是空的,形如:GF( ) { }可自定義構(gòu)造函數(shù),并向構(gòu)造函數(shù)傳遞創(chuàng)建對(duì)象所需參數(shù)。,三 構(gòu)造函數(shù),,[修飾符] () {語(yǔ)句}修飾符,一般省略。構(gòu)造函數(shù)與類(lèi)名相同。構(gòu)造函數(shù)參數(shù),與方法的聲明相同。,

7、public class GF { private String XM; private int AGE; private String GZDW; public GF(String xm, int a, String dw) { XM=xm; AGE=a; GZDW=dw; } public GF(String xm, int a) { XM=xm; AGE=a; GZDW="未知&

8、quot;; } public String getXM() { return XM; } public int getAge() { return AGE; } public String getGZDW() { return GZDW; } },構(gòu)造函數(shù)的定義,注意: 構(gòu)造函數(shù)的名稱(chēng)必須與類(lèi)名相同 構(gòu)造函數(shù)不指定類(lèi)型(包括void) 構(gòu)造函數(shù)無(wú)任何返回值 一個(gè)類(lèi)可以有多個(gè)不同的構(gòu)造函數(shù)

9、(重載),功能:定義對(duì)象,對(duì)象的屬性進(jìn)行初始化,public class test {public static void main(String[] args) { GF gf1=new GF("小章", 30, "好萊塢"); GF gf2=new GF("小趙", 32); System.out.println(gf1.get

10、XM()); System.out.println(gf2.getAge());}},構(gòu)造函數(shù)的調(diào)用,思考一個(gè)問(wèn)題:GF gf=new GF();還可用嗎?,答案:不能用了,因?yàn)橐坏┳远x了構(gòu)造函數(shù),系統(tǒng)默認(rèn)構(gòu)造函數(shù)將自動(dòng)關(guān)閉。,一個(gè)類(lèi)能夠訪問(wèn)自己的數(shù)據(jù)和方法。但是,其他類(lèi)是否能訪問(wèn)這個(gè)類(lèi)的數(shù)據(jù)或方法?,四 訪問(wèn)控制,在學(xué)習(xí)訪問(wèn)控制前先了解一下Java的包概念,多數(shù)軟件系統(tǒng)是龐大的,為了方便管理,通常要將類(lèi)組織成包

11、。在包中可以存放類(lèi),也可以存放子包,從而形成具有層次結(jié)構(gòu)的包。包可以根據(jù)需要任意組織,通常,要按照類(lèi)的用途、含義來(lái)組織包。,包的概念--package,package [.];例如:,聲明包,package examples.ch1;public class A { public void f1() { System.out.println("f1 called");

12、 }},package命令必須放在源文件的最前面。 一個(gè)源文件最多只能有一條package命令。 一條package命令對(duì)源文件中的所有類(lèi)起作用。 如果沒(méi)有package,類(lèi)將會(huì)保存在當(dāng)前默認(rèn)包中。,A.java,,源文件如果沒(méi)有創(chuàng)建包將保存在默認(rèn)包中,,訪問(wèn)控制,package examples.ch1; public class A { public void f1() {

13、 System.out.println("f1 called"); } private void f2() { System.out.println("f2 called"); }},A.java,package examples.ch1;public class test { public stat

14、ic void main(String args[]) { A a=new A(); a.f1(); //類(lèi)對(duì)象可以訪問(wèn)公有成員 a.f2(); //私有成員不能訪問(wèn) }},test.java,一個(gè)類(lèi)是否能訪問(wèn)另一個(gè)類(lèi)的數(shù)據(jù)或方法,情況1:類(lèi)都在同一個(gè)包中,同一個(gè)包中,如果去掉A類(lèi)的public聲明,test類(lèi)能否使用A類(lèi)?,問(wèn)題1,package examples.

15、ch1;public class A { public void f1() { System.out.println("f1 called"); }},A.java,package examples.ch1;public class test { public static void main(String args[]) { A a=n

16、ew A(); a.f1(); }},test.java,OK!,同一個(gè)包中,如果去掉A類(lèi)成員的public聲明,test類(lèi)能否使用A類(lèi)這個(gè)成員?,問(wèn)題2,package examples.ch1;public class A { public void f1() { System.out.println("f1 called"); }

17、},A.java,package examples.ch1;public class test { public static void main(String args[]) { A a=new A(); a.f1(); }},test.java,OK!,如果test.java與A.java不位于同一包中,package examples.ch2;public class t

18、est { public static void main(String args[]) { A a=new A(); a.f1(); }},錯(cuò)誤: A cannot be resolved to a type,,package examples.ch1;public class A { public void f1() { System.ou

19、t.println("f1 called"); }},A.java,情況2:類(lèi)不在同一個(gè)包中,test.java,import [.].;情況2解決:package examples.ch2;import examples.ch1.A;public class test {public static void main(String[] args) {A a=new A();

20、 a.f1(); }},導(dǎo)入包,當(dāng)想要使用包中的類(lèi)的時(shí)候,可以用import命令告訴編譯器類(lèi)在哪里。,另一種形式:import examples.ch1.*;表示導(dǎo)入一個(gè)包中的所有類(lèi),,test.java,類(lèi)在不同包中,如果去掉A類(lèi)的public聲明,test類(lèi)能否使用A類(lèi)?,問(wèn)題3,package examples.ch2;import examples.ch1.A;public class test

21、{ public static void main(String args[]) { A a=new A(); a.f1(); }},package examples.ch1; public class A { public void f1() { System.out.println("f1 called");

22、 }},A.java,test.java,NO!,類(lèi)的訪問(wèn)控制有2種:public和default(也稱(chēng)friendly)public類(lèi):可以在任何一個(gè)包中的任何一個(gè)類(lèi)中被訪問(wèn)和繼承.default類(lèi):只能在同一個(gè)包中被其它類(lèi)所訪問(wèn)和繼承。,類(lèi)的訪問(wèn)控制,,java.lang:包含一些形成語(yǔ)言核心的類(lèi),如String、Math、Integer、System和Thread等。java.util:包含實(shí)用程序類(lèi),如Calende

23、r、Date、Random、數(shù)據(jù)結(jié)構(gòu)(如List/Stack等)等。java.text:處理顯示對(duì)象格式化,如SimpleDateFormat等。java.io:輸入輸出流包,如File/FileReader/FileWriter等。java.awt:包含了構(gòu)成抽象窗口工具包(AWT)的類(lèi),這個(gè)包被用來(lái)構(gòu)建和管理應(yīng)用程序的圖形用戶(hù)界面(GUI)。java.net:包含執(zhí)行與網(wǎng)絡(luò)相關(guān)的操作的類(lèi)。如Socket/URL類(lèi)。java

24、.applet:包含了可執(zhí)行applet小應(yīng)用程序的類(lèi)。,補(bǔ)充:Java常用包,功能一:一個(gè)類(lèi)的構(gòu)造函數(shù)之間可以相互調(diào)用。調(diào)用方法:this([參數(shù)]),五 關(guān)于this:,public class Employee {private String name;private int salary;public Employee(String n, int s) {name = n;salary = s;

25、}public Employee(String n) {this(n, 0);}public Employee() {this( " unknown " );}},,,Employee e1=new Employee("zz",100); 則 e1.name=zz e1.salary=100Employee e2=new Employee("

26、qq"); 則 e1.name=qq e1.salary=0Employee e3=new Employee(); 則 e1.name=unknow e1.salary=0,對(duì)于this的任何調(diào)用,如果出現(xiàn)在構(gòu)造函數(shù)中則必須是第一個(gè)語(yǔ)句。,注意:this語(yǔ)句必須是整個(gè)構(gòu)造函數(shù)的第一個(gè)可執(zhí)行語(yǔ)句。,class Employee {String name; int ag

27、e; void talk(String name, int age){ this.name=name; this.age=age; }},示例,Public class Test{ public static void main(String args[]){ Employee e1= new Employee(); e1.talk(“zha

28、ngsan”,20); }},功能二:使用this調(diào)用成員變量或成員函數(shù),定義一個(gè)矩形類(lèi) Rectangle:數(shù)據(jù)成員:length, width(double類(lèi)型);具有的操作:(1) 構(gòu)造函數(shù),設(shè)置矩形長(zhǎng)寬 Rectangle( double, double);(2) 計(jì)算矩形周長(zhǎng) getPerimeter();(3) 計(jì)算矩形面積 getArea();(4) 輸出矩形長(zhǎng)寬 showSize()。,編程練習(xí),

29、public class Rectangle { private double length, width; public Rectangle( double length, double width){ this.length=length; this.width=width; } public double getPerimeter() { return 2*(length+widt

30、h); } public double getArea() { return length*width; } public void showSize() { System.out.println("length="+length+", width="+width); } public static void main(String[] args

31、) { Rectangle r1=new Rectangle(3,4); r1.showSize(); System.out.println( "area=" + r1.getArea() ); }},參考代碼,static關(guān)鍵字用來(lái)聲明成員屬于類(lèi),而不是屬于類(lèi)的實(shí)例,static成員,它的使用完全獨(dú)立于該類(lèi)的任何對(duì)象。如果一個(gè)成員被聲明為static,它就能夠在它的類(lèi)

32、的任何對(duì)象創(chuàng)建之前被訪問(wèn),而不必引用任何對(duì)象。,六 static關(guān)鍵字,class Person{ String name; static int age; // 靜態(tài)變量 public void talk() { System.out.println(“name=“+name+”,age=“+age); }},靜態(tài)變量,public class Test { p

33、ublic static void main(String args[]) { Person p1=new Person(); p1.name = “zhangsan”; p1.age=10; Person p2=new Person(); p2.name = “Lisi”; p2.age=20;

34、 p1.talk(); p2.talk(); }},靜態(tài)變量為全局變量,如果static變量沒(méi)有被標(biāo)記成private,也可以不需要類(lèi)的實(shí)例,而通過(guò)類(lèi)名指向它。即“類(lèi)名.靜態(tài)變量”。,補(bǔ)充一點(diǎn),public class StaticVar { public static byte SOURCE_SP=0; public static byte

35、SOURCE_TABLE=1; public static byte SOURCE_JAVABEAN=2;}public class OtherClass [ public void method(byte sourceType) { if(sourceType == StaticVar.SOURCE_SP) {… } }},前提,,class Simp

36、le { int g1; static int g2; void go() { Simple t=new Simple(); t.go2(); } // 不推薦用對(duì)象.靜態(tài)方法 static void go1() { System.out.println("Go1...“+g1); } //No 靜態(tài)方法 static void go2() { System.out.

37、println("Go2...“+g2); } // Yes靜態(tài)方法 void go3() { System.out.println("Go3...“+g1); } // Yes}public class test {public static void main(String[] args) { // 靜態(tài)方法 new Simple s1=new Simple();

38、 s1.go(); //OK go2(); //OK go3(); // NO Simple.go1(); //OK 靜態(tài)方法調(diào)用:類(lèi)名.靜態(tài)方法([參數(shù)]) }},靜態(tài)方法,靜態(tài)方法只能調(diào)用靜態(tài)方法和靜態(tài)變量,this是當(dāng)前對(duì)象的引用。也就是說(shuō)this只能用它來(lái)調(diào)用屬于當(dāng)前對(duì)象的方法和屬性。static方法如果使用的是類(lèi)來(lái)調(diào)用而不是對(duì)象,則 thi

39、s將無(wú)法指向合適的對(duì)象。聲明為static的變量實(shí)質(zhì)上就是全局變量。所有此類(lèi)的實(shí)例(對(duì)象)都共享此靜態(tài)變量。在類(lèi)裝載時(shí),靜態(tài)變量只分配一塊存儲(chǔ)空間,所有此類(lèi)的對(duì)象都可以操控此塊存儲(chǔ)空間。 對(duì)于final型static變量(全局不可修改的變量)則另當(dāng)別論,補(bǔ)充:static方法不能引用this 或super why?,對(duì)于一般的非static成員變量和方法,需要有一個(gè)對(duì)象的實(shí)例才能調(diào)用,所以要先生成對(duì)象的實(shí)例,它們才會(huì)分配內(nèi)存空間

40、。static方法在程序裝載class時(shí)候首先完成,比構(gòu)造方法早,此時(shí)非static的屬性和方法還沒(méi)有完成初始化。所以static方法不能調(diào)用非static方法和屬性。,補(bǔ)充:static方法不能調(diào)用非static方法和變量 why?,class Value { static int c=0; static void inc() { c++; }}class Count { public static v

41、oid prt(String s) { System.out.println(s); } public static void main(String[] args) { Value v1=new Value(); Value v2=new Value(); prt("v1.c="+v1.c+" v2.c="+v2.c); Value.i

42、nc(); //也可 v1.inc();但不推薦 prt("v1.c="+v1.c+" v2.c="+v2.c); }},示例,結(jié)果如下:v1.c=0 v2.c=0v1.c=1 v2.c=1,通過(guò)類(lèi)的實(shí)例訪問(wèn)靜態(tài)變量,靜態(tài)代碼塊: static { 語(yǔ)句塊 }靜態(tài)塊代碼只會(huì)初始化一次,且在類(lèi)被第一次裝載時(shí)。類(lèi)中不同的靜態(tài)塊

43、按它們?cè)陬?lèi)中出現(xiàn)的順序被執(zhí)行。,靜態(tài)塊代碼,class StaticInitDemo { static int i = 5; static { System.out.println("Static code i="+ i++ ); }}public class Test { public static void main(String args[])

44、{ System.out.println("Main code: i=" + StaticInitDemo.i ); }},示例,運(yùn)行結(jié)果:Static code: i=5Main code: i=6,,,③,②,①,public class Parcel { class Destination { //內(nèi)部類(lèi) private String label

45、; Destination(String whereTo) { label = whereTo; } String readLabel() { return label; } } public void ship(String dest) { Destination d = new Destination(dest); S

46、ystem.out.println(d.readLabel()); } public static void main(String[] args) { Parcel p = new Parcel(); p.ship("New York"); }},示例,在類(lèi)的方法中使用內(nèi)部類(lèi)與使用普通類(lèi)沒(méi)多大區(qū)別,,內(nèi)部類(lèi)構(gòu)造函數(shù),,七 內(nèi)部類(lèi),public c

47、lass Outer1 {private int size; public class Inner { //聲明一個(gè)內(nèi)部類(lèi) public void doStuff( ){ size++; //內(nèi)部類(lèi)可以訪問(wèn)外部?jī)?nèi)成員 } } public void testTheInneer( ) { Inner i= new Inner( ); //類(lèi)的成員方

48、法創(chuàng)建內(nèi)部類(lèi)實(shí)例i i.doStuff( ); }},示例-如何在類(lèi)的成員方法創(chuàng)建內(nèi)部類(lèi)實(shí)例,public class Outer2 {private int size;public class Inner{ //內(nèi)部類(lèi) public void doStuff( ){ size++; }}}public class TestInneer { //其他類(lèi)

49、public static void main(String[ ] args){ Outer2 outer = new Outer2( ); Outer2.Inner inner = outer.new Inner( ); //其他類(lèi)創(chuàng)建內(nèi)部類(lèi)實(shí)例 // /或者 Outer2.Inner inner = new Outer2( ).new Inner( ); in

50、ner.doStuff( ); }},示例-如何在其它類(lèi)創(chuàng)建內(nèi)部類(lèi)實(shí)例,下面是錯(cuò)誤用法: Outer2.Inner inner = new outer.Inner( );Outer2.Inner inner = new Outer2.Inner( );,,public class Outer3 {private int size;public class Inner {private int si

51、ze;public void doStuff( int size ) { size++; // doStuff()方法的參數(shù)size this.size++;//內(nèi)部類(lèi)成員變量 Outer3.Inner.size Outer3.this.size++; //外部類(lèi)成員變量 Outer3. size }}},示例-如何區(qū)分同名變量,Out3.size:

52、用法不對(duì),因?yàn)樵搒ize不是靜態(tài),,通常一個(gè)普通類(lèi)不允許聲明為靜態(tài)的,只有一個(gè)內(nèi)部類(lèi)才可以。聲明為靜態(tài)的內(nèi)部類(lèi)可以直接作為一個(gè)普通類(lèi)來(lái)使用,而不需實(shí)例一個(gè)外部類(lèi)。,靜態(tài)內(nèi)部類(lèi),class OuterCls { public static class InnerCls{ //靜態(tài)內(nèi)部類(lèi) InnerCls() { System.out.println("InnerCls"); }

53、 }}public class StaticCls{ public static void main(String[] args){ OuterCls.InnerCls oi=new OuterCls.InnerCls(); //注意內(nèi)部的靜態(tài)類(lèi)使用方法 }},示例,程序運(yùn)行結(jié)果:InnerCls,內(nèi)部類(lèi)只在定義他們的代碼段內(nèi)可見(jiàn)。內(nèi)部類(lèi)可以被定義在方法中。如果方法中

54、的變量被標(biāo)記為final,那么,就可以被內(nèi)部類(lèi)中的方法訪問(wèn)。內(nèi)部類(lèi)可以使用所嵌套類(lèi)的類(lèi)和實(shí)例變量以及所嵌套的塊中的本地變量。內(nèi)部類(lèi)可以被定義為abstract.,內(nèi)部類(lèi)特點(diǎn),只有內(nèi)部類(lèi)可以被聲明為private或protected,以便防護(hù)它們不受來(lái)自外部類(lèi)的訪問(wèn)。一個(gè)內(nèi)部類(lèi)可以作為一個(gè)接口,由另一個(gè)內(nèi)部類(lèi)實(shí)現(xiàn)。被聲明為static的內(nèi)部類(lèi)自動(dòng)地成為頂層類(lèi)。這些內(nèi)部類(lèi)失去了在本地范圍和其它內(nèi)部類(lèi)中使用數(shù)據(jù)或變量的能力。內(nèi)部類(lèi)不

溫馨提示

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

評(píng)論

0/150

提交評(píng)論