java基礎-java物件導向編程二

來源:互聯網
上載者:User

01.物件導向(static關鍵字)

用法:是一個修飾符,用於修飾成員(成員變數和成員函數)。
當成員被靜態修飾後,就多了一種調用方式,除了可以被對象調用之外,還可以被類名直接調用。類名.靜態成員。
對象的特有內容隨著Object Storage Service,共有內容可以定義為靜態,放在共用區。
類中的方法區,共用區,資料區都在同一個區。

static的特點:
(1)隨著類的載入而載入,隨著類的消失而消失。也就是說,靜態會隨著類的消失而消失,說明他的生命週期最長。
(2)優先於對象存在;明確一點:靜態先存在,對象後存在。
(3)被所有對象所共用;
(4)可以直接被類名調用。
執行個體變數和類變數的區別:
(1)存放位置:類變數隨著類的載入而存在與方法區中;執行個體變數隨著對象的建立而存在於堆記憶體中。
(2)生命週期:類變數的生命週期最長,隨著類的消失而消失;執行個體變數的生命週期隨著對象的消失而消失。
靜態使用注意事項:
(1)靜態方法只能訪問靜態成員和靜態方法。因為靜態方法和變數在類載入時就在了,非靜態變數在對象存在時才存在
(2)非靜態方法可以訪問靜態也可以訪問非靜態。
(3)靜態方法中不可以定義this,super關鍵字。因為靜態優先於對象存在,所以靜態方法不可以出現this。
(4)主函數是靜態。
靜態有利有弊:
利:對對象的共用資料進行單獨空間的儲存,節省空間的記憶體,沒有必要每個對象都儲存一份;可以直接被類名調用。
弊:生命週期過長,訪問出現局限性,靜態雖好只能訪問靜態。

02.物件導向(主函數main)

主函數:是一個特殊的函數,作為程式的入口,可以被jvm調用。
主函數的定義:
public:代表著該函數存取權限是最大的。
static:代表著主函數隨著類的載入就已經存在。
void:主函數沒有具體的傳回值。
main:不是關鍵字,但是是一個特殊的單詞,可以被jvm識別。
函數的參數(String[] args):參數類型是一個數組,該數組中的元素是字串,字串類型的數組。

jvm在調用主函數時,傳入的是new String[0];
啟動jav虛擬機器,並為主函數傳參數:java TestMain haha heiehi
這說明java虛擬機器在執行TestMain時給主函數傳入了haha和嘿嘿兩個參數。
還可以用下面的方法:

 代碼如下 複製代碼
class MainDemo
{
 public static void mian(String[] args)
 {
  String[] arr={"1","2","3"};
  Maintest(arr);
 }
}
class Maintest
{
 public static void main(String[] args)
 {
  for(int i=0;i<args.length;i++)
  {
   System.out.println(args[i]);
  }
 }
}

03.物件導向(什麼時候使用靜態)

要從兩方面下手:
因為靜態修飾的內容是成員變數和函數。
什麼時候定義靜態變數(類變數)呢?
當對象中出現共用資料時,該資料被靜態所修飾;對象中的特有資料要定義成非靜態存在於堆記憶體中。

什麼時候定義靜態函數呢?

當功能內部沒有訪問到非待用資料(對象的特有資料),那麼該功能可以被定義成靜態。

04.物件導向(靜態應用--工具類)

每個應用程式中都有共性的功能,可以將這些功能進行抽取,進行封裝。
當考慮讓程式更嚴謹時,如果不需要對象,可以將一個類中的成員設為靜態,直接通過類名調用即可。
將方法都靜態後,可以方便於使用,但是該類還是可以被其他程式建立對象的,為了更嚴謹,應該強制該類不能建立對象,可以將建構函式私人化就不允許建立對象了。

05.物件導向(協助文檔的製作)

java的說明書通過文檔注釋來完成。
格式:
/**
功能說明語句
@author 作者
@version 版本
@param 參數
@return 傳回值
*/
每個類和凡是用public修飾的成員函數都要用文檔注釋給說明。

給一個類產生文檔:
javadoc -d 目錄(路徑) -author -version
給一個類產生文檔,該類必須是public的

一個類中預設會有一個空參數的建構函式,這個預設的建構函式的許可權和所屬類一致。
如果被public修飾,那麼預設的建構函式也帶public修飾符。
如果類沒有被public修飾,那麼預設的建構函式,也沒有public修飾符。
預設的建構函式的許可權是隨著所屬類的變化而變化。

06.物件導向(靜態代碼塊)

static
{
 靜態代碼塊的執行語句;
}

特點:隨著類的載入而執行,只執行一次用於給類進行初始化的。在主函數前的靜態代碼塊優先於主函數執行。

當一個類被new一個對象時,類中的構造代碼塊,靜態代碼塊,建構函式執行順序是:靜態代碼塊,構造代碼塊,建構函式。

靜態代碼塊隨著類的載入而載入,只能調用靜態成員。

07.物件導向(對象的初始化過程)

載入“類.class”檔案;靜態代碼塊執行(沒有就不執行);構造代碼塊初始化;建構函式初始化;
Person p=new Person(“張三”,20);
這一句話所做的事:
1.因為new用到了Person.class,所以會先找到Person.class檔案並載入到記憶體中。
2.執行該類中的靜態代碼塊,如果有的話,給Person.class類進行初始化。
3.在堆記憶體中開闢空間,分配記憶體位址。
4.在堆記憶體中建立對象的特有屬性,並進行預設初始化。

5.對屬性進行顯示初始化。
6.對對象進行構造代碼塊初始化。
7.對對象進行對應的建構函式初始化。
8.將記憶體位址賦給棧記憶體中的變數。

08.物件導向(對象調用成員過程)

09.物件導向(單例設計模式)

設計模式:java中有23中設計模式。
解決某一類問題最行之有效方法。
單例設計模式:解決一個類在記憶體中只存在一個對象。
想要保證對象唯一:
(1)為了避免其他程式過多建立該類對象,先禁止其他程式建立該類對象。
(2)還為了讓其它程式可以訪問到該類對象,只好在本類中自訂一個對象。
(3)為了方便其他程式對自訂對象的訪問,可以對外提供一些訪問方式。
這三部怎麼體現:
(1)將建構函式私人化
(2)在類中建立一個本類對象,
(3)提供一個方法可以擷取到該類對象。

 代碼如下 複製代碼
class Single
{
 private Single(){}
 private static Single s=new Single();
 public Static Single getInstance()
 {
  return s;
 }
}

在類外,用Single s=Single.getInstance();訪問。

對於事物該怎麼描述,還怎麼描述。
需要將該事物的對象儲存在記憶體中唯一時,只要加上面三步就行。

10.物件導向(單例設計模式2)

單例設計模式的第二種寫法:

 代碼如下 複製代碼
class Single
{
 private static Single s=null;
 private Single(){}
 public static synchronized Single getInstance()
 {
  if(s==null)
   s=new Single();
  return s;
 }
}

第一種模式是先初始化對象,稱為餓漢式。
特點:Single類一進記憶體,就已經建立好了對象。餓了就做。
搞開發時一般用餓漢式。
第二種方式調用時才被初始化,稱為懶漢式。
特點:Single類進記憶體,對象還沒有存在,只有調用了getInstance()方法時,才建立對象。剛開始時不做,什麼時候需要什麼時候做。
synchronized是給該方法上鎖,當有一個對象操作該方法時,別的對象就不能操作。是為了防止兩個對象同時操作該方法。
懶漢式最終解決方案:

 代碼如下 複製代碼
class Single
{
 private static Single s=null;
 private Single(){}
 public static Single getInstance()
 {
  if(s==null)
  {
   synchronized(Single.class)
   {
    if(s==null)
    {
     s=new Single();
    }
   }
  }
  return s;
 }
}

記住原則:定義單例,建議使用餓漢式。

01.物件導向(繼承-概述)

繼承:提高了代碼的複用性;讓類與類之間產生了關係,才有了多態的特性。
注意:千萬不要為了擷取其它類的功能簡化代碼而繼承,必須是有類與類之間有所屬關係才可以繼承,所屬關係is a。

02.物件導向(繼承-概述)

java語言中只支援單繼承,不支援多繼承。因為多繼承容易帶來安全隱患。
當多個父類中定義了相同功能時,當功能內容不同時,子類的對象不確定運行哪一個。
但是java保留了這種機制,並用了另一種體現形式來完成表示,多實現。
java支援多層繼承。也就是一個繼承體系。
如何使用一個整合體系中的功能呢?
想要使用體系,先查閱體系中父類的描述,因為父類中定義的是該體系中共性的功能,通過瞭解共性功能,那麼這個體系已經可以基本使用了。
那麼在具體使用時,要建立最子類的對象,為什麼呢?一是因為有可能父類不能建立對象。二是建立子類對象可以使用更多的功能,包括基本的,也包括特有的。
簡單一句話:查詢父類功能,建立子類對象使用功能。

03.物件導向(聚集關係)

聚集:has a;分彙總和組合。

04.物件導向(子父類中變數的特點)

類中成員:
變數,函數,建構函式。
變數:如果子父類中出現了非私人的同名變數時,子類要訪問本類中的變數,用this。;子類要訪問父類中的同名變數,用super。
this代表本類對象的引用,super代表父類對象的引用。

05.物件導向(子父類中函數的特點)

子父類中函數的特點:
當子類出現和父類一模一樣的函數時,子類對象調用該函數,會運行子類函數的內容,如同父類的函數被覆蓋一樣,這種情況是函數的另一個特性:重寫(覆蓋)。

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

子類覆蓋父類,必須保證子類許可權大於等於父類許可權,才可以覆蓋,否則編譯失敗。靜態只能覆蓋靜態。

許可權:啥修飾符都沒有稱為預設許可權,介於共有和私人之間。

記住:
重載只看同名函數的參數列表,重寫是字父類方法要一摸一樣。

06.物件導向(子父類中構函數的特點-子類執行個體化過程)

子父類中建構函式的特點:
子類的建構函式的第一行隱式有一行語句:super();
在對子類對象進行初始化時,父類的建構函式也會運行,那是因為子類的建構函式預設第一行有一條隱式語句super();
super();會訪問父類中空參數的建構函式,而且子類中所有的建構函式預設第一行都是super();
為什麼子類一定要訪問父類中的建構函式:因為父類中的資料子類可以直接擷取,所以子類對象在建立時,需要先看父類是如何對這些資料進行初始化的,所以子類在對象初始化時要先訪問以下父類的建構函式,如果要訪問父類中指定的建構函式,可以子類的建構函式第一行手動的定義super(參數);訪問父類建構函式的方式。
子類的執行個體化過程:
結論:
子類中所有的建構函式預設都會訪問父類中空參數的建構函式,因為子類每一個建構函式的第一行都有一句隱式的super();
當父類中沒有參數的建構函式,子類必須手動的通過super語句形式來指定要訪問的父類中的建構函式。
當然,子類的建構函式第一行也可以手動指定this語句來訪問本類中的建構函式,子類中至少有一個建構函式會訪問父類中的建構函式。

07.物件導向(final)

final關鍵字:
(1)作為一個修飾符,可以修飾類,變數,函數。
(2)被final修飾的類不可以被繼承,為了避免被繼承,屏蔽子類複寫功能。
繼承對封裝是一個挑戰。
(3)被final修飾的方法不可以被重寫。
(4)被final修飾的變數是一個常量只能賦值一次,即可以修飾成員變數,也可以修飾局部變數。當在描述事物時,一些資料的出現的值是固定的,這時為了增強閱讀性,都給這些值起個名字方便閱讀,而這個值不需要改變,所以加final修飾,作為常量,常量的書寫規範所有字母都大寫,如果有多個單片語成,單詞間通過底線串連。
(5)內部類定義在類中的局部位置上是,只能訪問該局部被final修飾的局部變數。

08.物件導向(抽象類別)

當多個類中出現了相同功能,但是功能主體不同,這時可以進行向上抽取,這時只抽取功能定義,而不抽取功能主題。
抽象:就是所謂的看不懂。
特點:
(1)抽象方法一定定義在抽象類別中。
(2)抽象方法和抽象類別都必須被abstract關鍵字修飾。
(3)抽象類別不可以被new關鍵字建立對象,因為調用抽象方法沒有意義。
(4)抽象類別的抽象方法要被使用,必須由子類複寫出所有的抽象方法後,建立子類對象調用。
如果子類覆蓋了部分抽象方法,那麼該子類還是一個抽象類別。

09.物件導向(抽象類別2)

抽象類別和一般類沒有太大的不同,該如何描述事物就如何描述事物,只不過該事務中出現了一些看不懂的東西,這些不確定的部分也是該事務的功能,需要明確出現,但是無法定義主體。通過抽象方法來表示。

抽象類別比一般類多了抽象方法(函數)。
抽象類別不可以被執行個體化。
作用就是不讓該類建立對象。
抽象類別中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象。

10.物件導向(抽象類別練習)

11.物件導向(模板方法模式)

需求:擷取一段程式啟動並執行時間。
原理:擷取程式開始和結束的時間並相減。
方法:使用System類的currentTimeMillis();

當程式碼完成最佳化後,就可以解決這類問題。
這種方式就是模板方法設計模式。
什麼是模板方法呢?
在定義功能是,功能的一部分是確定的,但有一部分是不確定的,確定的部分再使用不確定的部分,那麼這時候將不確定的部分暴漏出去,又該類的子類去完成。

12.物件導向(介面)

介面:初期理解可以認為是一個特殊的抽象類別,當抽象類別中的方法都是抽象的,那麼該類可以通過介面的方式來表示。interface用來定義介面。
介面定義時的特點:
(1)介面中常見定義:變數,抽象方法。
(2)介面中成員都有固定修飾符,
常量:public static final
方法:public abstract
記住:介面中的成員都是public的。
介面是不可以建立對象的,因為有抽象方法,需要被子類實現,子類對介面中的抽象方法全都覆蓋後,子類才可以被執行個體化,否則子類是一個抽象類別。
interface編譯後也是一個class檔案。

13.物件導向(介面2)

介面可以被類多實現。也是對多繼承不支援,對介面可以進行多實現。
實現介面:implements
一個類在繼承一個類的同時,可以實現多介面。

類與類之間是繼承關係,類與介面之間是實現關係,介面與介面之間是繼承關係。
java只有在介面和介面之間可以實現多繼承。

14.物件導向(介面的特點)

介面的特點:
介面是對外暴漏的規則
介面是程式的功能擴充
介面可以用來多實現
類與介面之間是多實現關係,而且類可以在繼承一個類的同時實現多介面
介面與介面之間可以有多繼承

15.物件導向(介面舉例體現)

準系統定義在類中,擴充功能定義在介面中。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.