面向對象上總結

1、什麼叫面向對象?

面向對象(Object-Oriented,簡稱OO)就是一種常見的程序結構設計方法。面向對象思想的基礎是將相關的數據和方法放在一起,組合成一種新的複合數據類型,然後使用新創建的複合數據類型作爲項目的基礎。

面向對象是一個很抽象的概念,它相對面向過程而言。過程與對象都是一種解決問題的思想。

面向過程:強調的是功能行爲,一種過程,先幹啥,再幹啥;

面向對象:將功能封裝到對象裏,強調的是具備某功能的對象;

按照面向對象的思想,可以把任何的東西看做對象!

 

面向對象的三個特徵:

封裝(Encapsulation);

繼承(Inheritance);

多態(Polymorphism)

package com.laobi.day06;

public class DuiXiang {
	/**
	 * 面向對象:對於面向對象思想,強調的是對象(實體)
	 * C++、Java、C#
	 * 
	 * 
	 * 面向過程:對於面向過程思想,強調的是過程(動作)
	 * 例子:大象裝進冰箱
	 * C語言
	 * 
	 * 面向對象的特點:
	 * 1、面向對象就是一種常見的思想。符合人們的思考習慣
	 * 2、面向對象的出現,將複雜的問題簡單化
	 * 3、面向對象的出現,讓曾經在過程中的執行者,變成了對象的指揮者
	 * 
	 * 用java語言對現實生活中的事物進行描述
	 * 通過類的形式來體現的
	 * 
	 * 怎麼描述呢?
	 * 對於事物描述通常只關注兩方面
	 * 一個是屬性,一個是行爲
	 * 
	 * 只要明確該事物的屬性和行爲並定義在類中即可
	 * 對象:其實就是該類事物實實在在存在的個體。
	 * 
	 * 類與對象之間的關係?
	 * 類:事物的描述
	 * 對象:該類事物的實例。在java中通過new來創建的
	 * 
	 * 成員變量和局部變量的區別:
	 * 1、
	 * 成員變量定義在類中,整個類中都可以訪問。
	 * 局部變量定義在函數,語句,局部代碼塊中,只在所屬都區域有效
	 * 2、
	 * 成員變量存在於堆內存的對象中
	 * 局部變量存在於棧內存的方法中
	 * 3、
	 * 成員變量隨着對象的創建而存在,隨着對象的消失而消失
	 * 局部變量隨着所屬區域的執行而存在,隨着所屬區域的結束而釋放
	 * 4、
	 * 成員變量都有默認初始化值
	 * 局部變量沒有默認初始化值
	 * 
	 * 匿名對象:沒有名字的對象
	 * new Car();//匿名對象。其實就是定義對象的簡寫格式
	 * Car c=new Car()
	 * c.run();
	 * new Car().run()
	 * 
	 * 1、當對象對方法僅進行一次調用對時候,就可以簡化成匿名對象
	 * 2、匿名對象可以作爲實際參數進行傳遞
	 * 
	 * 封裝:是指隱藏對象屬性和實現細節,僅對外提供公共訪問方式
	 * 好處:
	 * 1、將變化隔離
	 * 2、便於使用
	 * 3、提高重用性
	 * 4、提高安全性
	 * 封裝原則:
	 * 將不需要對外的內容隱藏起來
	 * 把屬性都隱藏
	 * 
	 * private:私有,是一個權限修飾符。用於修飾成員
	 *         私有都內容只在本類中有效。
	 *         
	 *  注意:私有僅僅是封裝的一種體現而已。
	 */
	/*  
	 * 描述小汽車
	 * 
	 * 分析:
	 * 1、屬性
	 * 輪胎數
	 * 顏色
	 * 2、行爲
	 * 運行
	 */
	public static void main(String[] args) {
		Car c = new Car();
//		c.color="red";
//		c.num=4;
//		c.run();
		show(c);
	}
	public static void show(Car c)
	{
		c.num = 3;
		c.color="black";
		System.out.println(c.num+"..."+c.color);
	}

}

class Car
{
	int num;
	String color;
	
	void run()
	{
		System.out.println(num+"..."+color);
	}
}
構造函數部分:

package com.laobi.day07;

public class GouZaoHanShu {
	/**
	 * 構造函數
	 * 特點:
	 * 1、函數名與類名相同
	 * 2、不用定義返回值類型
	 * 3、沒有具體的返回值
	 * 作用:給對象進行初始化
	 * 注意:
	 * 1、默認構造函數的特點
	 * 
	 * 
	 * 構造函數:構建創造對象時調用的函數。作用:可以給對象進行初始化
	 * 創建對象都必須要通過構造函數初始化
	 * 
	 * 一個類中如果沒有定義過構造函數,那麼該類中會有一個默認的無參構造函數
	 * 如果在類中定義類指定的構造函數,那麼類中的默認構造函數就沒有了
	 * 
	 * 一般函數和構造函數什麼區別呢?
	 * 構造函數:對象創建時,就會調用與之對應的構造函數,對對象進行初始化
	 * 一般函數:對象創建後,需要函數功能時才調用
	 * 
	 * 構造函數:對象創建時,會調用只調用一次
	 * 一般函數:對象創建後,可以被調用多次。
	 * 
	 * 什麼時候定義構造函數?
	 * 在描述事物時,該事物已存在就具備的一些內容,這些內容都定義在構造函數中
	 * 
	 * 構造函數可以有多個,用於對不同的對象進行鍼對性的初始化
	 * 多個構造函數在類中是以重載的形式來體現的
	 * 
	 * this關鍵字
	 * 特點:this代表其所在函數所屬對象的引用,換言之就是,this在本類對象中的引用
	 * 
	 * 當成員變量和局部變量重名,可以使用this來區分
	 * 
	 * this:代表對象。
	 * this就是所在函數所屬對象的引用
	 * 
	 * this也可以用於在構造函數中調用其他構造函數
	 * 注意:只能定義在構造函數的第一行,因爲初始化要先執行
	 * 
	 */
	public static void main(String[] args) {
		Person p = new Person();
	}

}

class Person
{
	private String name;
	private int age;
	
	Person()
	{
		System.out.println("person run");
	}
	
	public void speak()
	{
		System.out.println(name+"..."+age);
	}
}
靜態部分:

package com.laobi.day07;

public class JingTai {
	 /**
	  * 靜態修飾符
	  * static :用於修飾成員(成員變量和成員函數)
	  * 
	  * 被修飾後的成員具備一下特點
	  * 1、隨着類的加載而加載
	  * 2、優先於對象存在
	  * 3、被所有對象所共享
	  * 4、可以直接被類名調用
	  * 
	  * 使用注意
	  * 1、靜態方法只能訪問靜態成員
	  * 2、靜態方法中不可以寫this、super關鍵字
	  * 3、主函數是靜態的
	  * 
	  * static特點
	  * 1、static是一個修飾符,用於修飾成員
	  * 2、static修飾的成員被所有的對象所共享
	  * 3、static優先於對象存在,因爲static的成員隨着類的加載就已經存在
	  * 4、static修飾的成員多了一種調用方式,就可以直接被類名所調用。
	  * 5、static修飾的數據是共享數據,對象中的存儲的是特有數據
	  * 
	  * 成員變量和靜態變量的區別
	  * 1、兩個變量的生命週期不同。
	  *    成員變量隨着對象的創建而存在,隨着對象的被回收而釋放。
	  *    靜態變量隨着類的加載而存在,隨着類的消失而消失
	  * 2、調用方式不同
	  *    成員變量只能被對象調用
	  *    靜態變量可以被對象調用,還可以被類名調用
	  * 3、別名不同
	  *    成員變量也稱爲實例變量
	  *    靜態變量稱爲類變量
	  * 4、數據存儲位置不同
	  *    成員變量數據存儲在堆內存對對象中,所以也叫對象對特有數據
	  *    靜態變量數據存儲在方法區(的靜態區),所以也叫對象的共享數據
	  *    
	  * 靜態什麼時候用?
	  * 1、靜態變量
	  *    當分析對象中所具備的成員變量的值都是相同的,這時這個成員就可以被靜態修飾
	  *    只要數據在對象中都是不同的,就是對象的特有數據必須存儲在對象中,是非靜態的
	  *    如果是相同的數據,對象不需要做修改,只需要使用即可,不需要存儲在對象中,定義成靜態的
	  *    
	  * 2、靜態函數
	  *    函數是否用靜態修飾,就參考一點,就是該功能是否有訪問到對象中到特有數據
	  *    簡單點說,從源代碼看,該功能是否需要訪問非靜態到成員變量,如果需要,該功能就是非靜態的
	  *    如果不需要,就可以將該功能定義成靜態的.當然也可以定義成非靜態的,但是非靜態需要被對象調用
	  *    而僅創建對象沒有調用非靜態的,沒有訪問特有數據的方法,該對象的創建是沒有意義的
	  *    
	  * 靜態代碼塊:
	  * 隨着類的加載而執行,而且只執行一次
	  * 作用:
	  * 用於給類進行初始化
	  */
	public static void main(String[] args) {
		new Demo().speak();
	}
	

}
class Demo
{
	int age;
	static int num = 9;
	public  void speak()
	{
		System.out.println(num);
	}
}
繼承部分:

package com.laobi.day08;

public class JiCheng {
	/**
	 * 繼承的好處:
	 * 1、提高了代碼的複用性
	 * 2、讓類與類之間產生關係,給第三個特徵多態提供了前提  
	 * 
	 * 在java中支持單繼承,不直接支持多繼承
	 * 單繼承:一個子類只能繼承一個父類
	 * 多繼承:一個子類可以支持多個父類(java中不允許)
	 * java支持多層(多重)繼承
	 * 也就出現了繼承體系
	 * 當要使用一個繼承體系:
	 * 1、查看該體系的頂層類,瞭解該體系的基本功能
	 * 2、創建體系中最子類的對象,完成功能的使用
	 * 什麼時候定義繼承?
	 * 當類與類之間存在所屬關係的時候,就定義繼承
	 * 
	 * 成員變量
	 * 當本類的成員和局部變量同名用this區分
	 * 當子父類中的成員變量同名用super區分
	 * this:代表本類對象的引用
	 * super:代表一個父類空間
	 * 
	 * 成員函數
	 * 當子父類中出現成員函數一摸一樣的時候,會運行子類的函數。
	 * 這種現象稱爲覆蓋操作。這是函數在子父類中的特性
	 * 
	 * 函數的兩個特徵:
	 * 1、重載:同一個類中
	 * 2、覆蓋:在子類中
	 * 
	 * 覆蓋注意事項:
	 * 1、子類覆蓋父類方法時,子類權限必須要大於等於父類的權限。
	 * 2、靜態只能覆蓋,或者被靜態覆蓋
	 * 
	 * 什麼時候使用覆蓋操作?
	 * 當一個類進行子類的擴展時,子類需要保留父類的功能聲明,
	 * 但是要定義子類中該功能特有內容時,就使用覆蓋操作完成。
	 * 
	 * 子父類中構造函數的特點:
	 * 在子類構造對象時,發現訪問子類構造函數時,父類也運行了
	 * 爲什麼呢?
	 * 原因是:在子類的構造函數中,第一行有一個默認的隱式構造函數 super()
	 * 
	 * 在子類實例化過程當中:子類所有的構造函數默認都會訪問空參數的構造函數
	 * 
	 * 爲什麼子類實例化的時候要訪問父類中的構造函數?
	 * 因爲子類繼承了父類,獲取到父類中到內容(屬性),所以在使用父類內容之前
	 * 要看父類是如何對自己對內容進行初始化的。
	 * 所以子類在構造對象時,必須訪問父類中的構造函數
	 * 爲了完成必須這個動作,就在子類構造函數中加入了super語句
	 * 
	 * 如果父類中沒有定義空參數構造函數,那麼子類的構造函數必須用super明確
	 * 要調用父類中哪個構造函數
	 * 
	 * 注意:super語句必須要定義在子類構造函數的第一行。因爲父類的初始化動作要先完成
	 * 
	 * 
	 * 一個對象的實例化過程
	 * Person p = new Person()
	 * 1、jvm會讀取指定路徑下的Person.class文件並加載僅內存,
	 *   並會先加載Person的父類(如果有直接的父類的情況下)
	 * 2、在堆內存中開闢空間,並分配地址值
	 * 3、並在對象空間中,對對象中的屬性進行默認初始化
	 * 4、調用對應的構造函數進行初始化
	 * 5、在構造函數當中,第一行會先調用父類中構造函數進行初始化
	 * 6、父類初始化完畢後,在對子類的屬性進行顯示初始化
	 * 7、在進行子類構造函數的特定顯示初始化
	 * 8、初始化完畢後,將地址值賦值給引用變量
	 * @param args
	 */
	public static void main(String[] args) {
		Student s = new Student();
		s.age=18;
		s.name="旺財";
		s.study();
	}

}

class Person
{
	String name;
	int age;
}
class Student extends Person
{
	public void study()
	{
		System.out.println(name+"...student study..."+age);
	}
}
class Worker extends Person
{
	public void work()
	{
		System.out.println(name+"...worker work..."+age);
	}
}

package com.laobi.day08;

public class DabLiMoShi {
	/**
	 * 設計模式:對問題行之有效的解決方法,其實它是一種思想
	 * 
	 * 單例設計模式
	 *    解決的問題:就是可以保證一個類在內存中的對象唯一性
	 *   
	 *必須對於多個程序使用同一個配置信息對象時,就需要保證該對象的唯一性
	 *
	 *如何保證對象唯一性?
	 *1、不允許其他程序用new創建該類對象
	 *2、在該類創建一個本類實例
	 *3、對外提供一個方法讓其他程序可以獲取對象
	 *
	 *步驟:
	 *1、私有化該類構造函數
	 *2、通過new在本類中創建一個本類對象
	 *3、定義一個公有的方法,將創建的對象返回
	 * @param
	 */
	public static void main(String[] args) {
		System.out.println("Hello,World!");
		Single ss = Single.getInstance();
		System.out.println(ss);
	}

}
class Single
{
	//保證對象的唯一性
	private static Single s = new Single();//類一加載,對象就已經存在
	private Single(){}
	public static Single getInstance()
	{
		return s;
	}
} 
class Single2
{
	 //類加載進來沒有對象,只有調用了getInstance方法時,纔會創建對象
	private static Single2 s = null;
	private Single2(){}
	public static Single2 getInstance()
	{
		if(s==null)
			s = new Single2();
		return s;
			
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章