第03章 Java面向對象程序設計

           

          ·本章學習目標

          本章介紹面向對象程序設計的核心內容,是學習這門課程的難點所在。

          了解OOP的基本理論,基本概念和基本方法。

          掌握類的繼承和接口的概念及具體用法。

          掌握類的封裝、多態性(方法的重載、覆蓋)。

          掌握靜態成員變量和靜態成員方法的意義以及引用或調用的方法。

          了解包的概念。

          ·本章學習內容

          類和對象的概念

          面向對象的特性

          類變量和類方法

          封裝和修飾符的使用

          內部類

          接口

          包層次的理解和使用

          3.1 面向對象程序設計基礎

          3.1.1面向對象概述

          面向機器的程序:專門為特定的硬件系統。

          面向過程的程序:數據結構和算法,主要以解決問題的過程來編寫程序。

          面向對象的程序:不僅關心個體的解決過程,而且還關心包含這些過程的復雜系統。

          3.1.2面向對象的基本概念

          1、類與對象

          類(Class):一種復雜的數據類型,它是將數據和與數據相關的操作封裝在一起的集合體,是普通數據類型的擴展。它不但包含數據,還包含對數據進行操作的方法(Method),方法反映了數據的行為。

          對象(Object):類的實例,它是類的變量,即類在內存中具體的內存分配。

              Java編寫程序就是編寫一個個的類,然后生成一個個的對象。

              對象與類是密切相關的,沒有脫離對象的類,也沒有不依賴類的對象。

          2、成員

          成員即類中包含的部分。用來描述類(對象)的屬性(靜態描述對象的特征)和方法(動態描述對象的特征)。

          成員變量:類中的數據,用來刻畫類的屬性。

          成員方法:類中一系列的操作(函數),用于描述類的行為。

          注意:在Java語言中,一切事物都為對象。

          3、類的核心特征

          封裝:隱藏類的實現細節(具體的代碼)。提供類的訪問接口。

          繼承:代碼復用,不用改變原代碼。用以擴充類的功能。使類具有新的特性。

          多態:多種形態。指一個程序中使用相同名字定義了不同的方法。類的實現具有多種形態的特征,具體包括方法的重載和覆蓋。

          3.1.3面向對象程序設計的優點

          提高了程序的可重用性和可維護性;

          對數據的封裝,提高了數據的獨立性;

          提高了開發效率,降低修改難度;

          對復雜的系統提出了新的解決問題的思路和方案。

          3.2 類與對象

          3.2.1類的聲明和類主體

          Java類的定義格式包括類聲明和類主體:

          <類聲明>{ <類主體> }

          注:類聲明包括該類的名稱、訪問權限、與其他類的關系等;類主體定義該類的成員。

          1、類的聲明

          類聲明的格式如下:

          [<修飾符>] class 類名 [extends <父類名>][implements <接口名列表>] { <類主體> }               

          2、類主體

              類主體包含成員變量和成員方法兩部分:

          <類聲明> {

          <成員變量的聲明>

          <成員方法的聲明及實現>

          }

          【例】創建一個名為Person的類,它包含nameage兩個成員變量和eatwork兩個成員方法。

          public class Person {

                   String name;

                   int age;

                   public void eat(){

                             System.out.println("eat...");

                   }

                   public void work(){

                             System.out.println("work...");

                   }

          }

          3.2.2創建對象與構造方法

          1、創建與使用對象

          定義類之后需要創建類的對象才能使用類的功能。

          對象的生命周期是:創建、使用、銷毀

          類名 對象名; //聲明對象變量

          對象名=new 類名(); 創建實際的對象

          定義好對象后就可以訪問對象的方法和變量了,必須遵守先定義創建然后再使用。

          創建和使用對象時應注意:

          通過“.”運算符實現對成員變量的訪問和對成員方法的調用。并不是所有的成員都能夠訪問,修飾符可以設定訪問權限

          對象名.方法;

          對象名.成員變量;

          對象為類的成員時,使用前必須要先創建。

          對象作為參數傳遞的時候為引用調用。

          調用方法中沒有參數,方法采用空的圓括號;如果有參數,就要在其中提供所有的相符合的參數。

          方法可以有返回值或沒有,有返回值必須要return語句。

          【例】Person類的使用。

          public class School {

                   public static void main(String[] args) {

                             Person p1 = new Person();

                             Person p2;

                             p2 = new Person();

                             p1.name = "Jack";

                             System.out.println("p1's name is "+p1.name);

                             p1.eat();

                             p2.work();

                   }

          }

          2、構造方法

          用來構造對象的方法;在創建類的實例的時候對對象的一些成員變量進行初始化。告知系統去如何創建一個符合要求的對象。

          修飾符類名([參數[,參數]]){

                   初始代碼塊;

          }

          構造方法名字與所在類相同,無返回值;如果沒有構造方法,系統會有一個默認的構造方法;只要定義了一個構造方法,系統就不會再分配默認的構造方法了。

          可以有多個構造方法,但是這些構造方法的參數類型或參數列表要不同。此時發生了方法的重載。

          【例】使用構造方法為Person_c類的對象賦值。

          public class Person_c {

                   String name;

                   int age;

                   Person_c(String n,int a){

                             name = n;

                             age = a;

                   }

                   public void eat(){

                             System.out.println("eat...");

                   }

                   public void work(){

                             System.out.println("work...");

                   }

          }

          public class School {

                   public static void main(String[] args) {

                             Person_c p1 = new Person_c("Jack“,18);

                             Person p2 = new Person_c(“steven“,25);

          System.out.println("p1's name is "+p1.name);

                             System.out.println("p1's age is "+p2.age);

                             p1.eat();

                             p2.work();

                   }

          }

          3.3 成員變量和成員方法

          3.3.1成員變量的聲明

          [<修飾符>] [static] [final] [transient] <類型> <變量名>;

          static變量為類變量;無static的變量為實例變量;

          final變量為常量;

          transient變量為臨時變量;

          類的成員變量獨立與方法,在類主體中但不在方法體中,在方法體中的是方法的局部變量。

          3.3.2成員方法的定義與實現

          成員方法的聲明包括方法聲明和方法體:

          [<修飾符>] <返回值類型> <方法名>([參數列表])[throws <異常類>]{

                       <方法體>

          }

          方法中必須要給出方法的返回值,如果沒有返回值,返回類型為void,方法后可以跟0個或多個參數;如果沒有參數也要跟空的圓括號。

          方法體內可以定義變量,稱為局部變量;生命周期只在此方法體內。不支持全局變量。

          通過類的成員的訪問修飾符,來達到對類的成員的控制。

          3.3.3類的封裝

          權限修飾

          同一類

          同一包

          不同包的子類

          所有類

          public

          protected

          默認

          private

          公有的:可以被所有的類的對象使用。

          保護的:被同一類中的其他成員、子類的成員、同一包中的其他類訪問。不能被其他包中的非子類訪問。

          默認的:只能被同一包中的其他類和同一類中的其他成員訪問。

          私有的:只能被同一類中的成員訪問。不能被其他類和其子類訪問。

          3.3.4實例成員和類成員

          1、實例變量和類變量

          不使用static修飾的變量為實例變量,創建類的對象會為對象的實例變量分配內存單元。

          使用static修飾的變量稱為類變量或靜態變量,只為該類的第一對象分配內存單元,其后所有創建的對象共享這一變量。

          2、實例方法和類方法

          不使用static修飾的方法為實例方法,實例方法可以訪問類變量,也可以訪問實例變量。只能通過對象名調用。

          使用static修飾的方法稱為類方法或靜態方法,類方法只能訪問類變量。不能訪問實例變量,類方法既可以通過類名調用,也可以通過對象名來調用。

          【例】實例成員與類成員的應用。

          public class Person_s {

                   String name;

                   static int age;

                   Person_c(String n,int a){

                             name = n;

                             age = a;

                   }

                   public static void printAge(){

                             System.out.println(age);

                   }

                   public void printName(){

                             System.out.println(name);

                   }

          }

          public class School {

                   public static void main(String[] args) {

                             Person_s p1 = new Person_s("Jack“,18);

                             Person p2 = new Person_s(“steven“,25);

          p1.printAge();

                             p2.printName();

                             Person_s.printAge();

                             //Person_s.printName(); //報錯

                   }

          }

          3.4 類的繼承和多態

          3.4.1類的繼承

          1、繼承的概念

          由已知的類創建新類,新類在原有的類的基礎上擴展了功能。通過繼承機制,子類能復用父類的代碼,同時又允許子類添加自己特有的變量和方法,這樣減少了代碼的重復,提高了代碼的質量和可靠性。

          由繼承得到的新類稱為子類,被繼承的類稱為超類(父類)。

          2、實現類的繼承

              [<修飾>] class <子類名> extends <父類名>

          Ø       繼承的原則:

          子類繼承父類的實例成員和類成員(變量和方法);

          子類不能繼承父類的構造方法,但可以調用父類的構造方法;

          子類可以增加自己的成員。子類中聲明了和父類同名同參的方法或變量,則發生了覆蓋;

          子類重新定義父類的成員方法,則發生了重載;

          子類不能刪除父類的成員。

          子類對父類成員的訪問原則:

          子類不能訪問父類中private的成員;

          子類可以訪問父類中publicprotected的成員;

          子類可以訪問同一包中父類的默認權限的成員;

          子類不能訪問不同包中父類具有默認權限的成員。

          Ø       thissuper的使用方法:

          Java中,this用來代表當前正在操作的對象。通過this變量可以引用當前對象的成員變量和方法。

          在當前對象內調用:this.成員

          Java中,super用來代表父類。通過super可以引用被子類覆蓋的成員:

          super.成員

          注意:Java不支持多繼承,即子類只能有一個父類。

          3.4.2類的多態

          多態是指一個標識符具有多種語義。

          1、方法的重載

          同一個類中具有許多同名不同參數列表的方法。

          要求:

          參數必須不同:個數不同或類型不同或二者都不同;

          返回值可以相同也可以不同。

          2、方法的覆蓋

          子類與父類的方法同名同參時,此時子類的方法不能繼承父類的該方法,子類的方法覆蓋了父類的方法。

          要求:

          子類不能覆蓋父類中聲明為finalstatic的方法;

          子類必須覆蓋父類中的abstract的方法,或者子類也聲明為abstract

          3.4.3最終類和抽象類

          1、最終類

          不能被繼承(不能有子類)的類,使用final來修飾這個類。

          如果想保護類中的方法不被子類覆蓋,可以用final修飾這個方法為最終方法。

          使用final修飾的變量為常量。

          2、抽象類

          使用abstract修飾的類為抽象類。

          抽象類不能實例化。(不能創建抽象類的對象)

          抽象類的子類必須實現父類中所有的抽象方法,或者將自己也定義為抽象的。

          一個類不能既是抽象類又是最終類。

          通過設定方法為抽象方法可以保證該方法在子類中的覆蓋(實現),抽象方法只有方法聲明而沒有方法體。

          抽象方法不能是靜態方法,也不能是最終方法。而且必須在abstract的類中聲明。

          3.5 

          3.5.1引用java

          包是一種區別類名的機制,是類的組織形式。

              引用已經存在的包的兩中形式:

          1、前綴引用

          java.util.Date today=new java.util.Date();

          2、使用import語句

          import java.util.*;

          3.5.2自定義java

          1、包的定義

              package 包名;

              package 包名1.包名2;

          2、設置包的路徑

          設置包所在的文件夾,建立包等級,每一個包對應一個文件夾,并且報名與對應的文件夾名稱相同。

          并將包所在的路徑設置到classpath變量中。并修改編譯相應的源文件。

          3.6 接口和內部類

          3.6.1接口

          Java中接口與類有些類似,二者不同之處在于:

          接口中定義的變量都是final static類型的,而且接口中定義的方法都是抽象方法。

          Java中類的繼承不支持多重繼承,即一個類只能有一個父類,但是一個類卻可以繼承(實現)多個接口。因此,聲明一個類時不但可以繼承一個父類,同時還允許實現多個接口。這可理解為變相的多重繼承,彌補了Java的缺陷。

          1、接口的聲明

          與類的聲明相似,格式為:

          [ <修飾符>] interface <接口名> [ extends <接口名>]{

          常量聲明;

          抽象方法;

          }

          修飾符只有兩種情況:public和省略修飾符;

          常量全部隱含為finalstatic,必須設置初值;

          接口中的方法都是抽象方法,抽象方法是只有方法聲明而沒有方法體的。直接以分號結束。

          2、實現接口

          實現接口類似繼承,在定義類的時候用implements關鍵字來實現一個接口。

          class <類名> implements <接口名>

          如果一個類實現一個接口則必須實現接口中的所有方法(完成方法體),且方法必須聲明為public。如果確實沒有必要實現該方法,也需要將方法完成為空方法。

          Java運行多個類實現同一個接口,這些類之間可以是毫無關系的;且一個類可以實現多個接口。

          單重繼承與多重實現機制

          3.6.2內部類

          1、概念

          內部類就是在類的內部定義的類,可以為類的成員,也可以是方法中定義,還可以在表達式中定義。

          包含內部類的類稱為外部類。

          Ø       內部類的使用:

          用在定義他的語句中或語句塊中,也可以使用。

          可以使用類的成員,也可以使用其所在的方法的局部變量,可以定義為abstract

          若被聲明為static則成了頂層類,不能再使用局部變量

          如果內部類中有static 成員,則該內部類為static

          Ø       使用內部類的原因以及優缺點:

          在事件驅動的程序中經常的使用。

          3.6.2內部類的分類

          內部類的分類:

          非靜態成員內部類:作為外部類的成員

          靜態內部類:作為內部類的靜態成員

          局部內部類:在方法中定義的內部類

          匿名內部類:沒有名稱,只有類體的局部內部類

          3.6.3內部類的使用

          在外部類的外部和內部使用成員內部類:

          在外部類的外部和內部使用靜態內部類:

          在方法中定義和使用局部內部類:

          匿名內部類的使用:

          ·小結

          面向對象的特征

          繼承、多態的含義

          接口和抽象類的區別

          包的使用

          posted on 2010-03-19 10:50 libifeng 閱讀(356) 評論(0)  編輯  收藏 所屬分類: Java課件

          <2010年3月>
          28123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 菏泽市| 兴和县| 岚皋县| 旅游| 西乡县| 东乌珠穆沁旗| 太湖县| 河西区| 北流市| 沾益县| 玛曲县| 兴海县| 大洼县| 浠水县| 栾川县| 进贤县| 哈尔滨市| 晴隆县| 华阴市| 博罗县| 长泰县| 嘉义市| 金昌市| 资源县| 大洼县| 通海县| 舒城县| 安多县| 南京市| 米脂县| 德惠市| 资兴市| 黄大仙区| 永胜县| 探索| 渑池县| 佛冈县| 会理县| 平顺县| 武安市| 洞头县|