Java
方法(變量)修飾符的使用順序
權限修飾符
包
關鍵字
this
this代表其所在函數所屬對象的引用。(本類對象的引用)
用法:當在函數內需要用到調用該函數的對象時,就用this。
this也可以用於在構造函數中調用其他構造函數。
注意:只能定義在構造函數的第一行,因爲初始化動作要先執行。
static
·用於修飾成員(成員變量和成員函數)
被修飾後的成員有以下特點:
·隨着類的加載而加載
·優先於對象存在
·被所有對象所共享
·可以直接被類名調用
使用注意:
·靜態方法只能訪問靜態成員
·靜態方法中不可用寫this,super關鍵字
·主函數是靜態的
補充:
即使子類和父類中都有同樣的static方法和變量,他們是沒有任何關係的,他們是相互獨立的,他們是屬於各自類本身的。因此也是不存在多態特性的。而對於普通方法的調用是存在“重寫”而最終呈現出多態特性的。
同樣的道理:對於static修飾的變量,當子類與父類中存在相同的static變量時,也是根據“靜態引用”而不是根據“動態引用”來調用相應的變量的。
而在父類和子類中對於非static變量和方法,是根據“動態引用”來調用相應的變量和方法。
final
instanceof
Java中instanceof關鍵字的理解
java 中的instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。instanceof通過返回一個布爾值來指出,這個對象是否是這個特定類或者是它的子類的一個實例。
用法:
result = object instanceof class
參數:
Result:布爾類型。
Object:必選項。任意對象表達式。
Class:必選項。任意已定義的對象類。
說明:
如果 object 是 class 的一個實例,則 instanceof 運算符返回 true。如果 object 不是指定類的一個實例,或者 object 是 null,則返回 false。
但是instanceof在Java的編譯狀態和運行狀態是有區別的:
在編譯狀態中,class可以是object對象的父類,自身類,子類。在這三種情況下Java編譯時不會報錯。
在運行轉態中,class可以是object對象的父類,自身類,不能是子類。在前兩種情況下result的結果爲true,最後一種爲false。但是class爲子類時編譯不會報錯。運行結果爲false。
註釋
標識符
標誌符:支持_和$
比較運算符
邏輯運算符
位運算符
函數
定義
特點
主函數
重載
重寫(覆寫)
方法覆寫
a、 在子類中可以根據需要對從基類中繼承來的方法進行重寫。
b、 重寫方法必須和被重寫方法具有相同方法名稱、參數列表和返回類型。
c、 重寫方法不能使用比被重寫方法更嚴格的訪問權限。
嚴格順序private>default>protecte>public ,這個與多態有關,講了多態就會明白得多。
當某個地方由父類修飾了,可以調用父類的某個方法。
若子類對該方法訪問更嚴格,當傳遞子類過來,那麼可能造成不可訪問.
重寫equals和hashCode
覆寫與重載的區別
a、重載(Overloading)
Java中方法的重載,指的是在類中可以創建多個方法,它們具有相同的名字,但具有不同的引數列(參數類型和個數)和不同的定義。
而返回值的類型可以相同也不以不同,但是不能僅僅通過不同的返回值來區分重載函數。
調用方法的時候根據參數列表來判斷調用哪個方法。重載是一個類中的多態性表現。
b、覆寫(Overriding)
Java中,子類默認可以繼承父類中的方法,而不需要重新編寫相同的方法,但是有時候,
子類並不想原封不動的繼承父類中的方法,而是做出一定的修改,這就是採用方法的覆寫(也成爲覆蓋)來實現的。
Java中覆寫指的是,在子類中對父類中同一重名函數實現部分加以改變,但與父類的該方法的方法名、返回類型和參數
列表都保持一致。即子類對父類中的函數進行重新定義,子類中的新方法將覆蓋父類原有的方法。覆寫是父類與子類之間的一種多態表現。
補充:
構造函數
數組
定義
數組中的數組
Java內存分配之堆、棧和常量池
Java內存分配主要包括以下幾個區域:
- 寄存器:我們在程序中無法控制
- 棧:存放基本類型的數據和對象的引用,但對象本身不存放在棧中,而是存放在堆中
- 堆:存放用new產生的數據
- 靜態域:存放在對象中用static定義的靜態成員
- 常量池:存放常量
- 非RAM(隨機存取存儲器)存儲:硬盤等永久存儲空間
Java內存分配中的棧
在函數中定義的一些 基本類型的變量數據 和 對象的引用變量 都在函數的棧內存中分配。當在一段代碼塊定義一個變量時,Java就在棧中爲這個變量分配內存空間,當該變量退出該作用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間可以立即被另作他用。
Java內存分配中的堆
堆內存用來存放由 new創建的對象和數組 。 在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。
在堆中產生了一個數組或對象後,還可以 在棧中定義一個特殊的變量,讓棧中這個變量的取值等於數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。引用變量就相當於是爲數組或對象起的一個名稱,以後就可以在程序中使用棧中的引用變量來訪問堆中的數組或對象。引用變量就相當於是爲數組或者對象起的一個名稱。
引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其作用域之外後被釋放。而數組和對象本身在堆中分配,即使程序運行到使用 new 產生數組或者對象的語句所在的代碼塊之外,數組和對象本身佔據的內存不會被釋放,數組和對象在沒有引用變量指向它的時候,才變爲垃圾,不能在被使用,但仍 然佔據內存空間不放,在隨後的一個不確定的時間被垃圾回收器收走(釋放掉)。這也是 Java 比較佔內存的原因。
實際上,棧中的變量指向堆內存中的變量,這就是Java中的指針!
常量池 (constant pool)
常量池指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。除了包含代碼中所定義的各種 基本類型(如int、long 等等)和 對象型(如String及數組 )的 常量值(final )還包含一些以文本形式出現的符號引用,比如:
- 類和接口的全限定名;
- 字段的名稱和描述符;
- 方法和名稱和描述符。
虛擬機必須爲每個被裝載的類型維護一個常量池。常量池就是該類型所用到常量的一個有序集和,包括直接常量(string,integer和 floating point常量)和對其他類型,字段和方法的符號引用。
對於String常量,它的值是在常量池中的。而JVM中的常量池在內存當中是以表的形式存在的, 對於String類型,有一張固定長度的CONSTANT_String_info表用來存儲文字字符串值,注意:該表只存儲文字字符串值,不存儲符號引 用。說到這裏,對常量池中的字符串值的存儲位置應該有一個比較明瞭的理解了。
在程序執行的時候,常量池會儲存在Method Area,而不是堆中。
堆與棧
Java的堆是一個運行時數據區,類的(對象從中分配空間。這些對象通過new、newarray、 anewarray和multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。 堆是由垃圾回收來負責的,堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器 ,因爲它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由於要在運行時動態 分配內存, 存取速度較慢 。
棧的優勢是,存取速度比堆要快 ,僅次於寄存器,棧 數據可以共享 。但缺點是,存在棧中的 數據大小與生存期必須是確定的 ,缺乏靈活性。棧中主要存放一些基本類型的變量數據(int, short, long, byte, float, double, boolean, char)和對象句柄(引用)。
這裏我們主要關心棧,堆和常量池,對於 棧和常量池中的對象可以共享 ,對於 堆中的對象不可以共享 。棧中的數據大小和生命週期是可以確定的,當沒有引用指向數據時,這個數據就會消失。堆中的對象的由垃圾回收器負責回收,因此大小和生命週期不需要確定,具有很大的靈活性。
字符串內存分配:
對於字符串,其 對象的引用都是存儲在棧 中的, 如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中 ,如果是運行期(new出來的)才能確定的就存儲在堆中。對於 equals相等的字符串,在常量池中永遠只有一份,在堆中有多份 。
其他:
對象內存分佈在堆中,其中的成員變量變量默認值 int—0,double—0.0,char—‘’ 對象(引用)—null,
類中成員方法中的局部變量在棧中,棧中沒找到在堆中找。
匿名對象
封裝
代碼塊
單例設計模式
繼承
繼承的好處:
- 提高了代碼的複用性
- 讓類與類之間產生了關係,給第三個特徵多態提供了前提
繼承的弊端:
- 打破了封裝性
java中只支持單繼承。不支持多繼承,但對於C++中的多繼承機制進行改良
單繼承:一個子類只能有一個直接父類
多繼承:一個子類可以有多個直接父類(java中不允許)
java不直接支持,因爲多個父類中有相同成員,會產生調用不確定性。
在java中是通過“多實現”的方式來體現
java支持多層(多重)繼承:
C繼承B,B繼承A。
就會出現繼承體現。
當使用一個繼承體現時:
- 查看該體系中的頂層類,瞭解該體系的基本功能。
- 重建體系中的最子類對象,完成功能的使用。
什麼時候定義繼承呢?
當類與類之間存在着所屬關係的時候,就定義繼承。xxx是yyyy的一種:xxx extends yyy
所屬關係: is a 關係。
一個對象的實例化過程
抽象類
接口
接口的特點:
- 是對外暴露的規則
- 是程序的功能擴展
- 接口的出現降低耦合性
- 接口可以用來多實現
- 類與接口之間是實習關係,而且類可以繼承一個類的同時實現多個接口
- 接口與接口之間可以有繼承關係
接口與抽象類
多態
函數的重載算是函數的多態
多態時成員的特點
內部類
匿名內部類(匿名子類)
異常