一. 面向對象的特征
第一個特征:封裝。
什么叫隱藏實現細節?
在這里的PersonDemo類除了創建對象外,還有什么其他作用么?為什么要有這個類出現。、
如果對age賦值為-20,DOS輸出為-20。雖然輸出沒錯,但是不符合事物的基本原則。
之所以會出現這樣的不符合實際情況的數據,那是因為age在直接被其它程序創建對象后訪問。說白了,我創建了一個對象,直接就訪問了對象里的age數據。這就造成了安全隱患,造成了不確定性。
怎么解決這個問題?不允許訪問就可以。可以使用關鍵字private,私有的意思,來實現這個目的。
理清一下思路,為什么要將age私有,就是age可以隨便訪問,同時會往里面賦一些不允許的值,產生安全隱患。
修改程序后,再進行程序執行,DOS直接報錯。意思就是私有的東西只能在本類中有效。其他的里面,即使創建了對象,也訪問不到。
對age進行private之后,得到的結果如下,DOS直接進行了報錯。
結果表明:私有化之后,再去訪問,就代表沒有這個屬性。也就是說把內容全都藏起來,作為對付安全隱患的手段也不合適。或者,直接對外開放也不合適。
直接對外開放,不安全。把它藏起來,訪問不了。因此,要取個折中。
我們把成員變量私有了,但是可以對外提供一些方法。
方法中的age和類的成員變量的age是同一個么?
這里的思想是什么?用通俗的話來說更容易理解,一個房間有一個門,任何人都可以進入,這會造成東西的丟失。現在把這個門換成一堵牆,這樣一來,安全性得到了提高,但是完全無法訪問。折中的辦法就是在門上裝個鎖,只有有鑰匙的人才可以進來。上面多定義的一個方法,就是門上的鎖。通過調用方法,來訪問age變量。而且,我是覺着既然方法里的age和private的age不是一樣的,相當於重新定義了一個age,但是如果是重新定義,不需要書寫類型么?這樣一來,private的age就顯得沒什么用,private關鍵字也就沒什么意義。
int a中的a是輸入到方法中的,它就相當於一把鑰匙,它合不合適,需要用if語句來進行判斷,而if語句只能放在方法中。這就是為什么定義函數的原因。不定義函數,if無法放置在類中。
補充:在門上加上鎖之后,也就定義了一個含有判斷語句的函數之后,類中private化age的語句沒有進行刪除,那么是否意味着,函數中的age可能就是private中的age呢?
對於一個變量,我們對它的操作,通常只有兩個動作,要么給它賦一個值,要么把它的值拿出來用。專業術語叫,設置值和獲取值。通常,設置和獲取會采用一些名詞來表示。
上面兩個方法,一個是對age進行設置,一個是對age進行獲取。
上圖的兩個方法是不一樣的。
set和get兩個方法在java中是很常見的,通常對於描述類中的成員變量,都是私有化的,而且一個變量要對應兩個方法。java中提供了快捷鍵,自動出現設置和獲取兩個類(目前所學的很多都是背后的原理,雖然思維上可以有一些提升,但是在實際的應用中很難用到。)
二. 封裝
通過上面的例子,我們可以明白封裝的定義隱藏屬性和實現細節是什么意思。