国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java基礎(chǔ)(五)OOP面向?qū)ο笾?二) 面向?qū)ο笏枷刖C述

2019-11-06 06:56:04
字體:
供稿:網(wǎng)友

java基礎(chǔ)(五)OOP面向?qū)ο笾?二) 面向?qū)ο笏枷刖C述

1. OOP中的基本概念

Java語言是面向?qū)ο蟮模捎眠@種語言進(jìn)行編程稱為面向?qū)ο缶幊?Object-Oriented PRogramming, OOP)。它允許設(shè)計者將面向?qū)ο笤O(shè)計實現(xiàn)為一個可運行的系統(tǒng)。Java的編程單位為類,對象需要通過類進(jìn)行實例化(即創(chuàng)建)。

面向?qū)ο蟮木幊逃腥筇匦?封裝、繼承和多態(tài)。

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

接下來我們就要對這三個特性進(jìn)行詳細(xì)的分析,那么在java中我們一切是以類為基礎(chǔ),當(dāng)然這三個特性跟類是分不開的,那我們認(rèn)識下java中的類。

2. 抽象數(shù)據(jù)類型(類就是模板)

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

3. 類和對象

面向?qū)ο蟮拈_發(fā)方法把軟件系統(tǒng)看成各種對象的集合,對象就是最小的子系統(tǒng),一組相關(guān)的對象能夠組合成更復(fù)雜的子系統(tǒng)。面向?qū)ο蟮拈_發(fā)方法將軟件系統(tǒng)看成各種對象的集合,接近人的自然思維方式。

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

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

對象具有屬性和行為。

例如小張,性別女,年齡22,身高1.6m, 體重40kg, 能夠?qū)W習(xí),唱歌。小張的屬性包括姓名、性別、年齡、身高和體重,行為包括學(xué)習(xí)、唱歌。

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

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

例如小張本來體重為40kg,經(jīng)為減肥后,體重減到45kg.

肥胖狀態(tài): 40kg | | 減肥行為 | 肥胖狀態(tài): 35kg

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

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

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

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

類是一組具有相同屬性和行為對象的模板。面向?qū)ο缶幊痰闹饕蝿?wù)就是定義對象模型中的各個類。

類是一種類型:是引用類型;類是元數(shù)據(jù): 描述數(shù)據(jù)的數(shù)據(jù),因為數(shù)據(jù)在面向?qū)ο箢I(lǐng)域里以對象的形式存在,所以類是對象共有屬性和方法的抽象描述。

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

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

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

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

在C++中,類的申明和實現(xiàn)可以被分開,(C++內(nèi)有partical關(guān)鍵字)。不知道也沒有關(guān)系,這只是讓我們了解下兩者的區(qū)別。

4. 類中方法的定義

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

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

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

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

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

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. 參數(shù)傳遞

參數(shù)傳遞主要分為2種:

值傳遞:對于基本數(shù)據(jù)類型,參數(shù)通過值傳遞。(把實參的值復(fù)制一份再傳給形參)引用傳遞:對于引用類型,參數(shù)通過引用(對象的引用)傳遞。(把實參引用中地址值復(fù)制一份再傳給形參)。注意: 在函數(shù)內(nèi)操作引用傳遞的數(shù)據(jù),會導(dǎo)致原來的數(shù)據(jù)的值也會改變,二值傳遞不會這樣。

6. this關(guān)鍵字

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

實例1:區(qū)分成員變量和局部變量

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

實例2:調(diào)用當(dāng)前對象的參數(shù)

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

實例3:

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

7. 數(shù)據(jù)隱藏

這里說說的數(shù)據(jù)主要指的是類中的屬性

如何對屬性進(jìn)行隱藏呢?

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

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, 然后通過統(tǒng)一的方法訪問以及修改這些屬性值;使用get/set方法來訪問類中被private修飾的屬性。 目的:這樣做的目的就是隱藏數(shù)據(jù)信息,保證數(shù)據(jù)的安全.2. 方法的封裝:(指的是用方法來封裝代碼) * 站在使用的者的角度去考慮,用戶只關(guān)心方法的使用,不管里面到底怎么實現(xiàn)的細(xì)節(jié). * 從編程的角度去看的話:為了代碼的重用.

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

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

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

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

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

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

2. 只能在一個構(gòu)造方法中用this語句來調(diào)用類的其他構(gòu)造方法,而不能在實例方法中用this語句來調(diào)用類的其他構(gòu)造方法;3. 只能用this語句來調(diào)用其他構(gòu)造方法,而不能通過方法名來直接調(diào)用構(gòu)造方法。

public Employee() { Employee(name); //編譯錯誤,要使用this關(guān)鍵字來調(diào)用 String name=”無名氏”; } public Employee(String name) { String name=name; } “`


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 平顶山市| 民丰县| 永福县| 临颍县| 雅安市| 房产| 隆德县| 南江县| 苏州市| 铁岭市| 错那县| 友谊县| 布拖县| 家居| 永清县| 通城县| 阳朔县| 罗平县| 循化| 奈曼旗| 陵水| 措勤县| 武夷山市| 蓬莱市| 青田县| 元江| 独山县| 德兴市| 禄劝| 缙云县| 惠东县| 惠安县| 武义县| 美姑县| 余庆县| 灵台县| 芦山县| 鄢陵县| 湖州市| 定兴县| 晋宁县|