5類和對象(上)_第1頁
已閱讀1頁,還剩39頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、 class 類名{ 屬性 行為},二 類的聲明,屬性聲明: [ = ]; 一般用“private”,指明僅能被所屬類中的方法訪問,方法聲明: ( ) { } 一般用"public",指明可以被任何其它代碼訪問,修飾符一般用“public”指明可以被所有其它類訪問,,,,示例,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() );}},訪問對象的成員,// 聲明對象(實例化),// 通過對象訪問公有成員方法,,,一個新對象的初始化是去調用一個叫做構造函數(shù)的方法來實

6、現(xiàn)的。例如:GF gf1=new GF(); 對象gf1就是由GF()這個構造函數(shù)創(chuàng)建的。 每個類至少要有一個構造函數(shù),如果沒有編寫構造函數(shù),Java語言會為提供一個默認的構造函數(shù)。默認的構造函數(shù):不帶參數(shù),函數(shù)體是空的,形如:GF( ) { }可自定義構造函數(shù),并向構造函數(shù)傳遞創(chuàng)建對象所需參數(shù)。,三 構造函數(shù),,[修飾符] () {語句}修飾符,一般省略。構造函數(shù)與類名相同。構造函數(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; } },構造函數(shù)的定義,注意: 構造函數(shù)的名稱必須與類名相同 構造函數(shù)不指定類型(包括void) 構造函數(shù)無任何返回值 一個類可以有多個不同的構造函數(shù)

9、(重載),功能:定義對象,對象的屬性進行初始化,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());}},構造函數(shù)的調用,思考一個問題:GF gf=new GF();還可用嗎?,答案:不能用了,因為一旦自定義了構造函數(shù),系統(tǒng)默認構造函數(shù)將自動關閉。,一個類能夠訪問自己的數(shù)據和方法。但是,其他類是否能訪問這個類的數(shù)據或方法?,四 訪問控制,在學習訪問控制前先了解一下Java的包概念,多數(shù)軟件系統(tǒng)是龐大的,為了方便管理,通常要將類組織成包

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

12、 }},package命令必須放在源文件的最前面。 一個源文件最多只能有一條package命令。 一條package命令對源文件中的所有類起作用。 如果沒有package,類將會保存在當前默認包中。,A.java,,源文件如果沒有創(chuàng)建包將保存在默認包中,,訪問控制,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(); //類對象可以訪問公有成員 a.f2(); //私有成員不能訪問 }},test.java,一個類是否能訪問另一個類的數(shù)據或方法,情況1:類都在同一個包中,同一個包中,如果去掉A類的public聲明,test類能否使用A類?,問題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!,同一個包中,如果去掉A類成員的public聲明,test類能否使用A類這個成員?,問題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(); }},錯誤: 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:類不在同一個包中,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(); }},導入包,當想要使用包中的類的時候,可以用import命令告訴編譯器類在哪里。,另一種形式:import examples.ch1.*;表示導入一個包中的所有類,,test.java,類在不同包中,如果去掉A類的public聲明,test類能否使用A類?,問題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!,類的訪問控制有2種:public和default(也稱friendly)public類:可以在任何一個包中的任何一個類中被訪問和繼承.default類:只能在同一個包中被其它類所訪問和繼承。,類的訪問控制,,java.lang:包含一些形成語言核心的類,如String、Math、Integer、System和Thread等。java.util:包含實用程序類,如Calende

23、r、Date、Random、數(shù)據結構(如List/Stack等)等。java.text:處理顯示對象格式化,如SimpleDateFormat等。java.io:輸入輸出流包,如File/FileReader/FileWriter等。java.awt:包含了構成抽象窗口工具包(AWT)的類,這個包被用來構建和管理應用程序的圖形用戶界面(GUI)。java.net:包含執(zhí)行與網絡相關的操作的類。如Socket/URL類。java

24、.applet:包含了可執(zhí)行applet小應用程序的類。,補充:Java常用包,功能一:一個類的構造函數(shù)之間可以相互調用。調用方法:this([參數(shù)]),五 關于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,對于this的任何調用,如果出現(xiàn)在構造函數(shù)中則必須是第一個語句。,注意:this語句必須是整個構造函數(shù)的第一個可執(zhí)行語句。,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調用成員變量或成員函數(shù),定義一個矩形類 Rectangle:數(shù)據成員:length, width(double類型);具有的操作:(1) 構造函數(shù),設置矩形長寬 Rectangle( double, double);(2) 計算矩形周長 getPerimeter();(3) 計算矩形面積 getArea();(4) 輸出矩形長寬 showSize()。,編程練習,

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關鍵字用來聲明成員屬于類,而不是屬于類的實例,static成員,它的使用完全獨立于該類的任何對象。如果一個成員被聲明為static,它就能夠在它的類

32、的任何對象創(chuàng)建之前被訪問,而不必引用任何對象。,六 static關鍵字,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變量沒有被標記成private,也可以不需要類的實例,而通過類名指向它。即“類名.靜態(tài)變量”。,補充一點,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(); } // 不推薦用對象.靜態(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)方法調用:類名.靜態(tài)方法([參數(shù)]) }},靜態(tài)方法,靜態(tài)方法只能調用靜態(tài)方法和靜態(tài)變量,this是當前對象的引用。也就是說this只能用它來調用屬于當前對象的方法和屬性。static方法如果使用的是類來調用而不是對象,則 thi

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

40、。static方法在程序裝載class時候首先完成,比構造方法早,此時非static的屬性和方法還沒有完成初始化。所以static方法不能調用非static方法和屬性。,補充:static方法不能調用非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); }},示例,結果如下:v1.c=0 v2.c=0v1.c=1 v2.c=1,通過類的實例訪問靜態(tài)變量,靜態(tài)代碼塊: static { 語句塊 }靜態(tài)塊代碼只會初始化一次,且在類被第一次裝載時。類中不同的靜態(tài)塊

43、按它們在類中出現(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 ); }},示例,運行結果:Static code: i=5Main code: i=6,,,③,②,①,public class Parcel { class Destination { //內部類 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"); }},示例,在類的方法中使用內部類與使用普通類沒多大區(qū)別,,內部類構造函數(shù),,七 內部類,public c

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

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

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

50、ner.doStuff( ); }},示例-如何在其它類創(chuàng)建內部類實例,下面是錯誤用法: 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++;//內部類成員變量 Outer3.Inner.size Outer3.this.size++; //外部類成員變量 Outer3. size }}},示例-如何區(qū)分同名變量,Out3.size:

52、用法不對,因為該size不是靜態(tài),,通常一個普通類不允許聲明為靜態(tài)的,只有一個內部類才可以。聲明為靜態(tài)的內部類可以直接作為一個普通類來使用,而不需實例一個外部類。,靜態(tài)內部類,class OuterCls { public static class InnerCls{ //靜態(tài)內部類 InnerCls() { System.out.println("InnerCls"); }

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

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

溫馨提示

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

評論

0/150

提交評論