------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流!
一、什麼是面向對象
當你想要用一件東西完成一個動作或做一件事情時,這個動作或這件事情是這件東西可以完成的動作,我們要做的就是指揮這件東西,告訴它去做。比如開門, 我們只是轉一下把手,給門一個要打開的信號,然後門通過自己具備的功能,轉動門軸、合頁等,實現門的打開。這就是Java中的面向對象的思想。C語言中是面向 過程思想,強調功能行爲,例如:打開門——關閉門。而Java中的面向對象的思想是基於面向過程的思想而來的,強調具有功能的對象,例如:門打開——門關閉。 在面向對象的思想中,操作者變成了調用者,通過調用對象,來實現相關需求。
面向對象的特點 :
面向對象是一種符合人們思考習慣的思想,可以將複雜的事情簡單化,將程序的執行者轉化爲調用者。 在操作中,應先去尋找封裝了所需功能的對象來調用。沒 有的話就創建一個封裝所需功能的對象。 這樣做可以簡化開發也可以提高複用性。Java的開發過程就是不斷的創建對象,使用對象,指揮對象做事情的。而設計的 過程就是在管理和維護對象之間的關係。
面向對象的特徵:封裝(encapsulation),繼承(inheritance),多態(polymorphism).
二、怎麼用面向對象
1.類和對象
使用計算機語言就是不斷的描述現實生活中的事物,而Java中描述事物通過類的形式體現,類是具體事物的抽象。生活中描述事物就是描述事物的屬性和行 爲,如人的年齡、人的身高等屬性以及說話吃飯等行爲。Java中就是用類class來描述對象的屬性和行爲。定義一個類就是定義在類中的成員(成員變量(對應屬性)和成 員函數(對應行爲))。而對象是該類事物實實在在存在的個體。類和對象的關係就如同設計汽車的圖紙與汽車的關係,圖紙就是類,汽車就是具體的對象。
定義一個簡單的類,並創建它的對象。如:
class Demo
{
public static void main(String[] args)
{
//創建student的一個對象。
Student s=new Studnet();
//給對象的屬性賦值。
s.name="小明";
//調用對象的動作
s.speak();
}
}
//定義一個表示學生的類,類中定義學生的姓名、年齡屬性,以及學習的行爲。
class Student
{
String name;
int age;
public void study(){
System.out.println("在學習");
}
}
2.成員變量和局部變量
兩者在作用範圍和內存中分配不同。成員變量定義在類中,在整個類中都可以被訪問;成員變量隨着對象的建立而建立,存在於對象所在的堆內存中。並且有 默認的初始化值。
局部變量只定義在局部範圍內,如:函數、語句內等,局部變量存在與棧內存中。作用的範圍結束,變量空間會自動釋放,並沒有默認的初始化值。
3.匿名對象
對象的簡化。在兩種情況下可以使用匿名對象:當對對象僅調用一次時或者將匿名對象作爲實際參數進行傳遞。如果對一個對象的成員進行多次調用時,就不 能用匿名對象了。
4.封裝
封裝是面向對象的三大特徵之一,是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。就是定義類時把不需要對外提供的屬性或方法都隱藏 起來了,對於隱藏起來的屬性,類中定義了公共方法對其訪問。封裝能夠將變化隔離,便於使用,提高代碼的重用性與安全性。
而私有(private)是封裝最常見的表現形式。private:權限修飾符,用於修飾類中的成員(成員變量、成員函數),私有的成員只在本類中有效。在以後的 操作中,定義一個類通常將成員變量私有化,對外提供對應的set,get方法對其進行訪問。這樣做提高了數據的安全性。
如下圖:
class Demo
{
public static void main(String[] args)
{
//創建student的一個對象。
Student s=new Student();
//調用訪問方法,給對象年齡賦值。
s.setName("小明");
//調用獲取方法,獲取對象年齡。
s.getName();
}
}
//定義一個表示學生的類,類中定義學生的姓名屬性,以及學習的行爲。
class Student
{
//將成員屬性name私有
private String name;
//提供訪問方法
public void setName(String studentName){
name=studentName;
}
//提供獲取方法
public String getName(){
return name;
}
public void study(){
System.out.println("在學習");
}
}
5.構造函數
構造函數的函數名與類名同名,不用定義返回值類型,不可以寫return語句。構造函數是用來給對象進行初始化的。當一個類中沒有定義構造函數時,
系統會默認給該類加入一個空參數的構造函數。當類中自定義了構造函數之後,默認的構造函數就沒有了。 構造函數與一般函數除了在寫法上有很大不 同,在運行時也有很大不同,構造函數在對象一建立就運行,給對象初始化,而一般方法是對象調用才執行;一個對象建立,構造函數只運行一次,而一 般方法可以被對象調用多次。當分析事物時,如果該事物存在具備一些特性或者行爲,那麼可以將這些內容定義在構造函數中。
構造代碼是給對應的對象進行初始化,而構造代碼塊是給所有對象初始化。當對象一建立,構造代碼塊就運行,而且優先於構造函數。構造代碼塊中 定義的是不同對象共性的初始內容。
例如:
class Demo
{
public static void main(String[] args)
{
//創建student的一個對象。
Student s=new Student("小明");
//調用方法
s.study();
}
}
//定義一個表示學生的類,類中定義學生的姓名屬性,以及學習的行爲。
class Student
{
//將成員屬性name私有
private String name;
//定義構造函數
Student(String name)
{
this.name=name;//this表示初始化的對象,因爲成員變量名和局部變量名一樣,所以用this加以區分。
System.out.println("我的名字是"+name);
}
//定義構造代碼塊
{
System.out.println("我是一名學生");
}
//提供訪問方法
public void setName(String name){
this.name=name;
}
//提供獲取方法
public String getName(){
return name;
}
public void study(){
System.out.println("在學習");
}
}
執行結果
6.this關鍵字
從上面的程序可以瞭解this關鍵字的用法,this代表它所在函數所屬對象的引用,就是哪個對象在調用this所在的函數,this就代表哪個對象。當定義類 中功能時,該函數內部要用到調用該函數的對象時,就用this來表示這個對象。
this語句:是用於構造函數之間進行相互調用的。this語句只能定義在構造函數的第一行,因爲初始化要先執行。一般函數不能直接調用構造函數,因 爲this語句不能用在一般函數中,只能用在構造函數間。
例如:
Student(String name)
{
this.name=name;
}
Student(String name,int age)
{
this(name);
this.age=age;
}
this關鍵字有時可以不寫,系統會默認爲引用所在函數的對象,但當出現成員變量和局部變量同名時,就必須寫上this,加以區分。構造函數間調用時要用上this語句。
7.static關鍵字
static:靜態修飾符,用於修飾類中的成員(成員變量和成員函數)。當成員被靜態修飾後,除了可以被對象調用外,還可以直接被類名調用(類名.靜態 成員)。靜態成員隨着類的加載而加載,也隨着類的消失而消失,生命週期長。靜態成員先於對象存在。靜態成員可以被所有對象共享。由於靜態成員可以直接被類名調用,所以靜態成員變量又稱爲類變量。而非靜態成員變量成爲實例變量。
實例變量和類變量的區別:類變量隨着類的加載而存在於方法區中,實例變量隨着對象的建立而存在於堆內存中;類變量生命週期最長,隨着類的消 失而消失。實例變量生命週期短,隨着對象的消失而消失。
當對象中出現共享數據時,該數據可以被靜態所修飾,對象中的特有數據要定義成非靜態存在於堆內存中;當功能內部沒有訪問到非靜態數據(對象的 特有數據),那麼該功能可以定義成靜態的。
定義靜態變量,可以對共享數據進行單獨空間的存儲,節省內存空間,但生命週期過長;定義靜態方法,只可以訪問靜態成員(非靜態方法既可以訪問 靜態也可以訪問非靜態),具有侷限性。靜態方法中不可以定義this、super關鍵字,因爲靜態優先於對象存在,所以靜態方法中不可以出現this。
主函數是靜態的。
靜態代碼塊:隨着類的加載而執行,執行一次。並優先於主函數。用於給類進行初始化。
格式:static{執行語句}
8.主函數
一個特殊的函數。作爲程序的入口,可以被JVM調用。
主函數的定義:
public:代表着該函數訪問權限是最大的。
static:代表主函數隨着類的加載就已經存在了。
void:主函數沒有具體的返回值。
main:不是關鍵字,但是是一個特殊的單詞,可以被JVM識別。
(String[] arr):函數的參數,參數類型是一個數組,該數組中的元素是字符串。字符串類型的數組。
args:arguments 參數 。唯一可以更改的地方。
9.對象的初始化過程:
1.把類名.class文件加載到內存中。
2.執行該類中的static代碼塊,如果有的話,給該類進行初始化。
3.在堆內存中開闢空間,給對象分配內存地址。
4.在堆內存中建立對象的特有屬性,並進行默認初始化。
5.對屬性進行顯示初始化。
6.對對象進行構造代碼塊初始化。
7.對對象進行構造函數初始化。
8.將內存地址賦給棧內存中的對象變量。
10.單例設計模式
設計模式是指解決某一問題最行之有效的方法。Java中有23種設計模式。單例設計模式是經常會用到的一種模式。單例設計模式中一個類在內存中只 存在一個對象,保證了內存中的對象唯一性。單例設計模式有兩種格式:懶漢式和餓漢式。
(1)餓漢式:餓漢式中先建立對象,class類一加載進內存,就創建該類對象。在實際開發中,經常使用餓漢式,保證程序的安全性。
class Single
{
//將構造函數私有化
private Single(){}
//在類中創建本類對象
public static Single s=new Single();
//提供獲得該類對象的訪問方式
public static Single getInstance(){
return s;
}
}
(2)懶漢式:方法被調用時,纔在內存中創建對象。即對象的延時加載。
class Single
{
//將構造函數私有
private Single(){}
//定義引用變量
public static Single s=null;
//提供獲得該類對象的訪問方式
public static Single getInstance(){
//創建本類對象
if(s==null)
s=new Single();
return s;
}
}
-------------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------