摘要:第一章面向對象小白是一門完全面向對象的編程語言嗯什么是面向過程什么又是面向對象呢大佬在我們正式進入學習這部分前,了解一下面向過程和面向對象這兩個概念,對于我們接下來的學習有很大的好處。這一部分我們會在面向對象學習結束后進行系統的整理和總結。
第一章 面向對象
小白:Java是一門完全面向對象的編程語言!嗯?什么是面向過程?什么又是面向對象呢?面向過程——步驟化大佬:在我們正式進入學習這部分前,了解一下面向過程和面向對象這兩個概念,對于我們 接下來的學習有很大的好處。別急,下面我就來和你說一說。
面向過程就是分析出實現需求所需要的步驟,通過函數一步一步實現這些步驟,接著依次調用即可
面向對象——行為化面向對象是把整個需求按照特點、功能劃分,將這些存在共性的部分封裝成對象,創建了對象不是為了完成某一個步驟,而是描述某個事物在解決問題的步驟中的行為
小白:面向過程還挺明白的,面向對象也太難理解了吧(哭了)桌球實例-幫助理解大佬:我再來舉個例子再給你好好說一說
我們先提出一個需求:
設計一個桌球游戲(略過開球,只考慮中間過程)
面向過程方式思考:1.palyer1 擊球
2.實現畫面擊球效果
3.判斷是否進球及有效
4.palyer2擊球
5.實現畫面擊球效果
6.判斷是否進球及有效
7.返回步驟1
8.輸出游戲結果
把上面的步驟通過函數一步一步實現,這個需求就完成了。
面向對象方式思考:經過觀察我們可以看到,其實在上面的流程中存在很多共性的地方
所以我們將這些共性部分全集中起來,做成一個通用的結構
玩家系統(包括palyer1和palyer2)
擊球效果系統,負責展示給用戶游戲時的畫面
規則系統,判斷是否犯規,輸贏等
我們將繁瑣的步驟,通過行為、功能,模塊化,這就是面向對象,我們甚至可以利用該程序,分別快速實現8球和斯諾克的不同游戲(只需要修改規則即可,玩家系統,擊球效果系統都是一致的)
面向過程和面向對象的優缺點: 面向過程優點:性能上它是優于面向對象的**,因為類在調用的時候需要實例化,開銷過大。
缺點:不易維護、復用、擴展**
用途:單片機、嵌入式開發、Linux/Unix等對性能要求較高的地方
面向對象優點:易維護、易復用、易擴展,由于面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易于維護
缺點:性能比面向過程低
低耦合,簡單的理解就是說,模塊與模塊之間盡可能的獨立,兩者之間的關系盡可能簡單,盡量使其獨立的完成成一些子功能,這避免了牽一發而動全身的問題。這一部分我們會在面向對象學習結束后進行系統的整理和總結。
只通過教科書后的例題是無法體會到面向過程所存在的問題的,在一些小例程中,面向過程感覺反而會更加的簡單,但是一旦面臨較大的項目,我們需要編寫N個功能相似的函數,函數越來越多,代碼量越來越多,Bug之路也就此開始了。
1.1 類和對象面向對象的思想是如何在java展現的呢? 就是通過類和對象
類是一組相關的屬性和行為的集合。是一個抽象的概念。
對象是該類事物的具體表現形式。具體存在的個體。
成員變量事物的屬性
成員方法事物的行為
上面我們說了這幾個概念,那么到底應該怎么理解呢?
類就是對一些具有共性特征,并且行為相似的個體的描述。
比如小李和老張都有姓名、年齡、身高、體重等一些屬性,并且兩人都能夠進行聊天、運動等相似的行為。
由于這兩個人具有這些共性的地方,所以我們把它抽象出來,定義為一個類——人類,而小李、老王正是這個類中的個體(對象),而個體才是真正具體的存在,光提到人類,你只知道應該有哪些屬性行為,但你不知道他具體的一些值,比如你知道他屬于“人類”所以他應該有姓名,年齡等屬性,但你并不知道他具體叫什么,年齡多大了。而小李和老王這兩個具體的對象,卻能夠實實在在的知道老王今年30歲了、身高175等值。
結合上面的例子再總結一下:
成員變量就是用來描述這個類的屬性的,比如人類應該擁有姓名,年齡等屬性
成員方法就是用來描述事物的行為的,比如人類能夠聊天、運動等行為
1.1_1 類的定義及使用我們了解了類和對象的基本定義和概念
下面我們就通過一個實例 來了解到底如定義一個類
A:類的定義
成員變量:定義格式和普通變量一樣,只是位置不同,在類中,方法外。
成員方法:定義格式和普通方法一樣,只是去掉了static(后期講解原因)
B:創建并且使用類
a:創建對象格式
類名 對象名 = new 類名();
Eg:Person p = new Person();
b:如何使用成員變量和成員方法呢
對象名.成員變量
對象名.成員方法()
Eg:p.reading();
p.sleeping();
其實我們可以看出來,類的定義還是很簡單的,結合了我們前面的知識,只是一些位置上的不同罷了,至于創建對象格式中每部分的意義我們在下面馬上就要講解了(我們還需要補充一些知識點)
我們先來看這么一個話題
經常聽說有一個詞叫做局部變量,它和類中的成員變量有什么關系嗎?
1.1_2 成員變量和局部變量的區別:(1)在類中的位置不同
成員變量:類中方法外
局部變量:方法定義中或者方法聲明上
(2)在內存中的位置不同
成員變量:在堆中
局部變量:在棧中
(3)生命周期不同
成員變量:隨著對象的創建而存在,隨著對象的消失而消失
局部變量:隨著方法的調用而存在,隨著方法的調用完畢而消失
(4)初始化值不同
成員變量:有默認值(下面會詳講這一點)
局部變量:沒有默認值,必須定義,賦值,然后才能使用
關于初始化問題我們在下面詳細講解,但是我現在還有一個問題,在我們學習java中內存分配的時候,有這樣一>句話,“堆內存用來存放new創建的對象和數組” 換句話說對象存在于堆中,而成員變量存在于類中而且對象是類>的個體,所以成員變量也存在于堆中,那么問題就來了,按照同樣的方式推導的時候,則會發現方法也和成員變>量一樣存在于對象中,豈不就是說,局部變量也存在于堆中呢? 這明顯與我們上面的定義有區別1.1_3 形式參數的問題:一個類可以創建n個不同的對象,當我們new一個對象后,這個對象實體,已經在堆上分配了內存空間,由于類>的成員變量在不同的對象中各不相同(例如,小李和老王的姓名不同),都需要自己各自的存儲空間,所以類的成員變量會隨著對象存儲在堆中,而由于類的方法是所有對象通用的,所以創建對象時,方法里面的局部變量并沒有被創建,只有等到對象使用方法的時候才會被壓入棧。
我們知道堆中存放著new出來的對象以及數組,兩者均為引用類型
在講數組的相關知識的時候,我們已經講過了基本類型和數組這一種引用類型,形式參數對實際參數的影響
跳轉—第三章 3.3_1參數傳遞問題
在我們學習對象后,我們繼續來看一下這個問題
基本類型:形式參數的改變不影響實際參數(值傳遞)
引用類型:形式參數的改變直接影響實際參數(引用傳遞)
我們先來了解一下如何創建匿名對象
(1)簡單的理解就是:沒有名字的對象
(2)應用場景
A:調用方法,僅僅只調用一次的時候。
B:可以作為實際參數傳遞
好處:匿名對象調用完就是垃圾,可以被垃圾回收器回收,并且這樣寫比較簡化。
注意:如果對一個對象的多個成員進行調用,就必須給這個對象起名字(即上圖中的 s),即使用普通創建對象的方法
我們下面來看一個實例來看一下如何具體使用匿名對象
1.1_5 封裝的概述和使用
首先我們先來簡單舉一個例子:
例如:夏天宿舍很熱,我們(用戶)只需要操作遙控器即可使用空調,并不需要了解空調內部是如何運行的
現在由于知識掌握較少,所以對于封裝的概念理解不是很深,不要著急,先過一遍,針對封裝的意義及問題我會寫一篇具體的文章,現在只需要有一個印象即可。
封裝概述:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式
封裝好處:
· 隱藏實現細節,提供公共的訪問方式
· 提高了代碼的復用性
· 提高安全性
封裝原則:
· 將不需要對外提供的內容都隱藏起來
· 把屬性隱藏,提供公共方法對其訪問
思考過程:
通過對象去給成員變量賦值,可以賦值一些非法的數據
這是不合理的。所以在賦值之前應該先對數據進行判斷
StudenDemo是一個測試類,測試類一般只創建對象,調用方法
所以這個判斷應該定義在Student類中。需要使用邏輯語句
邏輯語句應該定義在方法中。所以在Student類中提供一個方法來對數據進行校驗
但是如果偏偏不調用方法來賦值,還是直接賦值
這樣我們的方法就沒有起作用
所以我們必須強制要求使用我的方法,而不能直接調用成員變量
針對這種情況 Java提供了一個關鍵字 private
Private:私有的,可以修飾成員變量和成員方法
被private修飾的成員只能在本類中訪問,所以外界想要操作類中的成員變量就必須通過調用類中的方法來實現
1.1_6 訪問修飾符
客戶端程序員:即在其應用中使用數據類型的類消費者,他的目標是收集各種用來實現快速應用開發的類。
類創建者:即創建新數據類型的程序員,目標是構建類。
訪問控制存在的原因:
a、讓客戶端程序員無法觸及他們不應該觸及的部分 ;
b、允許庫設計者可以改變類內部的工作方式而不用擔心會影響到客戶端程序員
java的四個關鍵字:public、protected、default、private
(他們決定了緊跟其后被定義的東西可以被誰使用)
適用范圍<訪問權限范圍越小,安全性越高>
訪問權限 | 類 | 包 | 子類 | 其他包 | |
---|---|---|---|---|---|
public | √ | √ | √ | √ | 對任何人都是可用的 |
protect | √ | √ | √ | 繼承的類可以訪問以及和private一樣的權限 | |
default | √ | √ | 繼承的類可以訪問以及和private一樣的權限 | ||
private | √ | 除類型創建者和類型的內部方法之外的任何人都不能訪問的元素 |
可用this關鍵字進行完善(一般都是使用完善后的)
this的內容在下面馬上介紹
1.1_8 this關鍵字的概述和應用
這里的調用只能通過對象名,這里它應該代表的是student的一個對象
this:代表所在類的對象引用
記?。?/strong> 方法被哪個對象調用,this就代表哪個對象
適用:局部變量隱藏成員變量(稍后補充)
1.2 構造方法構造方法和它所在類的名字相同,但構造方法沒有返回值。
通常會使用構造方法給一個類的實例變量賦初值,或者執行其它必要的步驟來創建一個完整的對象
怎么理解呢?
當一個對象被創建時候,構造方法用來初始化該對象。
那么什么叫做初始化呢?
我們要知道嗎,構造函數又被叫做構造器,它就是為了初始化類,當調用該構造器,會用值去初始化成員,當使用帶參構造時,會將參數中的值傳遞給成員,而使用無參構造時,即會用一些默認的值來進行成員的初始化
例如:
private String name;
private int age;
public bool flag;
上面的三個成員變量被無參構造進行默認初始化的時候,會被初始化
name = null; age = 0; flag = false;
注意:
A:如果我們沒有給出構造方法,系統將自動提供一個無參構造方法
B:如果我們給出了構造方法,系統將不再提供默認的無參構造方法
如果這個時候我們還想使用無參構造方法,就必須自己給出,建議永遠 給出無參構造方法(所以我們習慣于在類中同時給出無參和帶參構造方法)
給成員變量賦值的兩種方法:
A:setXxx()
B:構造方法
講到這里我們不得不提一下,get、set方法,在今后寫代碼的時候,我們需要頻繁的用到,其實這里就體現了封裝,不讓用戶直接操作成員,可以起到安全的作用,具體內容可以看前封裝部分的知識
構造方法是為了創建對象時,傳入一些必要的參數用來初始化對象。
setter/getter是為了控制屬性可不可以讀寫
兩者不矛盾
之前在講解類的時候,我們由于缺少一些知識的鋪墊,所以我們將類的初始化過程講一下:
類的初始化過程
Student s = new Student();在內存中做了哪些事情?
·加載Student.class文件進內存
·在棧內存為s開辟空間
·在堆內存為學生對象開辟空間
·對學生對象的成員變量進行默認初始化
·對學生對象的成員變量進行顯示初始化
·通過構造方法對學生對象的成員變量賦值
·學生對象初始化完畢,把對象地址賦值給s變量
1.3 static關鍵字Static關鍵字注意事項
A:在靜態方法中是沒有this關鍵字的
靜態是隨著類的加載而加載,this是隨著對象的創建而 存在的 → 靜態比對象先存在
B:靜態方法只能訪問靜態的成員變量和靜態的成員方法
靜態方法:
A:成員變量:只能訪問靜態變量
B:成員方法:只能訪問靜態成員方法
非靜態方法:
A:成員變量:可以是靜態的,也可以是非靜態的
B:成員方法:可以是靜態的成員方法,也可以是非靜態的成員方法
為什么靜態方法不能訪問非靜態方法呢?
因為靜態方法是隨著類的加載而加載的,靜態是優于對象存在的,你要訪問非靜態的東西,可是這時候可能它還不存在。
總結起來一句話:靜態只能訪問靜態
1.4 靜態變量和成員變量趁熱打鐵,我們來對靜態變量和成員變量做一些區分
所屬不同
·靜態變量屬于類,所以也稱為類變量
·成員變量屬于對象。所以也稱為實例變量(對象變量)
·內存中位置不同
·靜態變量存儲于方法區的靜態區
·成員變量存儲于堆內存
·內存出現時間不一樣
·靜態變量隨著類的加載而加載,隨著類的消失而消失
·成員變量隨著對象的創建而存在,隨著對象的消失而消失
·調用不同·
·靜態變量可以通過類名調用,也可以通過對象調用
·成員變量只能通過對象名調用
方式一 是用對象調用成員方法
方式二 是用類調用成員方法(推薦方式二【需要將對應成員方法寫為靜態的】)
如果不想讓用戶創建對象調用成員方法:
只需要把構造方法私有,外界就不能創建對象了
在同一個文件夾下,類定義兩個文件夾中和一個文件夾中是一樣的
1.4 制作文檔注釋和說明書(一)
制作文檔注釋,文檔說明書工具解析文檔注釋
javadoc工具
D:格式
javadoc -d 目錄 -author -version ArrayTool.java
目錄:就可以寫一個文件夾的路徑
制作幫助文檔出錯:
找不到可以文檔化的公共或受保護的類:告訴我們類的權限不夠(解決辦法: 在class前面加public)
(二)
API(Application Programming Interface)
應用程序編程接口(幫助文檔)
Jdk可以幫助我們查閱一些類、方法的詳細用法以及參數說明,學會查閱文檔也是一項很重要的本領(網絡上自行下載)
下面試著自己通過查閱文檔使用一個類
Math類
A:是針對數學進行操作的類
B:沒有構造方法,因為它的成員都是靜態的
C:產生隨機數
public static double random(): [0.0,1.0)
D:如何產生一個1-100之間的隨機數
int number = (int)(Math.random()*100)+1;
E:猜數字小游戲
1.5 代碼塊我們下面來講解這一部分的最后一個知識點
(1)用{}括起來的代碼。
(2)分類:
A:靜態代碼塊
概念: 在java類中(方法中不能存在靜態代碼塊)
使用static關 鍵字和{} 聲明的代碼塊:
執行: 靜態代碼塊在類被加載的時候就運行了,而且只運行一次,并且優 先于各種代碼塊以及構造函數。
作用: 一般情況下,如果有些代碼需要在項目啟動的時候就執行, 這時候 就需要靜態代碼塊。比如一個項目啟動需要加載的 很多配置文件等 資源,我們就可以都放入靜態代碼塊中。
對類的數據進行初始化,僅僅只執行一次。
B:構造代碼塊
概念:在java類中使用{}聲明的代碼塊(和靜態代碼塊的 區 別是少了static關鍵字):
執行: 構造代碼塊在創建對象時被調用,每次創建對象都會調用一 次,但是優先于構造函數執行。
作用: 和構造函數的作用類似,都能對對象進行初始化,并且只要 創建一個對象,構造代碼塊都會執行一次。但是反過來,構 造函數則不一定每個對象建立時都執行(多個構造函數情況 下,建立對象時傳入的參數不同則初始化使用對應的構造函 數)。
把多個構造方法中相同的代碼可以放到這里,每個構造方法 執行前, 首先執行構造代碼塊。
C:局部代碼塊
用于限定變量的生命周期,及早釋放,提高內存利用率。
靜態代碼塊,構造代碼塊,構造方法的順序問題
·靜態代碼塊 > 構造代碼塊 > 構造方法
結尾:如果內容中有什么不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^
如果能幫到你的話,那就來關注我吧!
在這里的我們素不相識,卻都在為了自己的夢而努力 ?一個堅持推送原創Java技術的公眾號:理想二旬不止
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74664.html
摘要:文字有點長,對于不想看文字的朋友,可以去這里看視頻,內容和這個文字一樣的,視頻可能更好理解回顧面向過程前面我們已經學過了面向過程我們知道,面向過程的時候,我們的關注點是步驟面向過程做事,就是把一件事情分割為多個步驟,然后依次去完成每一個步驟 文字有點長,對于不想看文字的朋友,可以去這里看視頻,內容和這個文字一樣的,視頻可能更好理解https://www.piqizhu.com/v/yj...
摘要:更形象的我們還可以將面向對象理解為一種宗教信仰。這就導致面向對象教的程序員們在寫時就很難受。所以為了滿足信仰面向對象教的需求通過構造函數的形式模擬了偽類。這個套路的核心就是類那么里沒有類所以其實是通過構造函數來模擬的偽類。 JS面向對象之一 【概述】 在學習JS的面向對象之前,我們應該先自問這樣幾個問題: 面向對象是什么意思? 學習面向對象的核心是什么? 為什么要學習面向對象?(它的...
摘要:為什么要采用面向對象編程解決問題更容易設計計算機程序就是為了解決人類的問題。面向對象編程需要對業務及代碼的架構是有一定的要求的。 1. 編程方式 我們目前的編程方式大體可以有以下三種編程方式: 順序編程 過程式編程 面向對象編程 在講面向對象編程時先講一下什么是順序編程,什么是過程式編程,什么是面向對象編程: 順序編程: 就是只用一個單線程去執行一段代碼,執行過程根據代碼依次從上...
摘要:用代碼可以這樣描述安全到達國外面向過程既然說了面向對象,那么與之對應的就是面向過程。小結在這篇文章中,介紹了什么是面向對象和面向過程,以及中對象的含義。 這是 javascript 面向對象版塊的第一篇文章,主要講解對面向對象思想的一個理解。先說說什么是對象,其實這個還真的不好說。我們可以把自己當成一個對象,或者過年的時候相親,找對象,那么你未來的老婆也是一個對象。我們就要一些屬性,比...
摘要:二面向對象有什么特征面向對象的主要特征有抽象繼承封裝和多態。析構函數析構函數是在引入的,它的作用與調用時機和構造函數剛好相反,它在對象被銷毀時自動執行。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優質的PHP面試內容。PHP中面向對象??嫉闹R點有以下7點,我將會從以下幾點進行詳細介紹說明,幫助你更好的應對PHP面試常考的面向對象相關的知識點和考題。整個面向對象文章的結構涉...
閱讀 1581·2021-11-25 09:43
閱讀 2486·2019-08-30 15:54
閱讀 2950·2019-08-30 15:53
閱讀 1099·2019-08-30 15:53
閱讀 757·2019-08-30 15:52
閱讀 2546·2019-08-26 13:36
閱讀 818·2019-08-26 12:16
閱讀 1220·2019-08-26 12:13