面向物件思想
前言
計算機的革命起源于機器,所以說,編程語言的產生也是始于對機器的模仿,在19世紀的早期就已經出現過計算機的雛形,那時,人們為了構建導航所需的表格對計算機產生了需求,于是有一個叫做"查爾斯巴貝奇"的人在英格蘭就設計了一臺叫做差分機的計算裝置,它能夠自動地計算構造出數學表所需的多項式的值,

遺憾的是,巴貝奇最后并沒有完成它的差分機,差分機后來在1855年由Per Georg Scheutz在瑞典制造
而巴貝奇設計的機器叫做分析機,在1871年巴貝奇去世之前,他也只來得及做出其中的一部分以測驗他的概念是否可行,分析機是一個完全的機械裝置,擁有完成計算的處理單元,輸入輸出資料的手段,以及一個穿孔木片的存盤器能夠保存資料和程式,
巴貝奇的計算器

巴貝奇的分析機

巴貝奇分析機在計算機發展史上有著非常重要的地位,一些早期的計算機先驅都受到了巴貝奇作業的啟迪甚至有人認為,巴貝奇的分析機比20實際40年代的早期電子計算機更先進,更接近現代的計算機
"奧古斯塔 阿達 金"是一位英國作家,數學家,她也曾與巴貝奇一起制作分析機,1842年她翻譯了意大利數學家"路易吉 蒙博"所撰寫的關于分析機的備忘錄,作為作業的一部分,她重寫了包括用分析機計算伯努利數的一系列注釋,由于這一作業,阿達被認為是撰寫計算機程式的第一人,阿達之后經過了大約一百年的技術進步,人類才能真正地撰寫和運行程式,

計算機程式
計算機上執行的代碼表示為二進制 1 和 0 組成的串,它被稱作機器碼,每種計算機它都只能執行一種特定的機器碼,人類可讀的機器碼就比如ADD,R0,Time這種叫做匯編語言,能夠在型別完全不同的計算機上運行,與底層計算機體系結構幾乎沒有關系的代碼叫做高級語言,比如C語言,C++語言,Java語言等,在執行之前,高級語言程式必須首先被編譯成計算機的本地機器碼,
面向程序語言
面向程序和面向物件都是對軟體分析、設計和開發的一種思想,它指導著人們以不同的方式去分析、設計和開發軟體,
早期最具有代表性的面向程序語言如C語言、Fortran語言
C語言的運用非常之多,它兼顧了高級語言和匯編語言的優點,相較于其它編程語言具有較大優勢,計算機系統設計以及應用程式撰寫是C語言應用的兩大領域,同時,C語言的普適較強,在許多計算機作業系統中都能夠得到適用,且效率顯著,
Fortran語言的最大特性是接近數學公式的自然描述,在計算機里具有很高的執行效率,易學,語法嚴謹,可以直接對矩陣和復數進行運算,這一點類似matlab,自誕生以來廣泛地應用于數值計算領域,積累了大量高效而可靠的源程式,很多專用的大型數值運算計算機針對Fortran做了優化,廣泛地應用于并行計算和高性能計算領域,Fortran90,Fortran95,Fortran2003的相繼推出使Fortran語言具備了現代高級編程語言的一些特性,
面向程序的思想
面向程序的思想就好比假如我要買一個筆記本電腦來打游戲,那么我們的步驟就是取錢,走到店里,把錢交給老板,然后把電腦帶回家下載游戲即可,但是假如我要造一臺筆記本電腦來玩游戲,那么使用面向程序的思想就有點不太合適了,因為造一臺筆記本電腦需要很多很多的配件,一個一個列出來是很復雜的,因此面向物件的思想就誕生了~
面向物件思想
面向物件的思想更契合人的思維模式,我們需要思考的是,筆記本是由哪些配件組成,然后我們就會根據需要的那些配件來找到專門制作的廠商進行購買或者自行研發來組成一個筆記本電腦,
訪問權限控制
在Java語言中提供了訪問權限修飾詞,以供類別庫開發人員向客戶端程式員指明哪些是可用,哪些是不可用,訪問權限的控制等級從最大權限到最小權限的順序依次為
public int A; //所有類都可以訪問
protected int B; //子類可以直接訪問
int C; //同一個包下,物件可以訪問
private int D; //任何情況下外界都無法訪問
初始化和清理
初始化和清理是設計安全的兩個問題,許多C語言出現的錯誤都是程式員忘記初始化變數,清理也是一個特殊的問題,當使用完一個元素的時候,程式員很容易把它忘記,這樣一來,這個元素占用的資源就會一直得不到釋放,結果就是資源用盡,
在C++里面提供了構造器的概念,這是一個在創建物件時自動呼叫的方法,Java也提供了這個概念,并且還額外提供了垃圾回收器,對于不再使用的資源,垃圾回收器會將其釋放,
雖然Java有垃圾回收器負責回收無用物件占據的記憶體資源,但是也有特殊情況,假如你的物件獲得了一塊特殊的記憶體區域,由于垃圾回收器只知道分配那些由new分配的記憶體,所以它不知道該如何釋放這塊特殊的記憶體,為了應付這種情況,Java允許在類中定義一個名為finalize()的方法,它的作業機制就是一旦垃圾回收器準備好釋放物件占用的存盤空間,將首先呼叫finalize()的方法,并且在下一次垃圾回收的動作發生時,才會真正回收物件占用的記憶體,所以使用finalize(),就能在垃圾回收時刻做一些重要的清理作業,
但是有一點需要注意,不要把finalize()當成是C++里面的解構式,在C++里面,物件最終一定會被銷毀,而在Java中的物件卻并不一定每次都會被回收,所以得出的總結是,物件不一定會被垃圾回收,垃圾回收也不等于解構式~
在C++中,所有的物件都會被銷毀,或者說應該會被銷毀,如果在C++中創建了一個區域物件(也就是在堆疊上創建),這個時候物件的銷毀動作就會發生在此物件作用域的末尾處,如果物件是用new創建的,那么當 程式員使用C++呼叫delete操作時,就會呼叫回應的解構式,如果程式員忘記呼叫delete,那么就永遠不會呼叫解構式,這樣就會出現記憶體的泄露,物件的其他部分也不會得到清理,這種缺陷也很難跟蹤,
而在java里面呢,是不允許創建區域物件的,在Java中也沒有用于釋放物件的delete,或者free,因為垃圾回收器會幫助你釋放存盤空間,由于垃圾處理機制的存在使得Java沒有解構式,然而隨者學習的深入就會慢慢明白,垃圾回收器的存在并不能完全替代解構式,如果希望進行釋放存盤空間之外的清理作業,還是得明確呼叫恰當的某個Java方法,這就類似于解構式了,只是沒有那么方便~
繼承
Object類是所有Java類的根基類,也就意味著所有的Java物件都擁有Object類的屬性和方法,如果在類的宣告中未使用extends關鍵字指明其父類,則默認繼承Object類,
Object類中的方法
| boolean equals(Object obj) | 指示其他某個物件是否與此物件“相等”, |
| Class<?> getClass() | 回傳此 Object 的運行時類, |
| int hashCode() | 回傳該物件的哈希碼值, |
| void notify() | 喚醒在此物件監視器上等待的單個執行緒, |
| void notifyAll() | 喚醒在此物件監視器上等待的所有執行緒, |
| String toString() | 回傳該物件的字串表示, |
| void wait() | 在其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法前,導致當前執行緒等待, |
| void wait(long timeout) | 在其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前執行緒等待, |
| void wait(long timeout, int nanos) | 在其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法,或者其他某個執行緒中斷當前執行緒,或者已超過某個實際時間量前,導致當前執行緒等待, |
| protected Object clone() | 創建并回傳此物件的一個副本, |
| protected void finalize() | 當垃圾回收器確定不存在對該物件的更多參考時,由物件的垃圾回收器呼叫此方法, |
super關鍵字
super“可以看做”是直接父類物件的參考,每一個子類物件都會有一個super參考指向其直接父類物件,
class Parent{
public static String color;
public void getColor() {
System.out.println("color = " + color);
}
}
public class Test extends Parent{
public void function() {
super.color = "red";
super.getColor();
}
}
多型
多型指的是同一個方法呼叫,由于物件不同可能會有不同的行為,多型是方法的多型,不是屬性的多型,多型的存在要有3個必要條件:繼承,方法重寫,父類參考指向子類物件,父類參考指向子類物件后,用該父類參考呼叫子類重寫的方法,此時多型就出現了,
class Language{
public Language() {
}
public void talk() {
System.out.println("人類用語言交流");
}
}
class Chinese extends Language{
//重寫了父類方法
public void talk() {
System.out.println("中國人用漢語交流");
}
}
class English extends Language{
//重寫了父類方法
public void talk() {
System.out.println("英國人用英語交流");
}
}
public class ProjectTest{
public static void main(String[] args) {
//現在我們直接new Language物件
Language language = new Language();
language.talk();
//多型,父類可以直接new子類
Language chinese = new Chinese();
chinese.talk();
Language english = new English();
english.talk();
}
}
抽象類
使用abstract修飾的類,通過abstract方法定義規范,然后要求子類必須定義具體實作,通過抽象類,我們就可以做到嚴格限制子類的設計,使子類之間更加通用,而使用abstract修飾的方法,沒有方法體,只有宣告,定義的是一種“規范”,就是告訴子類必須要給抽象方法提供具體的實作,
普通的方法可以在抽象類里面實作,但是抽象方法,在抽象類里面只可以宣告,然后必須在子類里面實作,
abstract class Test{
public void method() {
System.out.println("我是抽象類中的普通方法");
}
public abstract void function();
}
public class ProjectTest extends Test{
@Override
public void function() {
System.out.println("我是實作抽象類宣告的方法");
}
}
介面
介面關鍵字使得抽象的概念又更近了一步,interface定義的變數僅僅只是宣告,完全靠子類實作,介面更多的是用來建立類與類之間的協議,是一種標準,介面中的方法型別默認為public,并且也無法宣告成其他訪問權限,寫不寫都是public,
interface A{
void function();
}
public class ProjectTest implements A{
@Override
public void function() {
System.out.println("我是實作介面宣告的方法");
}
}
內部類
在Java中,我們可以把一個類定義在另一個類的內部,稱之為內部類,作為類的成員存在,和成員變數、成員方法、構造方法、代碼塊并列,因為是類的成員,所以非靜態成員內部類可以使用public、protected 、默認、private修飾,而外部類只能使用public、默認修飾,
內部類可以直接訪問外部類的成員,外部類不能直接訪問內部類的成員,需要先創建物件再通過物件名訪問
內部類提供了更小的封裝,只能讓外部類直接訪問,不允許同一個包中的其他類直接訪問,內部類可以直接訪問外部類的私有屬性,內部類被當成其外部類的成員, 但外部類不能訪問內部類的內部屬性,介面只是解決了多重繼承的部分問題,而內部類使得多重繼承的解決方案變得更加完整,用匿名內部類實作回呼功能,我們用通俗講解就是說在Java中,通常就是撰寫一個介面,然后你來實作這個介面,然后把這個介面的一個物件作以引數的形式傳到另一個程式方法中, 然后通過介面呼叫你的方法,匿名內部類就可以很好的展現了這一種回呼功能
public class ProjectTest{
class inside{
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/26477.html
標籤:其他
上一篇:ffmpeg推送本地局域網海康威視攝像頭rtsp流到阿里云上自己搭建的nginx流服務器為什么不穩定
下一篇:求助:potplayer的問題
