再次瞭解JAVA中的面向物件實現
從學習java語言開始,就知道java是面向物件的。最開始的理解,就是java支援一種語法,一種面向物件的語法,例如:
Pencil pencil = new Pencil();
peicil.wright();
就是一個鉛筆物件,有一個功能,就是寫.最初只是背下來這種語法.並沒有深入的去理解.最近抽時間,學習了一下go語言,在學習過程中,意外的瞭解了java中面向物件的實現方法.
java的一個特點,就是封裝,封裝的主要內容,是兩項,一項是變數,另外一項是方法.將這兩項內容進行封裝,就構成了物件.物件主要包括的,也是這兩項內容.在c語言中,最初定義的對資料操作的集合,是函式.函式,這個是很好理解的.
函式:就是針對輸入和輸出之間建立起來的一種規則.
在c語言中,函式是獨立的,是不依賴雨上下文的.也就是說,這個函式,無論在哪裡使用,都是可以的(忽略許可權問題),效果都是相同的.但是在java語言中,由於有封裝的特性,"函式"就有了上下文.也就是說,"java"中的函式,是依賴於上下文"物件"來使用的.為了區別表示,也就不能再用"函式"這個名稱了,於是就改叫做"方法".
從c的自由,直接轉向java的束縛,驚喜來的太突然,往往讓我們看不清事實的真相.在轉換過程中,究竟發生了什麼?在長達兩年的時間裡,我不知道發生了什麼.甚至從來沒有想過,這裡面會有什麼.
但是在我學習go語言的過程中,有趣的事情發生了.<go語言程式設計>這本書裡面提到,淺顯一點的理解,面向物件和麵向過程,在使用層面上,只不過是語法上的區別罷了.
例如:
function boolean Bigger(int fir,int sec){
return fir > sec;
}
上面是標準的面響過程的寫法(此處拋開java的語法結構,單純的理解為C語言的語法結構)
而下面的寫法,則是面向物件的寫法。
function (*Object obj) boolean Bigger(int fir,int sec){
return fir > sec;
}
上面的語法結構,表示呼叫Bigger方法的上下文(物件)為obj,返回值為boolean型別。引數是fir和sec。為函式的執行指定一個特定的上下文,就變成了面向物件。
努力的看到這裡,肯定也就茅塞頓開,明白了看似很先進的面向物件的實現過程。
如果對java稍微有一點了解,看到現在,也就明白了java中為什麼會有this關鍵字了。
每個方法,都會有一個預設的this指標,用來限定方法執行的上下文。
前面我們已經提過了,java中的物件,是封裝了欄位和方法,兩項內容。
簡單的說就是對資料結構和運算邏輯進行了封裝。我們在描述一項事物的時候,最簡單的就是進行資料量化描述。例如,你描述你女朋友,可能是身高170cm,體重50kg。這就是物件裡面的欄位。用來存放資料的。
再高階一點,在描述過程中,加入物件的一些功能。例如:你的女朋友有洗衣服的功能(雖然很多沒有)。這就是方法。
將欄位和功能性的方法封裝在一起,並規範上下文的範圍,就形成了物件。
而在實現過程中,需要額外新增內容,只有this指標。在欄位和方法的使用過程中,新增指標,就形成了新的面向物件的特性。