黑馬程式設計師——物件導向(上)— 類、物件、封裝、繼承、構造方法

Holylighting發表於2015-08-11

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a>、期待與您交流! ----------


1.物件導向的核心思想

(1)java中的引數傳遞問題

    Java中只有值傳遞,基本型別傳遞的是實際的數值,引用資料型別傳遞的是地址值。

    基本型別:形式引數的改變不會影響實際引數.

    引用型別:形式引數的改變會直接影響實際引數,因為引用資料型別傳遞的是地址值.(String型別除外)

 

(2)理解程式導向和麵向物件

    程式導向:是以函式為基礎,強調的是過程。(強調的是這個方法可以實現什麼功能)

    物件導向:是以物件為基礎的,它強調的是這個物件可以完成什麼功能

 

(3)物件導向的思想特點

    A:更符合人們的思考習慣的思想(能懶就懶)

    B:把複雜的事情簡單化

    C:讓程式設計師從執行者變為了指揮者

 

(4)面試:跟我談談什麼是物件導向

    A 物件導向是基於程式導向的

    B 告訴他什麼是程式導向什麼是物件導向

    C 在說物件導向的思想特點

    D 舉例說明(要求每人想一個)

 

2、類與物件的關係概述

1)開發的過程:

        就是不斷的建立物件,指揮物件去做事情(物件呼叫方法)

(2)類與物件

    類:屬性和行為的集合,它是一個抽象的概念

    物件:就是類的具體實現,體現.

    成員變數:其實就是屬性

    成員方法:其實就是行為

 

3)定義一個類的步驟

    A、分析這個實物有什麼屬性及行為

    B、把這個事物的屬性定義為成員變數(把變數定義在類中方法外)

    C、把這個實物的行為定義為成員方法(把之前函式中的static去掉)

 

    注意:

        只有能用於描述這個類屬性的才可以定義為成員變數,其他情況全部定義為區域性變數

 

4)成員變數與區域性變數的區別

    成員變數:  

        A定義在類中方法外

        B是有預設初始化值的(String null, int 0)

        C儲存在堆記憶體中(因為它是隨著物件的存在而存在)

    區域性變數:

        A 定義在方法中,或形式引數位置

        B 是沒有預設初始化值的(必須先賦值再使用)

        C 儲存在棧記憶體中的(它是依託於方法而存在的,方法呼叫完畢就消失。)

 

5)匿名物件

    使用情況:

                A 當物件之使用一次時。

        B 可以當實際引數使用。

 案例:

class Student
{
	public void show()
	{
		System.out.println("student -- show");
	}
}

 class Test
{
	//引用型別作為形式引數
	public static  void print(Student s)
	{
		s.show();
	}

	public void print(int a)
	{
		System.out.println(a);
	}
}

class NiMingTest 
{
	public static void main(String[] args) 
	{
		//如何使用show()方法呢?
		Student s = new Student();
		
		//匿名物件的使用
		Test.print(new Student());

		Test t = new Test();
	
	}
}

3、封裝

1) 定義

        隱藏物件的屬性和細節,僅對外提供公共訪問方式。(換句話說就是將屬性私有化,並提供共有的方法訪問)

    注意:

        對外提供訪問方式是因為可以在訪問方式中加入邏輯判斷的語句。提高程式碼的健壯性。

 

2)好處: 

    A、將變化隔離。

    B、便於使用

    C、提高重用性

    D、提高安全性


(3) private關鍵字

    A. 他是一個訪問許可權修飾符。

    B.可用於修飾成員內容,包括成員變數和成員方法

    C.被private修飾的內容只能在本類中使用


    注意:

         private僅僅是封裝的一種體現,因為類,函式等其實也是一個封裝的體現

 

(4)為什麼要寫getter/setter方法
    A.因為屬性私有化,只能在本類使用,其他類要想使用就需要提供get方法和set方法
    B.set和get方法 不一定必須出現,他倆是相互獨立的

    C.set方法和get方法的名字可以隨便起,這樣起名只不過是形成的一個預設的規則

 

4、構造方法

(1)特點
    A、方法名必須和類名保持一致
    B、沒有返回值型別並且沒有具體的返回值


(2) 作用

    給物件進行屬性初始化(給類中的成員初始化)

 

(3) 注意事項

    A、如果沒有明確給出構造方法,那麼系統會預設給出一個無參構造方法
    B、只要明確給出構造方法,系統將不在提供無參構造

    C、構造方法的過載體現在引數列表不同

    D、構造方法的過載方法的過載沒有關係,即使構造方法名和普通方法名一樣,他們也不存在過載關係。

 

(4) 給私有的成員變數賦值的方式
    A、通過set方法,推薦使用
    B、通過構造方法

    注意:

        Set方法存在就是為了個成員變數賦值。

        構造方法主要目的是初始化物件(捎帶賦值),只能賦值一次

    

(5)建構函式與一般函式的區別

    構造方法是在物件一建立就執行,給物件初始化,且只執行一次。

    一般方法是物件呼叫才執行,給物件新增功能,可以呼叫多次。

案例:

class Person
{
	private String name;
	private int age;

	//構造方法
	public Person()
	{
		//System.out.println("無參構造方法");
	}

	public Person(String n)
	{
		name = n;
	}

	/*
	這不是構造方法
	public void Person()
	{
		System.out.println("haha");
	}
	*/
	
}

 

5、this關鍵字

(1)概念

    this代表物件的引用。
    哪個物件呼叫有 this 在的方法,方法內this代表個物件(誰呼叫,this就代表誰)


(2) 應用場景

    用於解決區域性變數隱藏成員變數的問題

    簡單點說:通過this關鍵字可以直接呼叫成員變數

 

    Public boolean compare(Person p)

    {

        Return this.age == p.age;

    }

 (3)使用案例:

public class Student {

	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public   Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public Student() {
		super();

	}


6、程式碼塊用的很少,主要應對面試

(1)概述

    由{}擴起來的程式碼稱之為程式碼塊,類或者方法也可認為是程式碼塊,但是一般不這麼說,我們平時所說的程式碼塊指的是孤零零的{}

 

(2)程式碼塊作用

    A、區域性程式碼塊作用

        讓變數儘可能早的從記憶體中消失,提高記憶體利用

    B、構造程式碼塊作用是

        把所有構造方法中的共同的內容定義在構造程式碼塊中,提高程式碼複用性,程式碼塊先於構造方法執行,但是一般不用

 

7、static關鍵字

(1)概述

    A static可以修飾成員變數和成員方法

    B 被static修飾的成員可以被該類下所有的物件共享

 

(2)什麼時候用靜態

    A.如果該屬性是被該類下所有的物件所共享時就用static修飾

    B.如果方法內部只訪問靜態資料時,那麼該方法可以定義為靜態的。

    

    注意:

        類中所有方法都靜態後,可以直接呼叫,但是該類還是可以被其他程式建立物件,為了更為嚴謹,可以通過將構造方法私有化,強制讓該類不能建立物件

 

(3)特點

    A、被static修飾的內容隨著類的載入而載入(隨類的消失而消失,生命週期最長,存在方法區中)
    B、優先於物件存在

    C、可以直接通過類名呼叫

    D、被該類下所有物件共享

 

(4)注意事項
    A、靜態方法只能訪問靜態成員變數和靜態成員方法,即靜態只能訪問靜態
    B、靜態內容可以通過物件呼叫,也可以通過類名呼叫。推薦使用類名呼叫
    C、在靜態方法中是沒有this和super關鍵字,因為靜態是隨著類的加載而載入。而this是物件建立才存在的

 

8、繼承

(1)什麼是繼承

    A、多個類中存在相同屬性和行為時,將這些內容抽取到單個類中,那麼多個類無需在定義屬性和行為,只需要繼承即可

    B、多個類稱為 子類或派生類, 單個類稱為父類或者超類

    C、通過extends關鍵字讓他們產生關係

 

(2)繼承的好處及特點

    好處:
        A、提高程式碼的複用性
        B、讓類與類產生關係,是多型的前提
    特點:
        A、JAVA中的只支援單繼承,不支援多繼承。(因為會出現呼叫不明確的問題)
        B、JAVA支援多層繼承 (繼承體系)

 

(3)、什麼時候使用繼承
    子類是父類的一種,就使用繼承
    注意:不要為了獲取某個功能而去繼承

 

9、this 和super比較

(1)概念上的區別

    super代表的是父類記憶體空間標識

    this代表的是本類物件的引用


(2)什麼時候使用super
    A、當子父類中出現同名成員時可以用super區分
    B、子類呼叫父類的構造方法可以用super(引數)
     

(3)呼叫方式

    A、super: 

        呼叫構造方法:super()

        呼叫成員變數:super.變數名

        呼叫成員方法:super.方法名()

    B、this: 

        呼叫構造方法:this() 

        呼叫成員變數:this.變數名

        呼叫成員方法:this.方法名()

 

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a>、期待與您交流! ----------


相關文章