文章出處

Java OOP(二) 面向對象:Java語言是面向對象的,采用這種語言進行編程稱為面向對象編程。它允許設計者將面向對象設計實現為一個可運行的系統。Java的編程單位為類,對象需要通過類進行實例化(即創建)。

面向對象的編程有三大特性:封裝、繼承和多態。

封裝:以前我講過java是以類為基礎的,所有的屬性和方法都是封裝在類中的,不像C++在類外還可以定義函數。 多態:表面看是多種狀態的意思。(這里先不過多討論,下面會詳細討論) 繼承:不容置疑,從父親那里繼承什么家產、金錢或者產業什么的,運用到我們java中又是怎么回事呢?它又繼承哪些東東呢?

接下來我們就要對這三個特性進行詳細的分析,那么在java中我們一切是以類為基礎,當然這三個特性跟類是分不開的,那我們認識下java中的類。

2. 抽象數據類型(類就是模板)在C語言中,我們可以用struct 來表示一個類,不了解也不要緊。 在java中,我們用class 這個關鍵字來表示一個類,類是一個抽象的數據類型,那怎么抽象法呢? (思考一下我們之前講過的java中的類是怎么來的,類是具有相同屬性類型和行為的集合)3. 類和對象

面向對象的開發方法把軟件系統看成各種對象的集合,對象就是最小的子系統,一組相關的對象能夠組合成更復雜的子系統。面向對象的開發方法將軟件系統看成各種對象的集合,接近人的自然思維方式。

對象是對問題領域中事件的抽象。對象具有以下特性:

萬物皆為對象。問題領域中的實體和概念都可以抽象為對象。例如學生,成績單、教師、課和教室。 每個對象都是惟一的。正如世界上不存在一模一樣的數子(或者人)。

對象具有屬性和行為。

例如小張,性別女,年齡22,身高1.6m, 體重40kg, 能夠學習,唱歌。小張的屬性包括姓名、性別、年齡、身高和體重,行為包括學習、唱歌。

例如一部手機,牌子是諾基亞、價格是2000元,銀白色,能夠拍照、打電話和收發短信等。這部手機的屬性包括品牌類型type、價格price和顏色color,行為包括拍照takePhoto(),打電話call(),收發短信receiveMessage()和發短信sendMessage().

對象具有狀態。狀態是指某個瞬間對象的各個屬性的取值。對象的某些行為會改變對象自身的狀態,即屬性的取值。

例如小張本來體重為40kg,經為減肥后,體重減到45kg.

       肥胖狀態: 40kg              |              | 減肥行為              |                     肥胖狀態: 35kg 

每個對象都是某個類的實例。小張和小王都屬于學生類、中國和美國都屬于國家類、中文和英文都屬于語言類。

類是具有相同屬性和行為的對象的集合。

同一個類的所有實例都有相同屬性,但屬性取值不一事實上相同,但是它們的狀態不一定相同。例如小張和小王都屬于學生類,都有姓名、性別、年齡、身高和體重這些屬性,但是他們的屬性取值不同。

同一個類的所有實例都有相同行為,意味著它們具有一些相同的功能。

類是一組具有相同屬性和行為對象的模板。面向對象編程的主要任務就是定義對象模型中的各個類。

類是一種類型:是引用類型; 類是元數據: 描述數據的數據,因為數據在面向對象領域里以對象的形式存在,所以類是對象共有屬性和方法的抽象描述。

Java程序是各種對象相互交互作用、而不是類。舉例:

早上到公司上班,在電梯中碰到總經理我們會說,張總早或王總早,會不會說人早呀!

我們要看電視,是買臺電視機,而不是買制作電視機的模具;

在java中,類的申明和實現在同一時間,而且必須在一起,前面我們已經做過很多的例子。

在C++中,類的申明和實現可以被分開,(C++內有partical關鍵字)。不知道也沒有關系,這只是讓我們了解下兩者的區別。4. 類中方法的定義

接下來我們來看一下類中定義的方法的格式。具體格式如下所示:

修飾符 返回類型 方法名(參數列表)異常拋出類型{...}

必須有返回值,如果方法沒有返回值,必須用void申明返回類型。 構造器沒有返回類型,構造器加上了返回類型就變成了一個普通方法的聲明了。 方法的修飾符可以同時有多個(static final public 等)

注意: return_type:如果方法定義了返回類型,那么在方法體里面就必須出現return語句,而且返回的數據類型要和聲明一致,如果沒有返回類型的話(void),那么方法體里面可以寫return,也可以不寫return。當代碼執行了return語句,那么代碼就不往下執行了,直接退出這個方法并返回。

方法中定義的參數我們通常叫做形參,調用有參數的方法時,我們通常會傳遞一些實參給方法,那么在java中方法的參數是如何的傳遞呢?
(先思考形參和實參的區別,詳情見5.參數傳遞)

Class Test{    //temp是形參    public static void add(int temp){        .....    }}public Class TestClass{    public static void main(String []args){        //1是實參        Test.add(1);        // temp = 1;        int a = 10;        //a是實參        Test.add(a);        // temp = a;    }}
5. 參數傳遞

參數傳遞主要分為2種:

值傳遞:對于基本數據類型,參數通過值傳遞。(把實參的值復制一份再傳給形參) 引用傳遞:對于引用類型,參數通過引用(對象的引用)傳遞。(把實參引用中地址值復制一份再傳給形參)。 注意: 在函數內操作引用傳遞的數據,會導致原來的數據的值也會改變,二值傳遞不會這樣。 6. this關鍵字

在方法調用、參數傳遞過程中,極有可能出現參數名稱與實例變量名同時的情況。在一個方法內,可以定義和成員變量同名的局部變量或參數,此時成員變量被屏蔽。

實例1:區分成員變量和局部變量

作用1:區別成員變量和局部變量public class Student{  private String name;  public void setName(String name){    this.name = name;    System.out.print(name);    String name;    name = "tom";  }}  

實例2:調用當前對象的參數

public class Student{  private String name;  public void setName(String name){    this.name = name;  }  public void print(){    //表示調用當前類中的setName方法    this.setName("tom");    //setName("tom");    //在類中可以表示當前類的對象    System.out.println("this:"+this);  }  public static void main(String[] args){    Student s = new Student();    s.setName("tom");    System.out.println("s:"+s);  }}

實例3:

在類的構造器中用this關鍵字可以調用類的其他的構造器 this只能出現在構造函數代碼塊中的第一句(前提是this這個時候代表的是調用其他構造器) 由this調用的構造器不會再創建新的對象。(而僅僅是調用其中的方法而已。)
例如:public class Car{  private String name;  private double price;  public Car(){    //無參構造器中調用了一個參數的構造器    this("tom");  }  public Car(String name){    //一個參數的構造器中調用了倆個參數的構造器    this(name,100000);  }  public Car(String name,double price){    this.name = name;    this.price = price;  }}
7. 數據隱藏

這里說說的數據主要指的是類中的屬性

如何對屬性進行隱藏呢?

在前面封裝的屬性前面用private修飾,表示該屬性不能被其它類訪問和修改,它只能被本類訪問和修改,范圍限制在本類內。

java中封裝有兩個方面:

屬性的封裝 方法的封裝
public class Human{    private String name;    public String getName(){return name;}    public void setName(String name){this.name=name;}}
8. 封裝

對屬性的封裝
首先屬性可以被一下修飾符修飾:
public/protected/default/private(這四種修飾符可以修飾成員變量,也可以修飾方法)

“`
public String name;
protected String name;
private String name;
//這樣就是default
String name;

//這樣寫是錯的
default String name;

 注:  四種修飾符的作用之后會討論 對屬性的封裝:在屬性(實例變量)前加private, 然后通過統一的方法訪問以及修改這些屬性值;使用get/set方法來訪問類中被private修飾的屬性。 目的:這樣做的目的就是隱藏數據信息,保證數據的安全.2. 方法的封裝:(指的是用方法來封裝代碼)   * 站在使用的者的角度去考慮,用戶只關心方法的使用,不管里面到底怎么實現的細節.   * 從編程的角度去看的話:為了代碼的重用.

public class Test{
private boolean decide1(){}
private boolean decide2(){}
// 用戶只需了解有decide()方法 具體實現沒用必要
public boolean decide(){return decide1()&&decide2();}
}

#9. 方法重載(overload)  有時侯,類的同一種功能有多種實現方式,換句話說,有很多相同名稱的方法,參數不同。這給用戶對這種功能的調用使用提供了很大的靈活性。

例如:Test類中要求有倆個方法:
public void print(int i){
System.out.println(“i = “+i);
}

public void print(String s){
System.out.println(“s = “+s);
}

  對于類的方法(包括從父類中繼承的方法), 如果有兩個方法的方法名相同,但參數不一致,那么可以說,一個方法是另一個方法的重載方法。這種現象叫重載。  重載必須滿足以下條件:  1) 方法名稱相同。  2) 參數列表不同(參數類型、個數和順序)。  注意: 返回類型可以不相同。  在一個類中不允許定義兩個方法名相同,并且參數簽名也完全相同的方法。因為假如存在這樣的兩個方法,Java虛擬機在運行時就無法決定到底執行哪個方法。參數簽名是指參數的類型、個數和順序。返回值不相同不會導致方法重載。#10. 創建和初始化對象  按照前面講述的定義類的形式、定義方法的形式,構建好類了之后,程序要真實的運行,還是得通過對象的交互來完成。創建好了類,只是創建了構建對象的模板。接下來,我們可以通過new操作符,快速地構建出對象。使用new有以下作用有以下幾步:1. 為對象分配內存空間,將對象的實例變量自動初始化默認值;2. 如實例變量顯示初始化,將初始化值賦給實例變量(把默認值覆蓋掉);3. 調用構造方法;4. 返回對象的地址值;5. (注意:之后我們會把這個步驟再細分)#11. 構造方法也叫(構造器/構造函數/構造方法)1. 定義:  * 構造方法的名字和類的名字相同;  * 沒有返回類型,有返回類型的構造器就變成了普通方法。2. 調用時刻:  在創建對象的時候調用;  注意:是先創建對象,然后初始化對象中的屬性值,最后在調用構造器。3. 作用:    可以讓我們在創建對象的時候做一些對象中數據的初始化工作.(因為在new的后面就是寫的構造器)  new Student();  new Student("tom",age);4. 構造方法的調用:  構造方法只能通過以下方式被調用:  * 當前類的其他構造方法通過this語句調用它;  * 當前類的子類的構造方法通過super語句調用它;  * 在程序中通過new語句調用它;#12. 構造方法重載當通過new語句創建一個對象時,在不同的條件下,對象可能會有不同的初始化行為。例如:對于公司新來的一個雇員,在一開始的時侯,有可能他的姓名和年齡是未知的,也有可能僅僅他的姓名是已知的,也有可能姓名和年齡都是已知的。如果姓名是未知的,就暫且把姓名設為“無名氏”,如果年齡是未知的,就暫且把年齡設為-1. 可通過重載構造方法來表達對象的多種初始化行為。在一個類的多個構造方法中,可能會出現一些重復操作。為了 提高代碼的可重用性,Java語言允許在一個構造方法中,用this語句來調用另一個構造方法。使用this語句來調用其他構造方法時,必須遵守以下語法規則:1. 假如在一個構造方法中使用了this語句,那么它必須作為構造方法的第一條要執行的語句(不考慮注釋語句)。

public Employee() {
String name=”無名氏”;
this(name); //編譯錯誤,this語句必須作為第一條語句
}
public Employee(String name) {
String name=name;
}

2. 只能在一個構造方法中用this語句來調用類的其他構造方法,而不能在實例方法中用this語句來調用類的其他構造方法;3. 只能用this語句來調用其他構造方法,而不能通過方法名來直接調用構造方法。
public Employee() {Employee(name); //編譯錯誤,要使用this關鍵字來調用String name=”無名氏”;}public Employee(String name) {String name=name;}“`

看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170306/111347.html

文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()