Java基础(三)对象与类
1.類的概念:類是構造對象的模板或藍圖。由類構造對象的過程稱為創建類的實例。
2.封裝的概念:封裝(有時稱為數據隱藏)是與對象有關的一個重要概念。對象中的數據稱為實例域,操縱數據的過程稱為方法。對于每個特定的類實例(對象)都有一組特定的實例域值。這些值的幾個就是這個對象的當前狀態。無論何時,只要向對象發送一個消息,它的狀態就有可能發生改變。實現封裝的關鍵在于絕對不能讓類中的方法直接地訪問其他類的實例域。程序僅通過對象的方法與對象數據進行交互。封裝給對象賦予了“黑盒”特征,這是提高重用性和可靠性的關鍵。這意味著一個類可以全面地改變存儲數據的方式,只要仍舊使用同樣的方法操作數據,其他對象就不會知道或介意所發生的變化。
3.對象的三個主要特性:
- (1)行為--可以對對象施加哪些操作,或可以對對象施加哪些方法
 - (2)狀態--當施加那些方法時,對象如何響應
 - (3)標識--如何辨別具有相同行為與狀態的不同對象
 
4.類之間的關系:
- 依賴(uses-a):如果一個類的方法操縱另一個類的對象,就說一個類依賴于另一個類。
 - 聚合(has-a):聚合關系意味著類A的對象包含類B的對象。
 - 繼承(is-a):如果類A擴展類B,類
 
5.封裝的優點
如果需要獲得或設置實例域的值,應該提供下面三項內容:
- 一個私有(private)的數據域
 - 一個公有的(public)域訪問器方法(get())
 - 一個公有的(public)域更改器方法(set())
 
這樣做的好處是,私有的數據域一旦在構造器中設置完畢,就只能通過公有的域訪問器方法對這個私有域進行訪問,同時也只能通過公有的域更改器對這個私有域進行修改。一旦這個域值出現了錯誤,只用調試這個方法就可以了,如果域是public的,破壞這個域的搗亂者可能會出現在任何地方。
6.私有方法
如果希望將一個計算代碼劃分成若干個獨立的輔助部分,通常,這些輔助方法不應該成為公有接口的一部分,這是因為它們往往與當前的實現機制非常緊密,或者需要一個特別的協議以及一個特別的調用次序。最好將這樣的方法設計為private的,因為private方法只能當前類的方法調用,而外部類無法調用。
對于私有方法,如果改用其他方法實現相應的操作,則不必保留原有的方法。只要方法是私有的,類的設計者就可以確信:它不會被外部的其他類操作調用,可以將其刪去。如果方法是公有的,就不能將其刪去,因為其他的代碼很可能依賴它。
7.final實例域
將實例域定義為final時,在構造對象時必須初始化這樣的域。也就是說,必須確保在每一個構造器執行之后,這個域的值被設置,并且在后面的操作中,不能夠再對它進行修改。
8.靜態域
如果將域定義為static,每個類中只有一個這樣的域,而每一個對象對于所有的實例域卻都有自己的一份拷貝。
class Employee{private static int nextId = 1;private int id; }
例如,每一個雇員對象都有自己的id域,但這個類的所有實例將共享一個nextId域。也就是說,如果有1000個Employee類的對象,則有1000個實例域id。但是,只有一個靜態域nextId。即使沒有一個雇員對象,靜態域nextId也存在。它屬于類,而不屬于任何獨立的對象。
9.靜態常量
public class Math{public static final double PI = 3.14159265358979323846;... }如果關鍵字static被省略,PI就變成了Math類的一個實例域。需要通過Math類的對象訪問PI。并且每一個Math對象都有它自己的一份拷貝。如果使用了static,PI就屬于Math類,也就是說,任何調用Math類中PI的值都是唯一的,只有一個。也不用通過Math類的對象才能訪問。同時,前面提到過,最好將實例域設計為private,但是公有常量(final域)設置為public卻沒有問題,因為PI被聲明為final為不可變,所以,不允許再將其他值賦給PI。
10.靜態方法
靜態方法是一種不能向對象實施操作的方法。使用靜態方法時不需要任何類的對象。
public static int getNextId(){return nextId; }Employee類的靜態方法不能訪問Id實例域,因為它不能操作對象。但是,靜態方法可以訪問自身類中的靜態域。
可以通過類名調用這個方法。如果省略了static,那么需要通過Employee類對象的引用調用這個方法。
int n = Employee.getnextId();在下面的兩種情況下使用靜態方法:
- 一個方法不需要訪問對象狀態,其所需參數都是通過顯示參數提供的。(例如,Math.pow(x,a))
 - 一個方法只需要訪問類的靜態域(例如,Employee.getnextId())
 
11.靜態代碼塊
29 // 靜態初始化塊 30 static 31 { 32 Random generator = new Random(); 33 // 設置nextId為0到9999的隨機數 34 nextId = generator.nextInt(10000); 35 }在類的構造方法之前,如果對類的靜態域進行初始化的代碼比較復雜,那么可以使用靜態的初始化塊。將初始化代碼放在一個塊中,并標記關鍵字static。
這樣,在類第一次加載的時候,將會對靜態域進行初始化。與實例域一樣,所有的靜態初始化代碼塊都將依照類定義的順序執行。
12.包作用域
- 標記為public的類、方法或常量可以被任意的類使用。
 - 標記為private的類、方法或常量只能被定義它們的類使用。
 - 如果沒有指定public或private,這個類、方法或常量可以被同一個包中所有方法訪問。
 
13.類設計技巧
- 一定要保證數據私有
 
絕對不要破壞封裝性。有時候需要編寫一個訪問器或修改器方法,但是最好還是保持實例域的私有性。數據的表示形式很可能會改變,但它們的使用方式卻不會經常發生變化。當數據保持私有時,它們的表示形式的變化不會對類的使用者產生影響,即使出現bug也易于檢測。
- 一定要對數據初始化
 
最好不要依賴于系統的默認值,而是應該顯示地初始化所有的數據。具體的初始化方式可以是提供默認值,也可以是在所有構造器中設置默認值。
- 不要在類中使用過多的基本類型
 
即用其他的類代替多個相關的基本類型的使用,這樣會使類更加易于理解且易于修改。
例如:Customer類中包括很多實例域,其中有實例域street,city和state,可以將這三個實例域拿出來用一個Address的新的類替換,從而可以減少Customer類中的實例域個數。
- 不是所有的域都需要獨立的域訪問器和域修改器
 
如果有一些不希望別人訪問或者修改的域,就不要設置域訪問器或域修改器。要根據實際情況和實際需求來設置。
- 將職責過多的類進行分解
 
一種情況是將實現很多功能的類分解成幾個不同的類,這些類分擔原來的類的所有的職責。
- 類名和方法名要能夠體現它們的職責
 - 優先使用不可變的類
 
更改對象的問題在于,如果多個線程試圖同時更新一個對象,就會發生并發更改。其結果是不可預料的。如果類是不可變的,就可以安全地在多個線程間共享其對象。
轉載于:https://www.cnblogs.com/BigJunOba/p/9320719.html
總結
以上是生活随笔為你收集整理的Java基础(三)对象与类的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: ASP.NET Core的身份认证框架I
 - 下一篇: java实现打开新窗口_[Java教程]