Java開發(fā) 編程思想+類+對象+方法(形參傳參可變參數(shù))簡單介紹【學(xué)習(xí)篇5】

【作者前言】:13年入圈,分享些本人工作中遇到的點(diǎn)點(diǎn)滴滴那些事兒,17年剛開始寫博客,高手勿噴!以分享交流為主,歡迎各路豪杰點(diǎn)評改進(jìn)!
{\color{#3f48cc}{\pmb{點(diǎn)擊右上角小【1】快速預(yù)覽本文內(nèi)容}}} [1]

??知識點(diǎn)內(nèi)容

??1. 編程思想 [2]

面向過程、 面向?qū)ο?/p>

自我理解層面:
面向過程:將一個任務(wù)進(jìn)行拆分,拆分成不同的步驟,然后按照步驟一步步的執(zhí)行,完成功能
面向?qū)ο?/code>:找對象,對象之間如何配合,完成功能
eg:
去上海旅游,你們怎么去?
面向?qū)ο?/code>:高鐵、飛機(jī) 找一個事物,能夠幫助我們運(yùn)輸過去
面向過程:自駕到天津-河北-山東-江蘇-上海,一直細(xì)化到出門左轉(zhuǎn)幾米,然后再右轉(zhuǎn)
對象:一切客觀存在的事物都是對象,萬物皆對象;
:是對象共性的抽象;是創(chuàng)建對象的模板
官方標(biāo)準(zhǔn)層面:
面向?qū)ο蟪绦蛟O(shè)計(jì):將數(shù)據(jù)及對數(shù)據(jù)的操作封裝在一起,成為一個不可分割的整體,同時將具有相同特征的對象抽象成一種新的數(shù)據(jù)類型 --- 類
通過對象間消息傳遞使整個系統(tǒng)運(yùn)轉(zhuǎn),通過類的繼承實(shí)現(xiàn)代碼重用

image.png

面向?qū)ο蟮木幊趟枷耄?code>使設(shè)計(jì)程序 編寫程序的過程清晰化,有利于將程序模塊化,可以組織比較大的團(tuán)隊(duì)開發(fā)程序,按模塊進(jìn)行分工

所謂面向?qū)ο蟮姆椒▽W(xué),就是使我們分析、設(shè)計(jì)和實(shí)現(xiàn)一個系統(tǒng)的方法,盡可能地接近我們認(rèn)識一個系統(tǒng)的方法。包括:
面向?qū)ο蟮姆治?OOA,Object-Oriented Analysis)
面向?qū)ο蟮脑O(shè)計(jì)(OOD,Object-Oriented Design)
面向?qū)ο蟮木幊?Object Oriented Programming) 以...為向?qū)У木幊?/code>

??2.抽象 [3]

面向?qū)ο笾械某橄笫前严到y(tǒng)中需要處理的數(shù)據(jù)和這些數(shù)據(jù)上的操作結(jié)合在一起,根據(jù)功能、性質(zhì)、作用等因素組成不通的數(shù)據(jù)類型。
抽象數(shù)據(jù)類型是進(jìn)一步設(shè)計(jì)、編程的基礎(chǔ)和依據(jù)。
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,抽象數(shù)據(jù)類型是用"類"來代表的

??3.Java語言特點(diǎn) [4]

Java具備描述對象以及對象之間關(guān)系的能力,因此是面向?qū)ο蟮木幊陶Z言。
Java語言的設(shè)計(jì)集中于對象及其接口,它提供了簡單的類機(jī)制以及動態(tài)的接口模型。
對象中封裝狀態(tài)變量以及相應(yīng)的方法,實(shí)現(xiàn)了模塊化和信息隱藏;
類則提供了一類對象的原型,并且通過繼承機(jī)制子類可以使用父類所提供的方法,實(shí)現(xiàn)了代碼的復(fù)用
面向?qū)ο笞钪匾娜筇卣魇牵?code>封裝、繼承、多態(tài)
。

??4.類和對象的說明 [5]

如果沒有事先準(zhǔn)備好的特征描述表,那么目擊者就無法準(zhǔn)確描述出嫌疑人的特征,而沒有屬性值的特征描述表是無法幫助警察找到嫌疑人的,因此可以看出:
在Java中萬事萬物皆對象
事實(shí)上,Java離完全的面向?qū)ο缶幊陶Z言還有最后的一小步距離,因?yàn)镴ava中存在基本數(shù)據(jù)類型,而后續(xù)以Java為目標(biāo)的語言如C#則真正實(shí)現(xiàn)了萬物皆對象,Java用包裝類型來應(yīng)對
對象依賴于類存在(模板-個體實(shí)例)
在程序中應(yīng)該使用的是對象
分析過程先有對象后有類;開發(fā)過程先有類后有對象
在之前的編碼過程中我們已經(jīng)看到:用Java編寫的所有代碼都位于某一個類的內(nèi)部
標(biāo)準(zhǔn)的Java庫提供了幾千個類,可以用于日期、日歷、網(wǎng)絡(luò)、IO等程序設(shè)計(jì)
我們需要在Java程序中創(chuàng)建一些自己的類,以便描述應(yīng)用程序中所對應(yīng)的問題領(lǐng)域中的對象
面向?qū)ο蟮囊粋€原則會讓用戶自定義類變得輕而易舉:可以通過擴(kuò)展一個類來建立另一個新的類
事實(shí)上,Java中所有的類都源自一個“神通廣大的超類”:Object,以后會對該類進(jìn)行詳細(xì)介紹
擴(kuò)展一個已有的類時,這個擴(kuò)展后的新類具有所擴(kuò)展的類的全部屬性和方法,在新類中只需提供適用于這個新類的新方法和數(shù)據(jù)即可,這稱為繼承,后續(xù)將會繼續(xù)詳細(xì)介紹

??5. 類的基本構(gòu)成元素 [6]

類是描述對象的“基本原型”,它定義一種對象所能擁有的數(shù)據(jù)和能完成的操作,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,類是程序的基本單元,最基本的類由一組結(jié)構(gòu)化的數(shù)據(jù)和在其上的一組操作構(gòu)成

一個更完整的類結(jié)構(gòu):


image.png

??6. 對象 [7]

類是同等對象的集合與抽象。它是一塊創(chuàng)建現(xiàn)實(shí)對象的模板。對象類的實(shí)例,對象是面向?qū)ο缶幊痰暮诵牟糠?,是?shí)際存在的具體實(shí)體,具有明確定義的狀態(tài)和行為
在程序中發(fā)揮對象的功效,需要了解對象的三個主要特征
對象的行為:可以對對象施加哪些操作,或可以對對象施加哪些方法
對象的狀態(tài):當(dāng)施加那些方法時,對象如何響應(yīng)
對象的標(biāo)識:如何辨別具有相同行為與狀態(tài)的不同對象
同一個類的所有對像實(shí)例,由于支持相同的行為而具有家族式的相似性。對象的行為是用可調(diào)用的方法定義的。
此外,每個對象都保存著描述當(dāng)前特征的信息-對象的狀態(tài),對象的狀態(tài)可能會隨著時間而發(fā)生改變,但這種改變不會是自發(fā)的對象狀態(tài)的改變必須通過調(diào)用方法實(shí)現(xiàn)如果不經(jīng)過方法調(diào)用就可以改變對像狀態(tài),只能說明封裝性遭到了破壞)。

??7. 封裝 [8]

封裝是與對象有關(guān)的一個重要概念
形式:將數(shù)據(jù)和行為組合在一起,并對對象的使用者隱藏?cái)?shù)據(jù)的實(shí)現(xiàn)方式
屬性由變量表示,屬性名稱由類的每個對象共享
每個特定的對象都有一組特定的實(shí)例屬性值,這些值的集合就是這個對象的當(dāng)前狀態(tài),只要向?qū)ο蟀l(fā)送一個消息,它的狀態(tài)就有可能發(fā)生改變
封裝的特性能夠讓服務(wù)提供者把它服務(wù)的細(xì)節(jié)隱藏掉,你只需要提交請求與傳遞它需要的參數(shù),它就會給你返回結(jié)果,而這個結(jié)果是如何產(chǎn)生的,經(jīng)過了多少復(fù)雜運(yùn)算,經(jīng)過多少次數(shù)據(jù)讀取,你都不用管,只要它給你結(jié)果就好了。
封裝使得對代碼的修改更加安全和容易,將代碼分成了一個個相對獨(dú)立的單元,對代碼訪問控制得越嚴(yán)格,日后你對代碼修改的自由就越大

eg:只要電話的外部接口(鍵盤,屏幕,使用方法等)不發(fā)生改變,那么不管電話內(nèi)部電路,技術(shù)如何改進(jìn),用戶都不需要重新學(xué)習(xí)就可以使用新一代的電話。同樣,只要汽車的方向盤,剎車等外部接口不變,那么,不論如何改造它的發(fā)動機(jī),用戶也一樣會駕駛這類汽車

  • 明確指出了哪些屬性和方法是外部可以訪問的。這樣當(dāng)需要調(diào)整這個類的代碼時,只要保證公有(public:)屬性不變,公有方法的參數(shù)和返回值類型不變,那么就可以盡情的修改這個類,而不會影響到程序的其他部分,或者是使用到這個類的其他程序
    能很好的使用別人的類,而不必關(guān)心其內(nèi)部邏輯是如何實(shí)現(xiàn)的,讓軟件協(xié)同開發(fā)的難度大大降低。

??8. 對象狀態(tài) [9]

對象的狀態(tài)并不能完全描述一個對象,每個對象都有一個唯一的身份。例如,在一個訂單處理系統(tǒng)中,任何兩個訂單都存在著不同之處,即使所訂購的貨物完全相同也是如此。需要注意,作為一個類的實(shí)例,每個對象的標(biāo)識永遠(yuǎn)是不同的。
一般情況下,對象的標(biāo)識可以由內(nèi)存地址確定(在非序列化等情況下),可以依據(jù)次確定對象的哈希值
狀態(tài)常常也存在著差異,對象的這些關(guān)鍵特性在彼此之間相互影響著

??9. 類的聲明形式 [10]
9.1語法

/*
*[訪問權(quán)限修飾符][修飾符] class 類名 {
    成員列表
}
*/
public native class Person {
    String name; // 名字
}

1、可選的類訪問權(quán)限修飾符限定本類能夠被哪些其他的代碼訪問,包括publicdefault(內(nèi)部類有更多選擇)以后將會有專門的部分詳細(xì)介紹
2、可選的修飾符說明當(dāng)前方法的特性,包括final、abstractnative等,也會有專門的博客對重要修飾符進(jìn)行詳細(xì)介紹
3、class 聲明的關(guān)鍵字,注意大小寫
4、需要符合Java標(biāo)識符的結(jié)構(gòu)要求
一個約定俗成的命名規(guī)則:類名的命名規(guī)則是首字母大寫,多個單詞時,每個單詞首字母大寫
5、包括成員變量和成員方法
6、類的名字由大寫字母開頭而單詞中的其他字母均為小寫;如果類名稱由多個單詞組成,則每個單詞的首字母均應(yīng)為大寫,把這些單詞連接在一起,即不要使用下劃線分割單詞,例如:OrderList
7、如果類名稱中包含單詞縮寫,則這個所寫詞的每個字母均應(yīng)大寫,如:XMLExample
8、由于類是設(shè)計(jì)用來代表對象的,所以在命名類時應(yīng)盡量選擇名詞。 如上例的: Bike

9.2成員變量

成員變量是類中的特有屬性變量
在類中聲明成員變量的格式
【變量修飾字】 變量數(shù)據(jù)類型 變量名1,變量名2【=變量初值】;...
成員變量的類型可以是Java中任意的數(shù)據(jù)類型,包括基本類型,類,接口,數(shù)組等
普通的成員屬性取值在該類的不同對象中不能被共享

image.png

Java中每個類型都有固定的初始值,如int的初始值是0,具體類型的初始值可以回顧學(xué)習(xí)數(shù)據(jù)類型時的內(nèi)容
在類中定義的成員變量可以不用顯示初始化為其提供取值即可使用,這時候成員變量的值為其類型的初始值
不管在任何地方,引用類型都需要初始化后才可使用,因?yàn)橐妙愋偷某跏贾禐閚ull,代表不具備存儲數(shù)據(jù)的內(nèi)存空間,直接使用會造成程序運(yùn)行異常

??10. 對象創(chuàng)建 [11]

對象是典型的引用數(shù)據(jù)類型,因此和數(shù)組相似,初始化時需要使用new運(yùn)算符從堆中分配內(nèi)存,步驟是:

說明新建對象所屬的類名
說明新建對象的名字
用new為新建對象開辟內(nèi)存空間

  • 創(chuàng)建對象的一般語法是:
    類名 引用名 = new 類名();
    使用已經(jīng)定義好的類,創(chuàng)建該類對象的過程稱為“實(shí)例化”
    new是“為新建對象開辟內(nèi)存空間”的運(yùn)算符;它以類為模板,開辟空間并實(shí)例化一個對象,返回對該對象的一個引用(即該對象所在的內(nèi)存地址)

??11. 作用域 [12]

正如之前的博客中所說,Java中,變量作用域由花括號的位置決定
通過new構(gòu)建的Java對象不具備和基本類型一樣的生命周期。當(dāng)用new創(chuàng)建一個Java對象時,它可以存活于作用域之外。
所以編寫用代碼:
{
String companyName=new String(“chinasofti”);
}
引用companyName在作用域終點(diǎn)就消失了,然而, companyName指向的String對象仍繼續(xù)占據(jù)內(nèi)存空間。在這一小段代碼中,無法在這個作用域之后訪問這個對象,因?yàn)閷λㄒ坏囊靡殉隽俗饔糜虻姆秶?,在后繼章節(jié)中,我們將會看到在程序執(zhí)行過程中,怎樣傳遞和復(fù)制對象引用。

???思考???:由new創(chuàng)建的對象,只要需要,就會一直保留下去。如果Java讓對象繼續(xù)存在,那么靠什么才能防止這些對象填滿內(nèi)存空間,進(jìn)而阻塞你的程序呢?

答:
Java有一個垃圾回收器,用來監(jiān)視用new創(chuàng)建的所有對象,并辨別那些不會再被引用的對象。隨后,釋放這些對象的內(nèi)存空間,以便供其他新的對象使用。也就是說,你根本不必?fù)?dān)心內(nèi)存回收的問題。你只需要創(chuàng)建對象,一旦不再需要,它們就會自行消失。這樣做就消除了這類編程問題(即“內(nèi)存泄漏”),這是由于程序員忘記釋放內(nèi)存而產(chǎn)生的問題。
需要注意的是,垃圾回收其實(shí)并不能完全防止內(nèi)存泄露,后續(xù)我們將會詳細(xì)介紹垃圾回收機(jī)制并說明可能會導(dǎo)致Java內(nèi)存泄露的情況

??12. 如何訪問成員? [13]

java中實(shí)例化類的對象之后,就可以訪問到類中的成員
使用成員運(yùn)算符(.)來訪問成員,一般語法是:對象名.成員名
例如:student.age=18;

??13. 成員方法 [14]
13.1 概念
成員方法是類中進(jìn)行數(shù)據(jù)處理,實(shí)現(xiàn)相關(guān)功能的函數(shù)
13.2 語法
方法決定了一個對象能夠接收什么樣的消息。方法的基本組成部分包括:名稱、參數(shù)、返回值和方法體。下面是它的基本聲明形式:

【訪問控制】【方法修飾】 返回類型  方法名稱(參數(shù)1,參數(shù)2,…) {
       …(statements;)    //方法體:方法的內(nèi)容
}

返回類型可以是任意的Java數(shù)據(jù)類型,當(dāng)一個方法不需要返回值時,返回類型為void。

image.png

13.3 方法的語法組成部分說明

返回類型描述的是在調(diào)用方法之后計(jì)算的結(jié)果并告知調(diào)用者的值
參數(shù)列表給出了要傳給方法的信息的類型和名稱
方法名和參數(shù)列表(它們合起來被稱為“方法簽名”)唯一地標(biāo)識出某個方法
Java中的方法只能作為類的一部分來創(chuàng)建
方法只有通過對象才能被調(diào)用(后續(xù)介紹的static方法除外),且這個對象必須能執(zhí)行這個方法調(diào)用,如果試圖在某個對象上調(diào)用它并不具備的方法,那么在編譯時就會得到一個錯誤

13.4 方法的特點(diǎn)

定義方法可以將功能代碼進(jìn)行封裝。
便于該功能進(jìn)行復(fù)用。
方法只有被調(diào)用才會被執(zhí)行。
方法的出現(xiàn)提高代碼的復(fù)用性。
方法若沒有返回值,則用關(guān)鍵字void表示,那么該方法中的return語句如果在最后一行可以省略不寫。
方法中可以調(diào)用方法,不可以在方法內(nèi)部定義方法。
定義方法時,方法的結(jié)果應(yīng)返回給調(diào)用者,交由調(diào)用者來處理

13.5 方法的參數(shù)

1、一個參數(shù) 方法名稱(數(shù)據(jù)類型 變量名)
2、多個參數(shù) 方法名稱(數(shù)據(jù)類型 變量名1,數(shù)據(jù)類型 變量名2 ,....)


image.png

image.png

13.6 Return

方法聲明中有一個重要的關(guān)鍵字 --- Return
return的用法包括兩方面:

代表“已經(jīng)做完,離開此方法”
如果此方法產(chǎn)生了一個值,這個值要放在return語句后面

  • 可以定義方法返回任意想要的類型,如果不想返回任何值,可以指示此方法返回void(空)
    image.png

13.7 定義在方法中的局部變量和類的成員變量之間存在一些差異

image.png

13.8 方法調(diào)用

成員方法也使用成員運(yùn)算符(.)來調(diào)用
同一個類中的方法在本對象中調(diào)用其他方法直接使用方法名(static方法后續(xù)探討)

13.9 方法的命名

方法的名字的第一個單詞應(yīng)以小寫字母作為開頭,后面的單詞則用大寫字母開頭,例如: sendMessge
參數(shù)的命名規(guī)范和方法的命名規(guī)范相同,而且為了避免閱讀程序時造成迷惑,應(yīng)該在盡量保證參數(shù)名稱為一個單詞的情況下使參數(shù)的命名盡可能明確

??14. 可變API 與 不可變API[15]

在Java中,可供調(diào)用的API從執(zhí)行后的內(nèi)存狀態(tài)的角度可以從邏輯上劃分為兩種類型:
可變API
在給定的既有內(nèi)存上進(jìn)行操作的API
不可變API
執(zhí)行時需要新分配一段內(nèi)存后再執(zhí)行操作的API
我們看到的new運(yùn)算符是一個最典型的不可變API,因?yàn)槠涔δ芫褪菫橐粋€新對象分配新的內(nèi)存空間
根據(jù)可變API和不可變API的邏輯約定,可以發(fā)現(xiàn),Java中的字符串不具備任何的可變API,因?yàn)獒槍ψ址M(jìn)行的任何改變都是構(gòu)建了一個新的字符串對象
eg:
String s=”abcd”; s+=”e”; s”abcde” 不是在abcd的原有內(nèi)容空間上進(jìn)行添加的,而是創(chuàng)建了一個新的內(nèi)存空間 存儲的”abcde”

??15. Java中傳遞參數(shù)的特性 [16]

Java中的參數(shù)只有值傳遞
傳統(tǒng)印象中基本數(shù)據(jù)類型和字符串傳參時是值傳遞,其他對象傳參是引用傳遞的思想是錯誤的

  • 基本數(shù)據(jù)類型 參數(shù)傳遞過程:


    image.png
  • 引用類型 參數(shù)傳遞過程:


    image.png

    image.png

??16. 形參和實(shí)參 [17]

形參就是一個普通的臨時變量,位置特殊只是為了跳出方法體的作用域以便能夠獲取實(shí)參值
從上面一條可以看出,形參絕對不是初學(xué)者所理解的占位符
方法體中的代碼操作的是形參變量,和實(shí)參無關(guān),只不過由于需要借助于實(shí)參的數(shù)據(jù)值,因此在執(zhí)行方法第一條語句之前,隱式按照參數(shù)的位置關(guān)系利用實(shí)參對相應(yīng)位置的形參進(jìn)行了賦值操作
由此可以得出一個重要的結(jié)論:
當(dāng)方法中的形參在沒有調(diào)用不可變API之前,形參的任何改變都將影響實(shí)參的狀態(tài),而當(dāng)形參執(zhí)行了任何不可變API之后,形參和實(shí)參之間就斷開了這種狀態(tài)聯(lián)系

image.png

??17. 可變參數(shù) [18]

有過C語言學(xué)習(xí)經(jīng)歷的同學(xué)可能對其中的標(biāo)準(zhǔn)輸出函數(shù)printf()非常熟悉,這個函數(shù)有個特點(diǎn),提供格式字符串后,根據(jù)格式字符串中的占位符,后面可以根據(jù)占位符的個數(shù)提供不同的數(shù)據(jù)變量以供輸出,這種函數(shù)的參數(shù)稱為:可變參數(shù)
Java1.5增加了可變參數(shù)特性,適用于參數(shù)個數(shù)不確定,類型確定的情況
Java把可變參數(shù)當(dāng)做數(shù)組處理
可變參數(shù)必須位于最后一項(xiàng)。當(dāng)可變參數(shù)個數(shù)多余一個時,必將有一個不是最后一項(xiàng),所以只支持有一個可變參數(shù)。因?yàn)閰?shù)個數(shù)不定,所以當(dāng)其后邊還有相同類型參數(shù)時,java無法區(qū)分傳入的參數(shù)屬于前一個可變參數(shù)還是后邊的參數(shù),所以只能讓可變參數(shù)位于最后一項(xiàng)
可變參數(shù)用...代替標(biāo)識, ...位于變量類型和變量名之間,前后有無空格都可以
用可變參數(shù)的方法時,編譯器為該可變參數(shù)隱含創(chuàng)建一個數(shù)組,在方法體中以數(shù)組的形式訪問可變參數(shù)
eg:

image.png

??18. 遞歸 [19]

在程序設(shè)計(jì)中,方法直接或者間接調(diào)用其自身的方法叫做遞歸調(diào)用,簡稱遞歸,其設(shè)計(jì)方法被應(yīng)用到很多特殊問題的解決上
遞歸要點(diǎn):
每次遞歸調(diào)用都要使問題簡單化
當(dāng)遞歸達(dá)到某種程度后能夠的到一個已知解以結(jié)束遞歸調(diào)用
eg:

image.png


??2.應(yīng)用場景:


??3.實(shí)現(xiàn)目標(biāo):


??4.代碼實(shí)現(xiàn):




  1. ??【知識點(diǎn)回顧·簡介】 ↓↓↓

    ?
  2. ??[編程思想] ?

  3. ??[抽象] ?

  4. ??[Java語言特點(diǎn)] ?

  5. ??[類和對象的說明] ?

  6. ??[類的基本構(gòu)成元素] ?

  7. ??[對象] ?

  8. ??[封裝] ?

  9. ??[對象狀態(tài)] ?

  10. ??[類的聲明形式] ?

  11. ??[對象創(chuàng)建] ?

  12. ??[作用域] ?

  13. ??[如何訪問成員] ?

  14. ??[成員方法] ?

  15. ??[可變API 與 不可變API] ?

  16. ??[Java中傳遞參數(shù)的特性] ?

  17. ??[形參和實(shí)參] ?

  18. ??[可變參數(shù)] ?

  19. ??[遞歸] ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容