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
文章列表