面向對象0---整體概述

第一章、   面向對象和麪向過程的區別java

 

1、面向過程和麪向過程的區別程序員

(1)首先編程思想(舉一個貼近生活的例子)算法

面向過程:是遇到一件事時,思考「我該怎麼作」,而後一步步實現的過程。他是一我的作所有事情;編程

面向對象:是遇到一件事時,思考「如何把這件事劃分紅多個小事情,而後每一個小事情讓某個對象來作,最後一羣對象協力能把事。」安全

 

(2)代碼質量來講工具

A:面向過程的代碼缺少對數據的封裝,而且不安全;this

B:面向過程的變量是多個徹底獨立的變量, 並非一個總體;操做過程讓代碼變得複雜,很差維護;操作系統

例如方法中須要多個參數的時候等,面向過程須要定義多個參數,面向對象只須要定義一個對象就會;線程

案例:對象

  1. /** 打印員工信息的方法   */
  2. public static void printEmpInfo(String name,int age,
  3. char gender,double salary) {
  4. System.out.println("--------------------");
  5. System.out.println("姓名: " + name);
  6. System.out.println("年齡:" + age);
  7. System.out.println("性別:" + gender);
  8. System.out.println("薪水:" + salary);
  9. }

 

  1. ** 打印僱員信息    */
  2. public  static  void  main  (String[ ]  args ){
  3.       //僱員1
  4.       String emp1Name = "黃河大蝦";
  5. int emp1Age = 25;
  6.       char emp1Gender = '男';
  7. double emp1Salary = 8000.00;
  8.     
  9.       //打印員工信息

10. printEmpInfo(emp1Name, emp1Age, emp1Gender, emp1Salary);

  1. 11.       
  2. 12.       //修改員工工資(增加20%)並打印
  3. 13.       emp1Salary *= 120.0 / 100.0;

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年齡值。

相關文章
相關標籤/搜索