ThinkInJava4讀書筆記之第一章對象入門

? ? ?那句話怎么說來著,原句記不住了好像是出來混的遲早要還的。話說當初學校剛開Java課程,自己沒有好好學啊,后來直接做了jsp和servlet,然后學了SSH框架和Extjs、jQuery,接著是mybatis(ibatis)、freemarker、springMVC。在學校實驗室項目也做了一些,這些框架也都用過,有空的時候也讀過ThinkInJava、EffectiveJava和深入Java虛擬機等經典書籍,設計模式的書也看過一本,但是沒有認真做筆記進行總結,所以效果不大啊。現在重新閱讀經典書籍,把筆記整理一下,希望能夠對Java有一個深入的認識。

? ? ?Java中的類邊界關鍵字

? ? ?Java采用三個顯示關鍵字以及一個隱式關鍵字來設置類邊界:public、private、protected以及隱式的friendly,若未明確指定其他關鍵字,則默認為后者。

? ? ?繼承最終會以創建一系列類收場,所有類都建立在統一的接口基礎上。對這樣的一系列類,我們要進行的一項重要處理就是將衍生類的對象當做基礎類的一個對象對待。這樣就只需編寫單一的代碼,令其忽略類型的特定細節,只與基礎類打交道。如通過繼承添加了一種新類型,那么為新類型編寫的代碼會像在舊類型里一樣良好工作,程序具備了擴展能力具有擴展性。

?動態綁定

? ? ?將一條消息發給對象時,如果并不知道對方的具體類型是什么,但采取的行動同樣是正確的,這種情況就叫作“多形性”(Polymorphism)。對面向對象的程序設計語言來說,它們用以實現多形性的方法叫作“動態綁定”。編譯器和運行期系統會負責對所有細節的控制;我們只需知道會發生什么事情,而且更重要的是,如何利用它幫助自己設計程序。

?抽象的基礎類和接口

????abstract?---設計程序時,我們經常希望基礎類只為自己的衍生類提供一個接口。即我們不想其他任何人實際創建類的一個對象,只能上溯造型成它,以便使用它們的接口,為達到這個目的需要把那個類變成“抽象”的。abstract關鍵字描述一個尚未實現的方法。子類要么實現父類中未實現的抽象方法,要么也聲明為abstract類。

? ? ?interface接口將抽象類的概念更延伸了一步,它完全禁止了所有的函數定義。接口可以繼承其他接口,不能繼承普通類或abstract類。接口中可以定義屬性,但是static final的。

對象的創建和存在時間

? ? ?C++注重程序的執行效率,允許程序員做出選擇。存儲以及存在時間可在編寫程序時決定,只需將對象放置在堆棧中或者靜態存儲區即可。這為存儲空間的分配和釋放提供了一個優先級。同時這犧牲了靈活性,因為編寫程序時,必須知道對象的準確數量、存在時間以及類型。

? ? ?另一個方法,在內存池中動態創建對象,該內存池也叫堆或者內存堆。除非進入運行期,否則不知道到底需要多少個對象也不知道它們的存在時間有多長,以及準確的類型。這些參數都在程序正式運行時才決定。若需要一個新對象,只需在需要它的時候在內存堆里簡單地創建它即可。由于存儲空間的管理是運行期間動態進行的,所以在內存堆里分配存儲空間的實際避災堆棧里創建的時間長。在堆棧里創建存儲空間一般只需要一個簡單的指令,將堆棧指針向下或向上移動即可。由于動態創建方法使對象本來就傾向于復雜,所以查找存儲空間以及釋放它所需的額外開銷不會為對象的創建造成明顯影響,而更大的靈活性對于常規編程問題的解決是至關重要的。

單根結構

? ? ?單根結構中的所有對象都有一個通用的接口,所有它們最終都屬于相同的類型。單個結構中的所有都可以保證擁有一些特定的功能。一個單根結構,加上所有對象都在內存堆中創建可以極大簡化參數的傳遞。Java中的基礎類為Object,所有的對象都有一些相同的函數,如hashCode()等。

? ? ?利用單根結構,我們可以很方便地實現一個垃圾收集器。與此有關的必要支持可安裝于基礎類中,而垃圾收集器可將適當的消息發給系統內的任何對象。如果沒有這種單根結構,而且系統通過一個句柄來操縱對象,那么實現垃圾收集器的途徑會有很大的不同,而且會面臨許多障礙。由于運行期的類型信息肯定存在于所有對象中,所以永遠不會遇到判斷不出一個對象的類型的情況。

集合庫與方便使用集合

? ? ?為了使這些集合能夠重復使用,或者“再生”,Java?提供了一種通用類型“Object”。單根結構意味著、所有東西歸根結底都是一個對象”。所以容納了Object?的一個集合實際可以容納任何東西。這使我們對它的重復使用變得非常簡便。為使用這樣的一個集合,只需添加指向它的對象句柄即可,以后可以通過句柄重新使用對象。但由于集合只能容納Object,所以在我們向集合里添加對象句柄時,它會上溯造型成Object,這樣便丟失了它的身份或者標識信息。再次使用它的時候,會得到一個Object?句柄,而非指向我們早先置入的那個類型的句柄。這時我們需要用到造型(Cast),下溯造型成一種特殊的類型。這種造型方法叫做“下溯造型”(Downcasting)。假如下溯造型成錯誤的東西,會得到我們稱為“異常”(Exception)的一種運行期錯誤。下溯造型和運行期檢查都要求花額外的時間來運行程序,而且程序員必須付出額外的精力。

清楚時的困境,由誰負責清除

? ? ?每個對象都要求資源才能“生存”,其中最令人注目的資源是內存。如果不再需要使用一個對象,就必須將其清除,以便釋放這些資源,以便其他對象使用。如果要解決的是非常簡單的問題,如何清除對象這個問題并不顯得很突出:我們創建對象,在需要的時候調用它,然后將其清除或者“破壞”。但在另一方面,我們平時遇到的問題往往要比這復雜得多。

? ? ?在Java?中,垃圾收集器在設計時已考慮到了內存的釋放問題(盡管這并不包括清除一個對象涉及到的其他方面)。垃圾收集器“知道”一個對象在什么時候不再使用,然后會自動釋放那個對象占據的內存空間。采用這種方式,另外加上所有對象都從單個根類Object?繼承的事實,而且由于我們只能在內存堆中以一種方式創建對象,所以Java?的編程要比C++的編程簡單得多。(在Java規范中并沒有指定一定要使用垃圾收集器回收內存,只規定要使用某種方法進行內存回收,具體實現的方法由Java虛擬機的實現者決定)。

垃圾收集器對效率和靈活性的影響

? ? ?在C++中,我們可在堆棧中創建對象。在這種情況下,對象會得以自動清除(但不具有在運行期間隨心所欲創建對象的靈活性)。在堆棧中創建對象是為對象分配存儲空間最有效的一種方式,也是釋放那些空間最有效的一種方式。在內存堆(Heap)中創建對象可能要付出昂貴得多的代價。如果總是從同一個基礎類繼承,并使所有函數調用都具有“同質多形”特征,那么也不可避免地需要付出一定的代價。但垃圾收集器是一種特殊的問題,因為我們永遠不能確定它什么時候啟動或者要花多長的時間。

異常控制

? ? ?在Java?中,異常控制模塊是從一開始就封裝好的,必須使用它。如果沒有自己寫一些代碼來正確地控制異常,就會得到一條編譯期出錯提示。這樣可保證程序的連貫性,使錯誤控制變得更加容易。

多線程

? ? ?Java?的多線程機制已內建到語言中,這使一個可能較復雜的問題變得簡單起來。對多線程處理的支持是在對象這一級支持的,所以一個執行線程可表達為一個對象。Java?也提供了有限的資源鎖定方案。它能鎖定任何對象占用的內存(內存實際是多種共享資源的一種),所以同一時間只能有一個線程使用特定的內存空間。為達到這個目的,需要使用synchronized?關鍵字。其他類型的資源必須由程序員明確鎖定,這通常要求程序員創建一個對象,用它代表一把鎖,所有線程在訪問那個資源時都必須檢查這把鎖。

轉載于:https://www.cnblogs.com/waimai/archive/2013/03/09/2951239.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376831.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376831.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376831.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++多線程快速入門(三):生產者消費者模型與條件變量使用

互斥鎖完成 #include <iostream> #include <deque> #include <thread> #include <mutex>std::deque<int> q; std::mutex mtx;static void produce(int val) {while(val--) {std::unique_lock<std::mutex> guard(mtx);q.push_front(val);m…

【blade利刃出鞘】一起進入移動端webapp開發吧

前言 在移動浪潮襲來的時候&#xff0c;小釵有幸進入框架組做webapp框架開發&#xff0c;過程中遇到了移動端的各種坑&#xff0c;也產生了各種激情&#xff0c;就我們公司的發展歷程來說 第一階段&#xff1a;使用傳統方式開發移動站點&#xff0c;少量引入HTML5元素 第二階段…

題目理解。。

有時候一道大水題&#xff0c;因為英文描述可能有點復雜或者其它云云&#xff0c; 就比如那道PRO。。 別先被一道題嚇一跳&#xff0c;&#xff0c;&#xff0c; 英文描述看深入一點總歸會能解決的&#xff0c;盡可能多的考慮情況。大膽嘗試。轉載于:https://www.cnblogs.com/c…

C++多線程快速入門(四)shared_mutex以及讀寫鎖應用

在前面的三講中我們使用的mutex都是普通的std::mutex&#xff0c;這里介紹一下shared_mutex&#xff0c;版本為C17 std::shared_mutex的底層實現時操作系統提供的讀寫鎖&#xff0c;在讀多寫少的情況下&#xff0c;該shared_mutex比mutex更加高效。 它提供了常用的四種方法&am…

Tornado/Python 學習筆記(一)

1.源代碼下載及安裝&#xff1a;http://www.tornadoweb.org/en/stable/ 2.python中xmlrpc庫官方文檔&#xff1a;https://docs.python.org/3/library/xmlrpc.html?highlightxmlrpc 3.xml介紹與學習&#xff1a;http://www.w3school.com.cn/xml/xml_intro.asp XML 被設計為傳輸…

spring-aop-annotation

1。假設你已經配好依賴注入那一塊。此時的bean.xml為 <?xml version"1.0" encoding"UTF-8"?><beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:cont…

c++實現簡單線程池代碼

目錄完整代碼TaskPool.cppTaskPool.hmain.cpp完整代碼 TaskPool.cpp // // Created by LENOVO on 2021/10/25. //#include "TaskPool.h" #include <functional>std::mutex printMutex;TaskPool::TaskPool() : m_bRunning(false) {}TaskPool::~TaskPool() {re…

Android靜態圖片人臉識別的完整demo(附完整源碼)

Demo功能&#xff1a;利用android自帶的人臉識別進行識別&#xff0c;標記出眼睛和人臉位置。點擊按鍵后進行人臉識別&#xff0c;完畢后顯示到imageview上。 第一部分&#xff1a;布局文件activity_main.xml [html] view plaincopyprint?<RelativeLayout xmlns:android&qu…

圖論:最短路徑搜索--Dijkstra算法(c代碼實現)

最近因為辭職&#xff0c;有不少閑功夫&#xff0c;重溫下數據結構&#xff0c;順便練練手。今天說說最短路徑搜索算法中的Dijkstra原理和實現。 一&#xff1a;簡介 這個算法用于解決圖中單源最短路徑問題。所謂單源節點是指給定源節點&#xff0c;求圖中其它節點到此源節點的…

C++多線程快速入門(五)簡單線程池設計

目錄設計思路主線程運行邏輯task以及taskpool設計詳細流程講解完整代碼打印結果往期回顧設計思路 線程池實際上就是一組線程&#xff0c;當我們需要異步執行一些任務時&#xff0c;經常要通過OS頻繁創建和銷毀線程&#xff0c;不如直接創建一組在程序生命周期內不會退出的線程…

C--函數

函數:具有特定功能的代碼段,分為庫函數,自定義函數. 函數定義: 函數返回值類型 函數名(形式參數列表) { 代碼段; return 返回值; } 注意:每個函數返回值最多只有一個.return是一個函數結束的標志. 形式參數(形參):函數定義時使用的虛擬參數名,用以接收函數調用是傳遞過來的實際…

公式系統 - TradeBlazer公式基礎 - Bar數據

Bar數據 在介紹Bar數據之前&#xff0c;首先&#xff0c;我們需要討論一下TradeBlazer公式的計算方法&#xff0c;針對上面介紹的各種公式類型&#xff0c;包含公式應用&#xff0c;在公式進行計算時&#xff0c;都是建立在基本數據源(Bar數據)之上&#xff0c;我們這里所謂的B…

C++網絡編程快速入門(一):TCP網絡通信基本流程以及基礎函數使用

目錄流程概述服務器端代碼實現客戶端代碼實現函數和結構講解sockaddr_in和sockaddrsocket &#xff1a; 創建一個socket連接bind &#xff1a;綁定地址以及端口號問題流程概述 客戶端與服務器之間的網絡通信基本原理如下所示&#xff0c;復雜一點的架構可能會添加消息中間件。…

php 字符串處理

addcslashes — 為字符串里面的部分字符添加反斜線轉義字符addslashes — 用指定的方式對字符串里面的字符進行轉義bin2hex — 將二進制數據轉換成十六進制表示chop — rtrim() 的別名函數chr — 返回一個字符的ASCII碼chunk_split — 按一定的字符長度將字符串分割成小塊conve…

使用前端框架Foundation 4來幫助簡化響應式設計開發

日期&#xff1a;2013-3-12 來源&#xff1a;GBin1.com Foundation是一套使用廣泛的前端開發套件&#xff0c;可以幫助你快速的網站。最近ZURB發布了一個新版本的Foundation 4前端框架&#xff0c;能夠有效的幫助你快速的開發響應式的網站。 和另外一個套知名的前端框架BootSt…

C++網絡編程快速入門(二):Linux下使用select演示簡單服務端程序

目錄select參數解釋select使用規范select使用缺點基本流程實例代碼通信效果演示往期文章select參數解釋 extern int select (int __nfds, fd_set *__restrict __readfds,fd_set *__restrict __writefds,fd_set *__restrict __exceptfds,struct timeval *__restrict __timeout)…

Android轉載一:Android文件命名規范

REF&#xff1a;http://blog.csdn.net/gulianchao/article/details/23391651 (一) Layout命名 1&#xff0e;contentview命名&#xff1a;activity_功能模塊.xml 例如&#xff1a;activity_main.xml、activity_more.xml 2&#xff0e;Dialog命名&#xff1a;dialog_描述.xml …

[轉]XBRL應用軟件分類

1) 分類標準編輯軟件(Taxonomy editor)&#xff1a; 分類標準是XBRL技術的應用基礎&#xff0c;每一個采用XBRL技術的國家都必須先按各國的GAAP制訂XBRL分類標準&#xff0c;上市公司才能據以編制實例文件。由于一套XBRL 2.0或2.1版分類標準必須包含至少一份XML Schema文…

C++網絡編程快速入門(三):阻塞與非阻塞式調用網絡通信函數

目錄阻塞與非阻塞定義send與recvconnect一些問題為什么要將監聽socket設置為非阻塞阻塞與非阻塞定義 阻塞模式指的是當前某個函數執行效果未達預期&#xff0c;該函數會阻塞當前的執行線程&#xff0c;程序執行流在超時時間到達或者執行成功后恢復原有流程。非阻塞模式相反&am…

css3實現頭像旋轉360度

css樣式: .div a img{ width: 88px; height: 88px; border-radius: 88px; transition: all 1.2s ease-out 0s;}.div a img:hover{ -webkit-transform:rotate(360deg); -moz-transform:rotate(360deg); -o-transform:rotate(360deg); -ms-transform:rotate(360deg); transform:r…