【面向對象】---------------找對象,創建對象,使用對象,維護對象。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: 1 、應用於局部變量與成員變量同名時 this . name=name
2、應用於構造函數間的調用時;———this (name)這裏沒有點「.」
this:this表明它所在函數所屬對象的引用。
(哪一個對象在調用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同時實現了Inter和IterA兩接口)
【】
類 與 類 ——繼承關係 extends
類 與 接口 ——實現關係 implements
接口與接口 ——繼承關係 extends (java在接口與接口之間支持多繼承)
【】
接口特色:接口是對外暴露的規則;是程序功能的擴展;下降了耦合性。
//運動員屬性必定有的運動功能(體系裏的)
abstract class Sporter
{
abstract void play();
}
//運動員擴展了個學習java的功能(擴展的 —— 定義成接口)
interface StudyJava
{
}
//運動員小明還具備學習java的功能,就加上實現對應的接口
class xiaoming extends Sporter implements Study
{
}