JAVA 學習筆記(2)___面向對象(基本結構,註釋,繼承,抽象)

面向對象---------------找對象,創建對象,使用對象,維護對象java

 

 

人開門:(名詞提煉法。)數組

安全

{jvm

       開門(門)函數

       {學習

              .();this

       }spa

}.net

對象

{

       (){操做門軸等。}

}

 

【類和對象的關係】

類就是:對現實生活中事物的描述。

對象:就是這類事物,實實在在存在個體。

映射到java中,描述就是class定義的類。

具體對象就是對應java在堆內存中用new創建實體。

 

//屬性對應是類中變量,行爲對應的類中的函數(方法)

//其實定義類,就是在描述事物,就是在定義屬性和行爲。屬性和行爲共同成爲類中的成員(成員變量和成員方法)

【】

class Car

{

       //描述顏色

       String color = "紅色";

       //描述輪胎數

       int num = 4;

 

       //運行行爲。

       void run()

       {

              System.out.println(color+".."+num);  //打印 車顏色+輪胎數

       }

}

 

【匿名對象】————只調用一次; 做爲實參

【權限】public   private   protected

        private :私有,權限修飾符:用於修飾類中的成員(成員變量,成員函數)

私有隻在本類中有效。(注意:私有僅僅是封裝的一種表現形式。)

 

【構造函數】

 ______沒有返回值,只有函數名,而且函數名必須與類名相同。

 特色:對象 一創建 就會 調用 與之對應的構造函數。

構造函數的做用:能夠用於給對象進行初始化

小細節:當一個類中沒有定義構造函數時,那麼系統會默認給該類加入一個空參數的構造函

數。// Demo ( ) { }

 

【構造函數,通常函數】 (在寫法上有不一樣。在運行上也有不一樣。)

構造函數是在對象一創建就運行。給對象初始化。

而通常方法是對象調用才執行,給是對象添加對象具有的功能。

一個對象創建,構造函數只運行一次。

而通常方法能夠被該對象調用屢次。

【構造代碼塊】

 構造代碼塊 ——— 就是 { } 圈住的部分,沒有函數名字

                      對象一創建就運行,並且優先於構造函數執行。

構造代碼快中定義的是 不一樣對象  共性的 初始化內容。(全部對象一塊兒初始化相同部分)

this  (只存在構造函數內裏使用)

this:  、應用於局部變量與成員變量同名時   this . name=name

      2、應用於構造函數間的調用時;———this name)這裏沒有點「.

thisthis表明它所在函數所屬對象的引用。

         (哪一個對象在調用this所在的函數,this就表明哪一個對象。)

應用:比較兩相同類的對象的大小時

 

【靜態:static】——共享區

全部對象共享一個數據可定義static,特有內容不適合加static

 

用法:是一個修飾符,用於修飾成員(成員變量,成員函數).

當成員被靜態修飾後,就多了一個調用方式,除了能夠被對象調用外,

還能夠直接被 類名調用。(類名.靜態成員) +1

實例變量和類變量的區別

1,存放位置。

       類變量隨着類的加載而存在於共享區(方法區、數據區)中。

       實例變量隨着對象的創建而存在於堆內存中。

2,生命週期:

       類變量生命週期最長,隨着類的消失而消失。

       實例變量生命週期隨着對象的消失而消失。

【】

什麼使用靜態?

 

要從兩方面下手:

由於靜態修飾的內容有成員變量和函數。

何時定義靜態變量(類變量)呢?

當對象中出現共享數據時,該數據被靜態所修飾。

對象中的特有數據要定義成非靜態存在於堆內存中。

 

何時定義靜態函數呢?

 

當功能內部沒有訪問到非靜態數據(對象的特有數據)

那麼該功能能夠定義成靜態的。

 

【主函數 MAIN

public static void main(String[] args)

主函數:是一個特殊的函數。做爲程序的入口,能夠被jvm調用。

主函數的定義:

public:表明着該函數訪問權限是最大的。

static:表明主函數隨着類的加載就已經存在了。

void:主函數沒有具體的返回值。

main:不是關鍵字,可是是一個特殊的單詞,能夠被jvm(虛擬機)識別。

String[] arr:函數的參數,參數類型是一個數組,該數組中的元素是字符串。字符串類型的數組。

主函數是固定格式的:jvm(虛擬機)識別。

jvm在調用主函數時,傳入的是new String[0];

 

 

 

【註釋文檔】——以HTML的形式

DOS命令: javadoc  d helpdoc author  –version  GongJu.java //(在當前目錄下建立一個GongJu.java的註釋文檔存放在helpdoc文件夾下,並將做者、版本也顯示出)

DOS命令:javadoc  d  f:\helpdoc author  –version  GongJu.java //存放在F盤下的helpdoc文件夾裏

/** */

一些標籤 @version 版本 @author 做者 @param 參數 @return 描述返回值

 

 

【靜態代碼塊】

格式:

static

{

                      靜態代碼塊中的執行語句;

}

 

特色:隨着類的加載而執行,只執行一次,優先於主函數

用於給類進行初始化的。

 

 

【】

靜態代碼塊——初始化         stiatic{}

構造代碼塊——對象初始化        {}

構造函數  ——對應對象初始化    Demo{}

 

 

【對象的初始化過程】  ( static代碼塊—>默認初始化­>構造代碼塊—>構造函數初始化)

 

Person p = new Person("zhangsan",20);

 

該句話都作了什麼事情?

1,由於new用到了Person.class.因此會先找到Person.class文件並加載到內存中。

2,執行該類中的static代碼塊,若是有的話,給Person.class類進行初始化。

3,在堆內存中開闢空間,分配內存地址。

4,在堆內存中創建對象的特有屬性。並進行默認初始化。

5,對屬性進行顯示初始化。

6,對對象進行構造代碼塊初始化。

7,對對象進行對應的構造函數初始化。

8,將內存地址付給棧內存中的p變量。

【繼承 ———— class C extends A  A是與C共性的部分)

繼承:

1,提升了代碼的複用性

2,讓類與類之間產生了關係。有了這個關係,纔有了多態的特性。

 

(注意:千萬不要爲了獲取其餘類的功能,簡化代碼而繼承。

必須是類與類之間有所屬關係才能夠繼承。)

 

Java語言中:java只支持單繼承,不支持多繼承。(一個孩子就一個父親)

由於多繼承容易帶來安全隱患:當多個父類中定義了相同功能,

當功能內容不一樣時,子類對象不肯定要運行哪個。

可是java保留這種機制。並用另外一種體現形式來完成表示。多實現。

 

java支持多層繼承。也就是一個繼承體系

如何使用一個繼承體系中的功能呢?

想要使用體系,先查閱體系-父類的描述,由於父類是該體系中共性功能。

經過了解共性功能,就能夠知道該體系的基本功能。

 

那麼在具體調用時,要建立最子類的對象,爲何呢?

一是由於有可能父類不能建立對象,

二是建立子類對象可使用更多的功能,包括基本的也包括特有的。

 

(簡單一句話:查閱父類功能,建立子類對象使用功能。)

 

【】

繼承:誰是誰的一種

彙集:has a 誰裏面有誰

聚合:球隊中有球員

組合:手是人身體一部分

 

super】關鍵字

Super 表明父類對象引用

This  表明本類對象引用

 

【重寫(覆蓋)】

當子類出現和父類如出一轍的函數時,

當子類對象調用該函數,會運行子類函數的內容,父類被覆蓋;

這種狀況是函數的另外一個特性:重寫(覆蓋)

 

當子類繼承父類,沿襲了父類的功能到子類中,可是子類雖具有該功能,可是功能的內容卻和父類不一致,這時,沒有必要定義新功能,而是使用覆蓋特殊,保留父類的功能定義,並重寫功能內容。

 

 

覆蓋

1,子類覆蓋父類,必須保證子類權限大於等於父類權限,才能夠覆蓋,不然編譯失敗。

(父類是private,子類是默認或public都不能說是覆蓋,由於父類都隱藏了,但編譯能夠經過)

2,靜態只能覆蓋靜態。

 

【區別】

重載:只看同名函數的參數列表。

重寫(覆蓋):子父類方法要如出一轍。

 

final —— 最終 (修飾符)

1,能夠修飾類,函數,變量。

2,被final修飾的 不能夠被繼承

3,被final修飾的方法 不能夠被複寫

4,被final修飾的變量是一個常量只能賦值一次(賦值後值終身不變),既可修飾成員變量,又可修飾局部變量。

       當在描述事物時,一些數據的出現值是固定的,那麼這時爲了加強閱讀性,都給這些值起個名字。方便於閱讀。(如final PI=3.14

       而這個值不須要改變,因此加上final修飾。做爲常量:常量的書寫規範全部字母都大寫,若是由多個單詞組成。

       單詞間經過「_」鏈接。

5,內部類定義在類中的局部位置上是,只能訪問該局部被final修飾的局部變量。

 

當多個類中出現相同功能(如都打印功能),可是功能主體(內容)不一樣,

這是能夠進行向上抽取。這時,只抽取功能定義,而不抽取功能主體(「{}」)。

 

抽象:即看不懂。

 

抽象類的特色:

1,抽象方法必定在抽象類中。

2,抽象方法 抽象類 都必須被abstract關鍵字修飾

3,抽象類不能夠用new建立對象。由於調用抽象方法沒意義。

4,抽象類中的抽象方法要被使用,必須由子類複寫起全部的抽象方法後,創建子類對象調用。

       若是子類只覆蓋了 部分 抽象方法,那麼該子類 仍是一個 抽象類。

【】

抽象類和通常類沒有太大的不一樣。 該如何描述事物,就如何描述事物,只不過,該事物出現了一些看不懂的東西。

這些不肯定的部分,也是該事物的功能,須要明確出現。可是沒法定義主體。經過抽象方法來表示。

抽象類比通常類多個了抽象函數。就是在類中能夠定義抽象方法。

抽象類不能夠實例化。

(特殊:抽象類中能夠不定義抽象方法,這樣作僅僅是不讓該類創建對象。)

 

【模板方法模式】——將必要卻不肯定的方法以抽象形式對外暴露,固有方法用 final 形式修飾防止被複寫。(如作月餅的模板)

 

接口

接口:初期理解,能夠認爲是一個特殊的抽象類

當抽象類中的方法 都是 抽象的,那麼該類能夠經過接口的形式來表示。

class用於定義類

interface 用於定義接口。

例如:interface  Inter

{

public static final int NUM = 3;

public abstract void show();

}

 

接口定義時,格式特色:

1,接口中常見定義:常量,抽象方法。

2,接口中的成員都有固定修飾符。

                                        常量:public static final

                                        方法:public abstract

記住:接口中的成員都是public的。

接口:是不能夠建立對象的,由於有抽象方法。

須要被子類實現,子類對接口中的抽象方法全都覆蓋後,子類才能夠實例化。

不然子類是一個抽象類。

 

接口能夠被類多實現,也是對多繼承不支持的轉換形式。java支持多實現

(例如: class Test extends Demo implements Inter , InterA ——Text繼承了Demo同時實現了InterIterA兩接口)  

【】

  ——繼承關係 extends

接口 ——實現關係 implements

接口與接口 ——繼承關係 extends    java在接口與接口之間支持多繼承)

【】

接口特色:接口是對外暴露的規則;是程序功能的擴展;下降了耦合性。

 

//運動員屬性必定有的運動功能(體系裏的)

abstract class Sporter

{

abstract void play();

}

//運動員擴展了個學習java的功能(擴展的 —— 定義成接口

interface StudyJava

{

}

//運動員小明還具備學習java的功能,就加上實現對應的接口

class xiaoming extends Sporter implements Study

{

}

相關文章
相關標籤/搜索