第3章面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)_第1頁(yè)
第3章面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)_第2頁(yè)
第3章面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)_第3頁(yè)
第3章面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)_第4頁(yè)
第3章面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩136頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第3章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)2015-9-153.1 類與對(duì)象3.1.2 類的定義和使用1.類的定義Java類的基本語(yǔ)法類的基本語(yǔ)法: class 可以是任何合法的可以是任何合法的標(biāo)識(shí)符,并且是所聲明類標(biāo)識(shí)符,并且是所聲明類的名字。的名字。有幾種可使用的有幾種可使用的,但現(xiàn)在只使用但現(xiàn)在只使用public,聲明,聲明類可被任意訪問(wèn)。類可被任意訪問(wèn)。類的正文聲明了與類相關(guān)的類的正文聲明了與類相關(guān)的數(shù)據(jù)屬性、構(gòu)造器和方法的數(shù)據(jù)屬性、構(gòu)造器和方法的集合。集合。BirthDayBirthDay類class BirthDay int year,month,day;2.2.類的使用定義某變量為該類型創(chuàng)建對(duì)

2、象:new 類名()賦值成員變量的使用請(qǐng)看例請(qǐng)看例3-13.1.3 3.1.3 源文件構(gòu)成及命名(1)一個(gè)程序中由一個(gè)或多個(gè)類構(gòu)成,這些類可以放在同一個(gè)源文件中,也可以放在不同文件中,編譯后每個(gè)類都會(huì)對(duì)應(yīng)一個(gè)class文件,該class文件主名與類名相同。(2)如果一個(gè)源文件中各個(gè)類前面都沒(méi)有public修飾符修飾,源文件主名可以任意取。(3)如果一個(gè)源文件中某個(gè)類前面有public修飾符,則文件名必須與public修飾的類同名,但一個(gè)源文件中最多只能有一個(gè)類被public修飾。(4)對(duì)于可以獨(dú)立運(yùn)行的Java Application程序,在命令行中通過(guò) “java 主類名”執(zhí)行,這里主類是包

3、括main()方法的類,該方法是程序的入口,且類名后不能帶后綴“.class”。3.1.4 3.1.4 基本類型與參考類型變量的區(qū)別1. 1. 基本數(shù)據(jù)類型int x,y;x=10;y=20;y=x;3.1.4 3.1.4 基本類型與參考類型變量的區(qū)別2. 2. 參考數(shù)據(jù)類型BirthDay Tombth,Marybth;Tombth=new BirthDay();Marybth=new BirthDay();Tombth.year=1999;Tombth.month=9;Tombth.day=10;Marybth.year=2000;Marybth=Tombth;3.2 方法方法的基本語(yǔ)法方

4、法的基本語(yǔ)法: () 可以是任何合法的可以是任何合法的標(biāo)識(shí)符,但限制使用那些標(biāo)識(shí)符,但限制使用那些已經(jīng)在使用的名稱。已經(jīng)在使用的名稱。是可選項(xiàng),并可有很多不是可選項(xiàng),并可有很多不同的修飾符,包括同的修飾符,包括public、protected和和private等。等。public訪問(wèn)訪問(wèn)修飾符表明可從其他代碼調(diào)用該方法。修飾符表明可從其他代碼調(diào)用該方法。private表明方法只能在由該類中其表明方法只能在由該類中其他方法調(diào)用。他方法調(diào)用。請(qǐng)看例請(qǐng)看例3-3請(qǐng)看例請(qǐng)看例3-43.2.3 3.2.3 方法的重載要構(gòu)成方法的重載必須滿足如下條件:(1)重載的方法在同一個(gè)類中,方法名相同(2)方法的參

5、數(shù)類型、個(gè)數(shù)、順序至少有一個(gè)不同修改例修改例3-33.3 3.3 封裝class BirthDay int year,month,day;public class BirthTest public static void main (String argsp) BirthDay Tombth,Marybth; Tombth=new BirthDay(); Marybth=new BirthDay(); Tombth.year=1999; Tombth.month=9; Tombth.day=10;.容易產(chǎn)生問(wèn)題3.3 3.3 封裝實(shí)現(xiàn)封裝的步驟(1)修改屬性的可見(jiàn)性,如private修飾重要的

6、成員變量(2)創(chuàng)建訪問(wèn)屬性的方法,如set、get方法等(3)在方法中,加入屬性的存取限制3.4 構(gòu)造器3.4.1 構(gòu)造器的特點(diǎn)構(gòu)造構(gòu)造器器的基本語(yǔ)法:的基本語(yǔ)法: () 3.4.1 構(gòu)造器的特點(diǎn)構(gòu)造構(gòu)造器器作用:完成類對(duì)象的作用:完成類對(duì)象的初始化初始化工作工作構(gòu)造構(gòu)造器器的名稱必須與的名稱必須與類名類名相同相同構(gòu)造器構(gòu)造器沒(méi)有返回值沒(méi)有返回值并且不可被繼承并且不可被繼承一般將構(gòu)造一般將構(gòu)造器器的修飾符聲明為的修飾符聲明為public構(gòu)造構(gòu)造器器中不能有中不能有return語(yǔ)句語(yǔ)句3.4.1 構(gòu)造器的特點(diǎn)l參數(shù)表與方法聲明中的一樣。可以象方法一樣向構(gòu)參數(shù)表與方法聲明中的一樣。可以象方法一樣向

7、構(gòu)造造器器傳遞參數(shù)。傳遞參數(shù)。l構(gòu)造構(gòu)造器器可以有可以有0 0個(gè)、個(gè)、1 1個(gè)或者多個(gè)參數(shù)。個(gè)或者多個(gè)參數(shù)。(1)無(wú)參數(shù)的構(gòu)造器p沒(méi)有構(gòu)造器使用默認(rèn)的構(gòu)造器(沒(méi)有參數(shù),沒(méi)有方法體)p如果使用沒(méi)有參數(shù)的構(gòu)造器,則創(chuàng)建的對(duì)象具有相同的初始值class BirthDayint year,month,day;BirthDay()year = 2015;month = 9;day = 15;(2)帶參數(shù)的構(gòu)造器class BirthDayint year,month,day;BirthDay(int y,int m,int d) year = y; month = m; day = d;class Bi

8、rthDayint year,month,day;BirthDay(int year, int month,int day)this.year = year;this.month = month;this.day = day;3.4.2 構(gòu)造器的使用u不能由編程人員顯式調(diào)用。u在創(chuàng)建一個(gè)類的新對(duì)象的同時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用該類的構(gòu)造器為新對(duì)象初始化。u構(gòu)造器只能和new運(yùn)算符一起使用。格式:類名 對(duì)象名=new 構(gòu)造器名稱(成員變量的初始值)請(qǐng)看例請(qǐng)看例3-103.4.3 構(gòu)造器的重載一個(gè)類可以有多個(gè)構(gòu)造器,叫做構(gòu)造器的重載。條件(滿足其一)p 參數(shù)的個(gè)數(shù)不同p 參數(shù)的類型不同請(qǐng)看例請(qǐng)看例3-11

9、3.4.4 多個(gè)構(gòu)造器的相互調(diào)用在一個(gè)構(gòu)造器中只能通過(guò)this關(guān)鍵字來(lái)調(diào)用重載的另一個(gè)構(gòu)造器請(qǐng)看請(qǐng)看43頁(yè)例子頁(yè)例子默認(rèn)構(gòu)造器每個(gè)類至少有一個(gè)構(gòu)造器。如果不編寫(xiě)構(gòu)造器,則自動(dòng)添加默認(rèn)構(gòu)造器:p 默認(rèn)構(gòu)造器不帶參數(shù)p 默認(rèn)構(gòu)造器函數(shù)體為空不必編寫(xiě)構(gòu)造器就能使用new Xxx()創(chuàng)建 對(duì)象實(shí)例找錯(cuò)誤?class Person private String name = model; private int age=20; private double height = 1.7; private double weight = 60; public Person(String name,int ag

10、e,double height,double weight) =name; this.age=age; this.height=height; this.weight=weight; class test public static void main(String args) Person p1=new Person(); Person p2=new Person(“jerry”,20,1.9,100);哪個(gè)語(yǔ)句有錯(cuò)?哪個(gè)語(yǔ)句有錯(cuò)?為什么?為什么?【上機(jī)作業(yè)1】定義一個(gè)人類,描述人類的姓名、年齡、身高、體重,定義一個(gè)方法用來(lái)檢驗(yàn)人的體重是否在正常范圍之內(nèi),定義一個(gè)方法用于得

11、到是否肥胖的結(jié)論。 (需要定義構(gòu)造器)計(jì)算標(biāo)準(zhǔn)上機(jī)作業(yè)2 2定義一個(gè)圓類,類中包含圓心x坐標(biāo)、y坐標(biāo)和半徑等屬性,有計(jì)算圓面積和周長(zhǎng)的方法。(要求:定義構(gòu)造器)【09160916上機(jī)情況總結(jié)】工程名的命名問(wèn)題(不要命名為*.java)src下的文件都是.java文件類的構(gòu)成找問(wèn)題1 1class PersonString name;int age;double height,weight;double bmi = weight/(height*height);if(bmi19.8) System.out.println(偏瘦);找問(wèn)題2 2class PersonString name;int

12、 age;double height,weight;void setAge(int a)this.age = a;void printAge()System.out.println(a);找問(wèn)題3 3class Circleint x,y,radius;public Circle(int x, int y, int radius) this.x = x;this.y = y;this.radius = radius;void print()System.out.println(周長(zhǎng)是:+2*3.14*radius);System.out.println(面積是:+3.14*radius*rad

13、ius);【上節(jié)內(nèi)容復(fù)習(xí)】如何實(shí)現(xiàn)封裝?構(gòu)造器的作用?何時(shí)調(diào)用構(gòu)造器?【書(shū)面作業(yè)的問(wèn)題】書(shū)寫(xiě)雷同3.5 3.5 變量的作用域和初始化(1)局部變量:要先賦值再使用方法內(nèi)部定義作用域是整個(gè)方法方法的代碼塊中定義作用域是代碼塊【找問(wèn)題】void print() double pi; System.out.println(周長(zhǎng)是:+2*pi*radius); System.out.println(面積是:+pi*radius*radius);3.5 3.5 變量的作用域和初始化(2)參數(shù)由實(shí)參賦值方法或構(gòu)造器的參數(shù)作用域是方法或構(gòu)造器內(nèi)部【舉例】public class test public st

14、atic void main(String args) Circle c1 = new Circle(1,2,5);class Circleint x,y,radius;public Circle(int x, int y, int radius) this.x = x;this.y = y;this.radius = radius;3.5 3.5 變量的作用域和初始化(3)成員變量對(duì)象創(chuàng)建時(shí)有默認(rèn)值在類內(nèi)、方法外定義整個(gè)類3.3.7 7 父類、子類和繼承繼承在繼承關(guān)系中,被繼承的類為父類,由繼承得到的類為子類。子類可以繼承父類中的屬性和方法,也可以在子類中添加新的屬性和方法,也可以修改定義原

15、有(從父類繼承得到的)的變量成員,重寫(xiě)原有的方法。 在Java中,所有的類都是直接或間接地繼承類Object,也就是說(shuō)在Java的類樹(shù)中,Object是這棵樹(shù)的根?!纠?-153-15】StudentStudent類Student+studentNo : String+name : String+showInfo() : voidclass Student String studentNo,name; void showInfo() System.out.println(學(xué)號(hào):學(xué)號(hào):+studentNo); System.out.println(姓名:姓名:+name); 【例3-153-15

16、】子類化Collegian +major : Stringclass Student String studentNo,name; void showInfo() System.out.println(學(xué)號(hào):學(xué)號(hào):+studentNo); System.out.println(姓名:姓名:+name); class Collegian extends Student String major;Student+studentNo : String+name : String+showInfo() : void單繼承(Java(Java只支持單繼承) )當(dāng)類只從一個(gè)類繼承時(shí),稱為單繼承當(dāng)類只從一個(gè)

17、類繼承時(shí),稱為單繼承Java中類的繼承結(jié)構(gòu)為樹(shù)狀中類的繼承結(jié)構(gòu)為樹(shù)狀語(yǔ)法:語(yǔ)法: class extends * 【例3-153-15】class Student String studentNo,name; void showInfo() System.out.println(學(xué)號(hào): +studentNo); System.out.println(姓名: +name); class Collegian extends Student String major;class sttest0 public static void main (String args) Collegian cst=n

18、ew Collegian(); cst.studentNo=0810123; =張三; cst.major=計(jì)算機(jī); cst.showInfo();【對(duì)例3-153-15的說(shuō)明】大學(xué)生是學(xué)生的一種類型,所以把Collegian定義為Student的子類是合乎它們之間的邏輯關(guān)系的另一方面,通過(guò)繼承可以避免程序的冗余。通過(guò)運(yùn)行結(jié)果可以看到,子類Collegian從父類Student中繼承了成員變量studentNo、name和方法showInfo()將父類屬性改為privateprivate,結(jié)果如何呢?class Student private String studentNo,

19、name; void showInfo() S y s t e m . o u t . p r i n t l n ( 學(xué) 號(hào) :+studentNo); System.out.println(姓名:+name); class Collegian extends Student String major;class sttest1 public static void main (String argsp Collegian cst=new Collegian(); cst.studentNo=0810123; =張三; cst.major=計(jì)算機(jī); cst.showInfo(

20、); 【說(shuō)明】子類可以繼承父類中子類可以繼承父類中非非private的方法和屬性的方法和屬性不不必重新定義必重新定義子類中可以增加新的屬性和方法子類中可以增加新的屬性和方法繼承的目的:程序代碼繼承的目的:程序代碼重用重用,減少冗余,減少冗余3.7.2 方法的覆蓋(override)覆蓋方法覆蓋:覆蓋:在子類中定義了與父類中同名的方法,在子類中定義了與父類中同名的方法,且方法的且方法的l 參數(shù)(個(gè)數(shù)、類型、排列順序)參數(shù)(個(gè)數(shù)、類型、排列順序)l 返回類型返回類型完全一致完全一致【分析例3-153-15的問(wèn)題】在Collegian中有三個(gè)屬性值要輸出,但是在通過(guò)繼承得到的方法showInfo()

21、只能輸出兩個(gè)屬性值,在子類中新添加的屬性major的值沒(méi)有被輸出【思考】如何解決?【對(duì)例3-153-15的修改】class Student String studentNo,name; void showInfo() System.out.println(學(xué)號(hào):+studentNo); System.out.println(姓名:+name); class Collegian extends Student String major; void showInfo() System.out.println(學(xué)號(hào):+studentNo); System.out.println(姓名:+name);

22、 System.out.println(專業(yè):+major);【對(duì)例【對(duì)例3-153-15的修改】的修改】class sttest public static void main (String argsp) Student st=new Student(); st.studentNo=0810123; =張三; st.showInfo(); Collegian cst=new Collegian(); cst.studentNo=“1110101; =“李四; cst.major=“計(jì)算機(jī)”; cst.showInfo(); 【思考:分析該例是覆蓋還是重載?】c

23、lass Base public void amethod(int i)System.out.println(i=+i); class Scope extends Base public void amethod(int i,float f) System.out.println(i=+i); System.out.println(f=+f); class test1 public static void main (String argsp) Scope s1; s1=new Scope(); s1.amethod(10); s1.amethod(10,2.3f); 【分析】在這個(gè)例子中,父

24、類Base和Scope中分別定義了方法amethod,看起來(lái)似乎是覆蓋,但是這兩個(gè)方法的參數(shù)不相同,因此不能形成覆蓋。又因?yàn)樽宇怱cope把父類定義的方法amethod(int i)繼承了下來(lái),然后又新定義了一個(gè)同名但參數(shù)不相同的方法amethod(int i,float f),因此在子類Scope中有兩個(gè)同名方法,而且它們的參數(shù)不相同,滿足方法重載的條件,因此,形成了重載,而不是覆蓋。 【改進(jìn)例1 1】加上構(gòu)造器class Student String studentNo,name; Student(String sn,String nm) studentNo=sn; name=nm; vo

25、id showInfo() System.out.println(學(xué)號(hào):+studentNo); System.out.println(姓名:+name); 【改進(jìn)例1 1】加上構(gòu)造器class Collegian extends Student String major; Collegian(String sn,String nm,String mj) super(sn,nm); major=mj; void showInfo() super.showInfo(); System.out.println(專業(yè):+major); 【改進(jìn)例1 1】加上構(gòu)造器class sttest public

26、 static void main (String argsp) Student st=new Student(651003,王五); st.showInfo(); st.studentNo=0810123; Collegian cst=new Collegian(0810123,張三,計(jì)算機(jī)); cst.showInfo(); supersuper關(guān)鍵字往往在覆蓋方法時(shí),真正的目標(biāo)不是往往在覆蓋方法時(shí),真正的目標(biāo)不是代替代替現(xiàn)有的行現(xiàn)有的行為,而是在某些方面為,而是在某些方面擴(kuò)展擴(kuò)展那個(gè)行為那個(gè)行為類中使用類中使用super來(lái)指向父類的成員,包括數(shù)據(jù)和方來(lái)指向父類的成員,包括數(shù)據(jù)和方法法3.

27、7.3 3.7.3 supersuper的三種使用方式super.方法名方法名(參數(shù)表參數(shù)表); 調(diào)用父類的方法調(diào)用父類的方法super(參數(shù)表參數(shù)表); 調(diào)用父類的構(gòu)造函數(shù)調(diào)用父類的構(gòu)造函數(shù)super.成員變量名成員變量名 訪問(wèn)父類的成員變量訪問(wèn)父類的成員變量構(gòu)造函數(shù)不能繼承子類從父類繼承非私有的方法和變量子類不能繼承父類的構(gòu)造函數(shù)有兩種方法獲得構(gòu)造函數(shù)p使用默認(rèn)構(gòu)造函數(shù)p編寫(xiě)一個(gè)或多個(gè)構(gòu)造函數(shù)調(diào)用父類構(gòu)造函數(shù)要要調(diào)用父類構(gòu)造函數(shù)調(diào)用父類構(gòu)造函數(shù),必須在子類構(gòu)造函數(shù)的第一,必須在子類構(gòu)造函數(shù)的第一行使用行使用super關(guān)鍵字關(guān)鍵字要調(diào)用特定的父類構(gòu)造函數(shù),必須為要調(diào)用特定的父類構(gòu)造函數(shù),必須

28、為super提供參提供參數(shù)數(shù)如果沒(méi)有如果沒(méi)有this或或super調(diào)用,編譯器會(huì)插入一個(gè)對(duì)父調(diào)用,編譯器會(huì)插入一個(gè)對(duì)父類無(wú)參數(shù)構(gòu)造函數(shù)的隱含調(diào)用:類無(wú)參數(shù)構(gòu)造函數(shù)的隱含調(diào)用:super()【supersuper的第三種用法】class FatherString var=Fathers variable;class Son extends Father String var=Sons variable; void test() System.out.println(var is +var); System.out.println(super.var is +super.var); public

29、static void main (String argsp) Son s=new Son(); 【分析】哪兒有問(wèn)題?class Student String studentNo,name; Student(String sn,String nm)studentNo=sn; name=nm; class Collegian extends Student String major; Collegian(String sn,String nm,String mj) super(sn,nm); major=mj; Collegian(String nm,String mj) super(“1001

30、0”,nm); major=mj; Collegian(String mj) major=mj; 上機(jī)作業(yè)1 1根 據(jù) 類 圖 編 寫(xiě) E m p l o y e e 、 W o r k e r 和HourlyWorker三個(gè)類。要求三個(gè)類要有相應(yīng)的構(gòu)造函數(shù)。編寫(xiě)main方法進(jìn)行測(cè)試。Employee+getFirstName():String+getLastName():String+toString():String /得到姓名得到姓名+earnings():double /計(jì)算收入計(jì)算收入+setSalary():void+setCommission():void+setQuantity

31、():void+toString():String /得到姓名得到姓名+earnings():double /計(jì)算收入計(jì)算收入Worker /普通員工普通員工-salary:double /底薪底薪-commission:double /獎(jiǎng)金獎(jiǎng)金-quantity:int /銷售額銷售額HourlyWorker /計(jì)時(shí)工人計(jì)時(shí)工人-wage:double /每小時(shí)工資每小時(shí)工資-hours:double /工作時(shí)間工作時(shí)間-firstname:String /姓姓-lastname:String /名名+setWage():void+setHours():void+toString():Str

32、ing /得到姓名得到姓名+earnings():double /計(jì)算收入計(jì)算收入上機(jī)作業(yè)2定義一個(gè)形狀類定義一個(gè)形狀類CShape,在此基礎(chǔ)上派生出,在此基礎(chǔ)上派生出矩形類矩形類CRectangle和圓類和圓類CCircle, ,兩者都有兩者都有GetArea()函數(shù)計(jì)算對(duì)象的面積。試編寫(xiě)一個(gè)函數(shù)計(jì)算對(duì)象的面積。試編寫(xiě)一個(gè)完整的程序。完整的程序。類圖類圖CShape+GetArea() : double+GetArea() : doubleCRectangle+x : double+y : double+GetArea() : doubleCCircle+r : double3.8 3.8

33、包為了更好的組織類,Java提供了包機(jī)制一個(gè)包相當(dāng)于一級(jí)或者多級(jí)目錄Java采用了.來(lái)分隔目錄需要掌握的兩個(gè)語(yǔ)句(1 1)創(chuàng)建包package pkg1.pkg2.pkg3.;源文件的第一條語(yǔ)句一個(gè)文件中最多只能有一條package語(yǔ)句需要掌握的兩個(gè)語(yǔ)句(2 2)加載包import pkg1.pkg2.classname|*;如果需要從一個(gè)包中加載一個(gè)類時(shí),則在包名后跟著要加載的類名如果需要從一個(gè)包中加載多個(gè)類時(shí),則在包名后跟著*指代包中所有的類import語(yǔ)句可以有多個(gè),放在package語(yǔ)句之后Java SE API Java SE API 文檔http:/ 聲明對(duì)象Person p;未初

34、始化地址未初始化地址p棧內(nèi)存棧內(nèi)存堆內(nèi)存堆內(nèi)存示例示例(2) 創(chuàng)建對(duì)象p=new Person();未初始化地址未初始化地址p棧內(nèi)存棧內(nèi)存堆內(nèi)存堆內(nèi)存null00.00.0nameageweightheight0 x30000 x3000注意二者的區(qū)別注意二者的區(qū)別棧stack連續(xù)的內(nèi)存區(qū)域,大小固定,編譯時(shí)確定所需空間大小,效率高堆heap不連續(xù)的內(nèi)存區(qū)域,運(yùn)行時(shí)確定所需空間大小(支持面向?qū)ο蟮亩鄳B(tài)性,如:運(yùn)行時(shí)才能確定是哪個(gè)類的對(duì)象),效率低,但靈活3.2.4 3.2.4 靜態(tài)變量靜態(tài)變量補(bǔ)充實(shí)例補(bǔ)充實(shí)例 public class Person private int person_No;

35、 public static int nextperson_No=1000; public Person() person_No=+nextperson_No; 補(bǔ)充實(shí)例補(bǔ)充實(shí)例 class Test public static void main(String args) Person c1=new Person(); Person c2=new Person(); 補(bǔ)充實(shí)例補(bǔ)充實(shí)例 public class Person private int person_No; public static int nextperson_No=1000; public Person() person_N

36、o=+nextperson_No; public int getPerson_No() return person_No; 補(bǔ)充實(shí)例補(bǔ)充實(shí)例 class Test public static void main(String args) Person c1=new Person(); Person c2=new Person(); System.out.println(“c1:nextperson_No”); System.out.println(c1. nextperson_No); System.out.println(“c1:person_No”); System.out.println

37、(c1. getPerson_No(); Person+nextperson_No:int=1000-person_No:intc1:Clerkperson_No=1001c2:Clerkperson_No=1002實(shí)例實(shí)例實(shí)例實(shí)例在這個(gè)示例中,為創(chuàng)建的每個(gè)對(duì)象分配了一個(gè)唯一的序列號(hào),在這個(gè)示例中,為創(chuàng)建的每個(gè)對(duì)象分配了一個(gè)唯一的序列號(hào),從從10001000開(kāi)始向上遞增。變量開(kāi)始向上遞增。變量nextperson_No在所有實(shí)例間共在所有實(shí)例間共享,因此當(dāng)一個(gè)對(duì)象的構(gòu)造器增加享,因此當(dāng)一個(gè)對(duì)象的構(gòu)造器增加nextperson_No的值時(shí),的值時(shí),下一個(gè)創(chuàng)建的對(duì)象就可接收到這個(gè)增加的值。下一個(gè)創(chuàng)

38、建的對(duì)象就可接收到這個(gè)增加的值。類屬性說(shuō)明類屬性說(shuō)明使用static來(lái)標(biāo)記的變量是共享于類的所有實(shí)例的變量。例如:可以使用該變量作為實(shí)例間通信的基礎(chǔ),或者跟蹤已創(chuàng)建的實(shí)例數(shù)。如果static變量未被標(biāo)記為private,那么可從類外訪問(wèn)它。這樣,不需要類的實(shí)例,就可通過(guò)類名引用它。 public class OtherClass public void incrementNumber() Person.nextperson_No+; 類屬性的使用類屬性的使用API中:如Math.PI(不用創(chuàng)建Math類的對(duì)象就可以使用PI這個(gè)類屬性)作為全局變量,即只想用一個(gè)存儲(chǔ)區(qū)域來(lái)保存特定的數(shù)據(jù)。無(wú)論創(chuàng)建

39、多少個(gè)對(duì)象,甚至不創(chuàng)建對(duì)象都可以使用。思考:1.銀行卡的年費(fèi)2.排隊(duì)機(jī)銀行卡舉例銀行卡舉例 public class BankCard private String CardNO; /卡號(hào) public static double annual_fee; /年費(fèi) 補(bǔ)充實(shí)例補(bǔ)充實(shí)例 class Person private int person_No; private double person_salary; public static int nextperson_No=1000; public static double person_lowsalary=280; /最低工資 public

40、 Person(double salary) person_No=+nextperson_No; person_salary=person_lowsalary+salary; public int getPerson_No() return person_No; 2.4 static2.4 static方法方法類方法示例類方法示例 class Person private int person_No; public static int nextperson_No=1000; public Person() person_No=+nextperson_No; public int getPer

41、son_No() return person_No; public static int getNextperson_No() return nextperson_No; 使用類名訪問(wèn)靜態(tài)方法使用類名訪問(wèn)靜態(tài)方法public class Test public static void main(String args ) System.out.println(“Number of person is”+Person. getNextperson_No(); Person c1=new Person(); System.out.println(“Number of person is”+Pers

42、on. getNextperson_No(); staticstatic方法說(shuō)明方法說(shuō)明main()方法是static方法,因?yàn)閳?zhí)行main方法時(shí),JVM并不創(chuàng)建類的實(shí)例。因此如果有成員數(shù)據(jù),必須創(chuàng)建對(duì)象來(lái)訪問(wèn)它。如:Math類的運(yùn)算方法都定義為static,可以直接通過(guò)Math.方法名()來(lái)訪問(wèn)。staticstatic方法說(shuō)明方法說(shuō)明除了局部變量、static屬性及其參數(shù)外,static方法不能訪問(wèn)任何變量。如果試圖訪問(wèn)非static屬性會(huì)引起編譯器錯(cuò)誤。非static屬性綁定到一個(gè)實(shí)例上并且只有通過(guò)實(shí)例引用才能訪問(wèn)。錯(cuò)誤的例子錯(cuò)誤的例子 class Person private int

43、person_No; public static int nextperson_No=1000; public Person() person_No=+nextperson_No; public int getPerson_No() return person_No; public static int getNextperson_No() return person_No; /編譯錯(cuò)誤 判斷哪些語(yǔ)句錯(cuò)誤?判斷哪些語(yǔ)句錯(cuò)誤? class Test static int num; int c; public static void main(String args ) num=100; c=10

44、0; static void ss() num=100; c=100; void tt() num=100; c=100; 正確的寫(xiě)法正確的寫(xiě)法 class Test static int num; int c; public static void main(String args ) num=100; Test t=new Test(); t.c=100; 分析該例,找出錯(cuò)在哪兒?分析該例,找出錯(cuò)在哪兒?class InstanceTest int Variable; static public int method() return Variable; static public voi

45、d method2(int variable) this.Variable=variable; 補(bǔ)充:靜態(tài)初始化器補(bǔ)充:靜態(tài)初始化器靜態(tài)初始化靜態(tài)初始化一個(gè)類可以在“靜態(tài)塊”中(而非方法體內(nèi))包含代碼靜態(tài)塊代碼僅在加載類時(shí)執(zhí)行一次如果類中包含多個(gè)靜態(tài)塊,它們將被按照在類中出現(xiàn)的順序執(zhí)行示例示例1 1 class Count public static int counter; static counter=10; public class Test public static void main(String args ) System.out.println(“counter=”+Count

46、.counter); 示例示例2 2 class ss static System.out.println(“hi”); public class Test public static void main(String args) ss t1=new ss(); ss t2=new ss(); ss t3=new ss(); 初始化初始化實(shí)例變量的初始化構(gòu)造函數(shù)類變量(static變量)的初始化靜態(tài)初始化器3.4 3.4 多態(tài)多態(tài)1.1.變量多態(tài)變量多態(tài)類型為X的參考變量,其指向的對(duì)象類型既可以是X,也可以是X的子類如:Student x=new Collegian();Student y=n

47、ew Student();【多態(tài)例1.11.1】class Student String studentNo,name; Student(String sn,String nm) studentNo=sn; name=nm; void showInfo() System.out.println(學(xué)號(hào):+studentNo); System.out.println(姓名:+name); class Collegian extends Student String major; Collegian(String sn,String nm,String mj) super(sn,nm); major

48、=mj; void showInfo() super.showInfo(); System.out.println(專業(yè):+major); 【多態(tài)例1.11.1】class test public static void main (String argsp) Student s1,s2; s1=new Student(651003,王五); s1.showInfo(); s2=new Collegian(0810123,張三,計(jì)算機(jī)); System.out.println(姓名:+); System.out.println(專業(yè):+s2.major); s2.showInfo

49、(); 【分析例1.11.1的問(wèn)題】出錯(cuò)的語(yǔ)句: System.out.println(專業(yè):+s2.major); 改為: System.out.println(專業(yè):+(Collegian)s2).major); 原因: 通過(guò)對(duì)象名訪問(wèn)成員變量時(shí),取決于該對(duì)象聲明時(shí)的類型,因此s2聲明時(shí)是Student類型,因此訪問(wèn)major會(huì)出錯(cuò); 而通過(guò)對(duì)象名調(diào)用方法時(shí),則取決于該對(duì)象實(shí)際的類型,因此s2.showInfo()是調(diào)用的子類的方法。2.2.補(bǔ)充幾個(gè)實(shí)例補(bǔ)充幾個(gè)實(shí)例理解覆蓋和隱藏的區(qū)別理解覆蓋和隱藏的區(qū)別(2.(2.1)1)實(shí)例方法能夠被覆蓋實(shí)例方法能夠被覆蓋class Super Str

50、ing name() return “mother; class Sub extends Super String name() return “baby; (2.(2.1)1)實(shí)例方法能夠被覆蓋實(shí)例方法能夠被覆蓋 class Test public static void main(String args) Super s = new Sub(); System.out.println((); 輸出輸出:baby(2.2)(2.2)靜態(tài)方法不能被覆蓋靜態(tài)方法不能被覆蓋class Super static String name() return “mother; class Su

51、b extends Super static String name() return “baby; (2.2)(2.2)靜態(tài)方法不能被覆蓋靜態(tài)方法不能被覆蓋 class Test public static void main(String args) Super s = new Sub(); System.out.println((); 輸出輸出:mother原因原因靜態(tài)方法在編譯時(shí)根據(jù)調(diào)用該方法的類或?qū)ο笏鶎俚念悰Q定實(shí)例方法在運(yùn)行時(shí)根據(jù)對(duì)象所屬的類決定例如: Super s = new Sub();編譯時(shí)s是Super類的對(duì)象,而運(yùn)行時(shí)s指向Sub類的對(duì)象(2.3)(2.3)

52、屬性的隱藏屬性的隱藏class Base int x = 1; static int y=2;class Subclass extends Base int x = 4; int y=5;(2.3)(2.3)屬性的隱藏屬性的隱藏public class Test public static void main(String args) Subclass s=new Subclass(); System.out.println(s.x + + s.y);輸出什么? 4 5修改修改(2.3)(2.3):(2.(2.3)3)public class Test public static void m

53、ain(String args) Base s=new Subclass(); System.out.println(s.x + + s.y);輸出什么? 1 2原因:編譯時(shí)根據(jù)類或?qū)ο箢愋蜎Q定總結(jié)總結(jié)父類的實(shí)例方法被子類的同名實(shí)例方法覆蓋父類的靜態(tài)方法被子類的同名靜態(tài)方法隱藏父類的實(shí)例變量和類變量(static)可以被子類的實(shí)例變量和類變量隱藏(2.4)(2.4)class Base int x = 1; static int y=2; String name() return mother; static String staticname() return static mother;

54、class Subclass extends Base int x = 4; int y=5; String name() return baby; static String staticname() return static baby; (2.4)(2.4)public class Test public static void main(String args) Subclass s=new Subclass(); System.out.println(s.x + + s.y); System.out.println((); System.out.println(s.sta

55、ticname(); Base ss=s; System.out.println(ss.x + + ss.y); System.out.println((); System.out.println(ss.staticname(); 隱藏和覆蓋的區(qū)別隱藏和覆蓋的區(qū)別將子類對(duì)象轉(zhuǎn)換為父類對(duì)象(直接賦值)后,可以訪問(wèn)被隱藏的變量和方法(編譯時(shí)根據(jù)類型決定),但是不能訪問(wèn)被覆蓋的變量和方法(運(yùn)行時(shí)根據(jù)類型決定)。3.instanceof3.instanceof操作符操作符修改修改(2.4)(2.4)可以根據(jù)對(duì)象所屬的類進(jìn)行不同的處理: public static void main(St

56、ring args) Base ss=new Subclass(); if (ss instanceof Subclass) System.out.print(ss.x + + ss.y); System.out.print((); System.out.print(ss.staticname(); 還存在問(wèn)題?還存在問(wèn)題?class Base int x = 1; static int y=2;class Subclass extends Base int x = 4; int y=5; int z=9;編譯出錯(cuò)編譯出錯(cuò)public static void main(Strin

57、g args) Base ss=new Subclass(); if (ss instanceof Subclass) System.out.print(ss.z); 解決方法解決方法對(duì)象類型轉(zhuǎn)換對(duì)象類型轉(zhuǎn)換public static void main(String args) Base ss=new Subclass(); if (ss instanceof Subclass) System.out.print(Subclass)ss).z); 對(duì)象類型轉(zhuǎn)換對(duì)象類型轉(zhuǎn)換對(duì)對(duì)(2.2)(2.2)的修改的修改class Super static String name() return mot

58、her; class Sub extends Super static String name() return baby; 對(duì)象類型轉(zhuǎn)換對(duì)象類型轉(zhuǎn)換對(duì)對(duì)(2.2)(2.2)的修改的修改class Test public static void main(String args) Super s = new Sub(); System.out.println(Sub)s).name(); 對(duì)象類型轉(zhuǎn)換對(duì)象類型轉(zhuǎn)換對(duì)對(duì)(2.3)(2.3)的修改的修改class Base int x = 1; static int y=2;class Subclass extends Base int x = 4

59、; int y=5;對(duì)象類型轉(zhuǎn)換對(duì)象類型轉(zhuǎn)換對(duì)對(duì)(2.3)(2.3)的修改的修改public class Test public static void main(String args) Base s=new Subclass(); System.out.println(Subclass)s).x + + (Subclass)s).y);對(duì)對(duì)(2.4)(2.4)的修改的修改public static void main(String args) Base ss=new Subclass(); if (ss instanceof Subclass) System.out.print(ss.x

60、+ + ss.y); System.out.print((); System.out.print(ss.staticname(); 將紅色的ss都改為(Subclass)ss),才可以得到子類的x和y,調(diào)用子類的靜態(tài)方法staticname()4.4.多態(tài)的應(yīng)用多態(tài)的應(yīng)用4.14.1異類收集異類收集class Animal public void eat()class Dog extends Animal public void eat()System.out.println(狗吃骨頭);class Cat extends Animal public void eat()Syst

溫馨提示

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

評(píng)論

0/150

提交評(píng)論