一面向對象概念
1 理解面向對象
(1) 面向對象是相對面向過程而言。
(2)面向對象和麪對過程都是一種思想。
(3)面向過程強調的功能行爲。
(4)面向對象將功能封閉成對象,具備了功能的對象。
(5)面向對象是基於面向過程的。
(6)面向對象的三個特徵:封裝,繼承,多態。
2面向對象要點
(1)相對於過程,面向對象使問題更加簡單化。
(2)對象不只是指人,萬物皆可爲對象。
(3)面向對象使執行者變爲指揮者。
(4)開發時,先找對象,再找功能,找到了直接用。
(5)沒有對象時,創建對象再用。
2類與對象的關係
(1)類:對現實生活中的事物的描述 (對象的抽象)
(2)對象:就是這類事物實實在在的個體(類的實例)
3.main函數
public static void main(String[] args)
public :代表着該函數的訪問權限是最大的。
static :主函數是靜態的,代表主函數隨着類的加載就已經存在。
void :主函數的返回值沒null 沒有具體返回值。
main:不是關鍵字,但是一個特殊的詞,可以被jvm所識別。
(String[] args) 函數的參數,參數類型是一個數組,該數組中的元素是字符串,JVM在調用主函數時,傳入的是new String[0];
4 成員變量和局部變量
(1)作用範圍
成員變量作用於整個類中
局部變量作用於函數中,或者語句中。
(2)在內存中的位置:
成員變量:在堆內存中,因爲對象的存在纔在內存中存在。
局部變量:在棧內存中。
(3)main函數注意點:
在類中寫主函數代表該類可獨立運行
可在本類中創建本類對象,但一般不這樣做。
5 匿名對象
(1)匿名對象是對象的簡化形式。
(2)匿名對象調用屬性沒意義,調用方法有意義,因爲方法裏有內容。
(3)匿名對象兩種使用情況:
<1>當對對象方法僅進行一次調用時。如:new Car().run();
<2>作爲實際參數進行傳遞時。
(4)代碼演示:
public static void main(String[] args)
{
show(new Car());
}
public static void show(Car c)
{
c.num = 3;
c.color = "black";
c.run();
}
(5)注意:
<1>當對一個對象進行多個成員調用時,就必須給這個對象起個名字。
<2>匿名對象作參數,show方法執行完,對象就釋放內存。
二 封裝
1封裝概述
(1): 指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
(2)好處:
將變化隔離
便於使用
提高重用性
提高安全性
(3)封裝原則 :
將不需要的對外提供的內容都隱藏起來。
把屬性都隱藏,提供公共方法對其訪問。
(4) 函數,類,包 和框架 都是封閉體。2 封裝private
(1) private關鍵字
private是一個權限修飾符。用於修飾成員(成員變量和成員函數,內部類) 被私有化的成員只有在本類中有效。
(2)要點說明:
<1>將成員變量私有化, 對外提供對應的set,get方法對其進行訪問,提高對數據訪問安全性。
<2>將屬性私有化以後,類以外即使建立了對象也不能直接訪問。
<3>私有僅僅是封裝的一種表現形式,權限在訪問不到的範圍內都是封裝。
<4>在訪問方式中可加入邏輯判斷語句,提高代碼健壯性。
三 構造函數
1 特點:
(1) 函數名與類名相同
(2)不用定義返回值類型
(3)不可以寫return語句
2 作用:給對象進行初始化
3 注意:
(1)對象一建立就會調用 與之相對應的構造函數。若訪問不到相應的構造函數,則對象不能建立。
(2)當一個類中沒有定義構造函數時, 系統會默認給該類加入一個空參數的構造函數。
(3)在類中自定義了構造函數後,默認的構造函數就沒有了。
(4)多個構造函數是以重載的形式存在的。
4.構造函數與一般函數的區別:
(1)構造函數是在對象一建立就運行,而一般方法是對象調用才運行。
(2) 一個對象建立,構造函數只運行一次,而一般方法可多次被調用。
5 何時定義構造函數?
(1) 當分析事物時, 該事物具備一些特性或行爲,那麼將這些內容定義在構造函數中。
6.構造代碼塊。
(1)作用:給對象進行初始化。對象一建立就運行,並且優先於構造函數執行。
(2)和構造函數的區別:
構造代碼塊是給所有對象進行統一初始化
構造函數是給所對應的對象進行初始化。
(3) 構造代碼塊中定義的是不同對象共性的初始化內容。
四 this 關鍵字
1. this關鍵字
this 是用於區分局部變量和成員變量同名的情況。
this代表它所在函數所屬對象的引用。
哪個對象在調用 this所在的函數,this就代表哪個對象。
2.this的應用
(1) 當定義類中的功能時,該函數內部要用到調用 該的對象時, 這時用this來表示這個對象。
(2)但凡本類功能內部使用了本類對象,都使用this來表示。
3 代碼示例:
class Person
{
private int age;
Person(int age)
{
this.age = age;
}
public boolean compare(Person p)
{
return this.age == p.age;
}
}
}
3.this在構造函數間的調用
(1)this的調用
<1>this語句: 用於構造函數之間進行互相調用 。
<2>this語句只能定義在構造函數的第一行,因爲要初始化要先執行。
(2)this的兩種用法:
<1>用於區分同名變量的情況。
<2>用於構造函數間調用 ,一般函數是不能直接調用構造函數的。
(3)代碼演示:
class Person
{
private String name;
private int age;
Person()
{
System.out.println("hello");
}
Person(String name)
{
this();
this.name = name;
}
Person(String name,int age)
{
this(name);//構造函數間的相互調用
this.age = age;
}
}}
五 static 關鍵字
1.用法:
(1)是一個修飾符 ,用於修飾成員(成員變量和成員函數,內部類)
(2) 當成員被靜態修飾後,就多了一個調用方式,除了被對象調用外,還可以直接被類名調用,格式:類名.靜態成員。
2 static 特點:
(1)隨着類的加載而加載。
(2)優先於對象存在。
(3)被所有的對象所共享。
(4)可直接被類名調用 。
3.實例變量和類變更的區別:
(1)存放位置:
類變量隨着類的加載而存放於方法區中。
實例變量隨着對象的加載而存放於堆內存中。
(2)生命週期:
類變量生命週期長,隨着類的消失而消失。
實例變量生命週期隨着對象的消失而消失。
4.靜態使用注意事項:
靜態方法只能訪問靜態成員。非靜態方法即可以訪問靜態也可以訪問非靜態。
靜態方法只不可以定義this super關鍵字。因爲靜態優先於對象,所以靜態方法中不可以出現this.
5 靜態的利與弊:
(1)利:
節省空間。
可直接被類名調用。
(2)弊:
生命週期過長。
訪問出現侷限性。(靜態雖好,只能訪問靜態)
6.什麼時候使用靜態
(1)什麼時候定義靜態變量(類變量)
當對象中出現共享數據時,該數據被靜態所修飾。對象中的特有數據要定義成非靜態存在於堆內存中。
(2)什麼時候定義靜態函數
當功能內部沒有訪問到非靜態數據(對象的特有數據),那麼該功能就可以定義成靜態的。
7.靜態代碼塊:
(1)格式:
static
{
靜態代碼塊中的執行語句;
}
(2)特點:
隨着類的加載而執行,只執行一次,並優先於主函數執行,用於給類進行初始化。
六 對象的初始化過程
Person p = new Person("lisi",20);該句話都做了什麼?
(1)因爲new用到了Person.class,所以會先找到Person.class文件並加載到內存中。
(2)執行該類中的static代碼塊,如果有的話,給Person.class類進行初始化。
(3)在堆內存中開闢空間,分配內存地址。
(4)在堆內存中建立對象的特有屬性,並進行默認初始化。
(5)對屬性進行顯示初始化。
(6)對對象進行構造代碼塊初始化。
(7)對對象進行對應的構造函數初始化。
(8)將內存地址賦給棧內存中的引用變量p。
七 製作幫助文檔
(1)幫助文檔就是類的說明書,可幫助更好地使用類和程序。
(2)製作幫助文檔使用的是javadoc.exe工具
F:\haima>javadoc -d myhelp -author -version ArrayTool.java
(3)注:
<1>凡是public修飾的功能都用文檔註釋來描述,因爲都可以被文檔註釋工具所提取。
<2>只有public和protect修飾的類纔可被提取生成文檔。
<3>類中默認的構造函數的權限和所屬類一致。且默認構造函數的權限是隨着
類的變化而變化的。
八 單例設計模式
1.設計模式
(1)設計模式:解決某一類問題最行之有效的方法。java中有23種設計模式。
(2)單例設計模式:解決一個類在內存中只存在一個對象的問題。
2.單例設計的思想與步驟:
(1)將構造函數私有化。
(2)在類中創建一個本類對象。
(3)提供一個方法可以獲取到該對象。
3.單例設計模式方式一:餓漢式(開發一般用這個)
代碼示例:
class Single
{
private Single(){}
private static final Single s = new Single();
public static Single getInstance(){
return s;
}
}
4:單例設計模式方式二:懶漢式
(1)對象是方法被調用時,才初始化 也叫對象的延遲加載。
Single類進內存,對象還沒有存在。只有調用了getInstance方法才建立對象
代碼示例:
class Single
{
private staitc Single s = null;
private Single(){}
public static Single getInstance()
{
if(s == nul)
s = new Single();
return s;
}
}
實例的延遲加載,多線程訪問時會出現安全問題。使用判斷優化如下:
public static Single getInstance()
{
if(s == null)
{
synchronized(Single.class)
{
if(s == null)
s = new Single();
}
}
return s;
}