第一章、 面向對象和麪向過程的區別java
1、面向過程和麪向過程的區別程序員
(1)首先編程思想(舉一個貼近生活的例子)算法
面向過程:是遇到一件事時,思考「我該怎麼作」,而後一步步實現的過程。他是一我的作所有事情;編程
面向對象:是遇到一件事時,思考「如何把這件事劃分紅多個小事情,而後每一個小事情讓某個對象來作,最後一羣對象協力能把事。」安全
(2)代碼質量來講工具
A:面向過程的代碼缺少對數據的封裝,而且不安全;this
B:面向過程的變量是多個徹底獨立的變量, 並非一個總體;操做過程讓代碼變得複雜,很差維護;操作系統
例如方法中須要多個參數的時候等,面向過程須要定義多個參數,面向對象只須要定義一個對象就會;線程
案例:對象
10. printEmpInfo(emp1Name, emp1Age, emp1Gender, emp1Salary);
14. printEmpInfo(emp1Name, emp1Age,emp1Gender, emp1Salary);
15. }
2、面向對象在工做中對於一個需求的開發思路
(1) 分析須要的對象:
先按照名詞提煉問題領域中的對象
(2) 分析對象的屬性和方法
(3) 分析問題流程,經過new對象來,調用對於的屬性和方法;
3、相關概念
1抽象數據類型
能夠理解爲:將不一樣類型的數
據的集合組成個總體用來描述一種新的事物。
像如上程序中,能夠將姓名、年齡、性別、工資這4個不一樣類型的數據組成一個總體來描述僱員這個新事物。
4、類和對象的區別
4.1概念
類是對某一類事物的抽象描述;描述多個對象的共同特徵,它是對象的模板
對象用於表示現實中該類的具體事物;
例如:動物是類,毛、狗等是對象;
4.2開發使用
類中能夠定義事物的屬性和行爲;
對象是使用new關鍵字建立出來,經過對象引用就能夠調用該對象具體的屬性和功能了。
A:基本類型:
做爲參數傳遞時,其實就是將基本類型變量x空間中的值複製了一份傳遞給調用的方法的變量;
在方法中對於變量的操做,不會影響原來變量的值;
B:引用類型:
當引用變量做爲參數傳遞時,這時實際上是將引用變量空間中的內存地址(引用)複製了一份傳遞給了方法的引用變量。
這時會有兩個引用同時指向堆中的同一個對象。不論是哪個引用改變了引用的所指向的對象的中的值,其餘引用再次使用都是改變後的值。
第三章、面向對象三大特徵:
1、封裝
l 封裝概念
n 封裝,把對象的屬性和方法的實現細節隱藏,僅對外提供一些公共的訪問方式
l 封裝表現:
n 一、方法:封裝的是具體的業務邏輯實現
n 二、類:封裝的是對象的屬性和行爲變量
n 三、變量:使用 private 修飾,這就是變量的封裝
n 四、訪問控制修飾符:封裝的是訪問的權限
l 封裝的好處:
n 一、提升了代碼的複用性。
例如須要某些功能,值須要經過對象調用對於方法就好,而不須要直接寫方法的具體算法;
n 二、提升了代碼的安全性。
n 隱藏了實現細節,還要對外提供能夠訪問的方式,便於調用者的使用。這是核心之一,也能夠理解爲就是封裝的概念。
2、繼承:
2.1)做用:代碼的複用
2.2)父類/基類:共有的屬性和行爲
子類/派生類:特有的屬性和行爲
2.3)子繼承父以後,子具備:父+子
2.4)傳遞性、單一繼承,多接口實現
3、多態:
1)意義:行爲的多態、對象的多態
2)轉換向上造型、強制類型轉換、instanceof判斷
3)多態的表現形式:
重寫:根據對象來多態
重載:根據參數來多態
第四章、特殊的操做工具代碼
1、This
一、概述
做用:爲了解決方法的局部變量和成員變量的混淆;
工做原理:指代當前對象,哪一個對象調用方法指的就是哪一個對象
二、使用位置
2.1使用在方法體中:
this關鍵字用在方法體中,用於指代調用該方法的當前對象;爲了方即可以省略;
簡單的說:哪一個對象調用方法,this指的就是哪一個對象。嚴格來說,在方法中須要經過this關鍵字指明當前對象
2.2使用在構造方法中
在構造方法中,用來初始化成員變量的參數通常和成員變量取相同的名字,這樣會有利於代碼的可讀性,但此處就必須經過this關鍵字來區分紅員變量和參數了
2.3對於成員變量、方法、構造方法的調用
3使用方式
1)this.成員變量名------------訪問成員變量
2)this.方法名()--------------調用方法
3)this()---------------------調用構造方法
四、注意事項
調用其餘構造方法的語句必須定義在構造方法的第一行,緣由是初始化動做要最早執行
2、supper
一、super:指代當前對象的父類對象
二、super的用法: 1)super.成員變量名----------訪問父類的成員變量 2)super.方法名()------------調用父類的方法 3)super()-------------------調用父類的構造方法
3、package:
1)做用:避免類的命名衝突
2)類的全稱: 包名.類名
3)包名能夠有層次結構,同包中的類不能同名 4)建議:包名全部字母都小寫
4、import:
1)同包中的類能夠直接訪問 不一樣包中的類不能直接訪問,若想訪問有以下兩種方式:
1.1)先import聲明類再使用----建議
1.2)類的全稱----------------太繁瑣,不建議
第五章、對象內存管理
1、背景
1代碼的編譯運行
在JAVA中,有java程序、虛擬機、操做系統三個層次,其中java程序與虛擬機交互,而虛擬機與操做系統交互。編譯好的java字節碼文件運行在JVM中。
2存儲位置
程序中不管代碼仍是數據,都須要存儲在內存中
3內存分配原理
java程序所需內存均由JVM進行管理分配,開發者只需關心JVM是如何管理內存的,而無需關注某種操做系統是如何管理內存的,這就保證了java程序的平臺無關性。
4內存劃分
JVM會將申請的內存從邏輯上劃分爲三個區域:堆、棧、方法區。這三個區域分別用於存儲不一樣的數據。
2、內存分類介紹
一、堆內存
1.1概述
3.1.1概念:JVM在其內存空間開闢了一個稱爲「堆」的存儲空間
1.1.2存儲內容
(一)存儲使用new關鍵字所建立的對象
(二)成員變量亦在此分配,並賦初始值(根據類型賦值);
注:是基本數據類型的成員變量
1.1.3生命週期
(一)對象:當一個對象沒有任何引用時,該對象被視爲廢棄的對象,屬於被回收的範圍;開發中就是將該引用賦值爲null;
(二)成員變量:從對象在堆中建立開始到對象從堆中被回收結束
1.2內存問題
1.2.1垃圾回收機制
(一)概念:垃圾回收器(Garbage Collection,GC)是JVM自帶的一個線程(自動運行着的程序),用於回收沒有任何引用所指向的對象
(二)運行原理:GC線程會從棧中的引用變量開始跟蹤,從而斷定哪些內存是正在使用的,若GC沒法跟蹤到某一塊堆內存,那麼GC就認爲這塊內存再也不使用了,即爲可回收的。
(三)應用:java程序員不用擔憂內存管理,由於垃圾收集器會自動進行管理
1.2.2 Java程序的內存泄露問題
(一)概念:內存泄露是指,再也不被使用的內存沒有被及時的回收,嚴重的內存泄露會因過多的內存佔用而致使程序的崩潰。在程序中應該儘可能避免沒必要要的內存浪費。
(二)內存泄漏減小:GC線程判斷對象是否能夠被回收的依據是該對象是否有引用來指向,所以,當肯定該對象再也不使用時,應該及時的將其引用設置爲null,這樣,該對象即再也不被引用,屬於可回收的範圍。
1.2.3System.gc()方法
GC的回收對程序員來講是透明的,並不必定一發現有無引用的對象就當即回收。通常狀況下,當咱們須要GC線程即刻回收無用對象時,能夠調用System.gc()方法。此方法用於建議JVM立刻調度GC線程回收資源,但具體的實現策略取決於不一樣的JVM系統。
二、棧內存
1.1概述
1.1概念:JVM在其內存空間開闢一個稱爲」棧」的存儲空間
2. 2存放內容
(一)用於存儲程序運行時在方法中聲明的全部的局部變量、參數等;
注:
局部變量:方法中聲明的變量即爲局部變量
變量的值:若變量爲基本類型,則在棧中存儲的就是該變量的值。若變量爲引用類型,則在棧中存儲的是堆中對象的地址
2.1.3生命週期
JVM會爲每個方法的調用在棧中分配一個對應的空間,這個空間稱爲該方法的棧幀。一個棧幀對應一個正在調用中的方法,棧幀中存儲了該方法的參數、局部變量等數據。
當某一個方法調用完成後,其對應的棧幀將被清除,局部變量即失效。
一、 方法區
5.1概述
5.1.1概念:JVM在其內存空間開闢一個稱爲」棧」的存儲空間
5.1.2原理:先會經過類裝載器載入類文件的字節碼信息,通過解析後將其裝入方法區。
5.1.3存放內容
(一)類的各類信息(包括類的類型信息、方法、字節碼文件等)都在方法區存儲
(二)static變量
(三)常量
5.1.4特徵
(一)方法只有一份:多個對象會擁有各自在堆中的空間,但全部實例對象是共用在方法區中的一份方法定義的。意味着,方法只有一份
(二)方法區中包含的都是在整個程序中永遠惟一的元素,如class,static變量。
5、程序執行流程
class Person {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
p.setAge(30);
System.out.println("你們好,今年我" + p.getAge() + "歲");
}
}
下圖爲程序中內存對象的建立使用過程。
圖1-1 內存對象建立使用過程
程序執行流程說明:
一、 先執行main方法(壓棧),執行其中的 Person p = new Person();
二、 在堆內存中開闢空間,併爲其分配內存地址0x1234,緊接着成員變量默認初始化(age = 0);將內存地址0x1234賦值給棧內中的Person p 變量
三、 繼續執行p.setAge(30)語句,這時會調用setAge(int age)方法,在棧中給該方法開闢一個內存空間;將30賦值爲setAge方法中的「age」變量;執行this.age = age語句,將age變量值30 賦值給成員變量this.age爲30;
四、 setAge()方法執行完畢後(彈棧),將該方法的內存空間釋放;回到main()方法,執行輸出語句System.out.println(),控制檯打印p對象中的age年齡值。