国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java面試集錦

2019-11-06 08:17:28
字體:
來源:轉載
供稿:網友

HashMap和HashTable的區別

他們都是Map接口的實現類,實現了將唯一鍵值映射到特定的值上。

這里寫圖片描述

HashMap沒有分類或者排序,它允許一個null和多個null值。 HashTable類似于HashMap,但是不允許有null鍵和null值。它比hashMap要慢,因為它是同步的(即線程安全的) HashTable繼承自Dictionart類,而HashMap是java1.2引進的Map接口的一個實現類。 HashMap允許將null作為一個entry的key或者value,而HashTable不允許,HashMap還去除了hashTable的contains方法,改成了containavalue()和containskey()方法。 兩者最大的不同是,HashTable的方法是Synchronize的,而HashMap卻不是,在多線程訪問HashTable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供而外的同步。

HashMap和HashTable采用hash/rehash的算法類似,因此性能不會產生很大的差異。

重載和覆蓋的區別

對于在同一個區內被聲明的幾個具有不同參數列的同名函數,程序會根據不同的參數列來切定具體調用哪一個函數,這種機制叫重載(overload),重載不管系函數的返回值類型。 覆蓋(override)是指派生類中重新定義的函數,其函數名、參數列、返回值類型必須與父類中哦夠的函數保持嚴格的一致。覆蓋函數和被覆蓋的只有函數體不同,宕派生類對象調用子類該同名函數時會自動調用子類中的覆蓋版本,而不是父類中被覆蓋的函數,這種機制叫做覆蓋。

關于覆蓋的使用請參考下面的代碼。

package com.company;/** * Created by shugen on 17-3-3. */public class OverLoad { public static void main(String[] args) { A ref = new AC(); ref.PRint(); AC ref2 = new AC(); ref2.print(); }}class A { public void print() { System.out.println("this is class A"); }}class AC extends A { @Override public void print() { System.out.println("this is class B"); }}

程序的執行結果如下:

enter description here

在上面的代碼中,即使ref被聲明為A類型的,但是java中存在形式類型和實際類型。此時ref的形式類型時A,但是ref的實際類型確是AC。因此ref也是調用子類AC的print方法。

成員函數的重載的特征如下:

(1) 相同的范圍(在同一個類中) (2) 函數名字相同 (3)參數不同 (4)virtual關鍵字可有可無

覆蓋的特征如下: (1)不同的范圍(分別位于父類和子類或者叫做派生類中) (2)函數名字相同 (3)參數相同

### 靜態方法的覆蓋問題 為了方便展示static方法的可覆蓋性,先提供下面的基礎代碼:

class STA { public static void print() { System.out.println("Hello, it's STA"); } private void ge(){ System.out.println("這是私有的方法"); }}class STAC extends STA{ public static void print(){ System.out.println("Hello, it's STAC"); } public void ge(){ System.out.println("這是覆蓋后的非私有方法"); }}

結論: (1)靜態方法,不能被覆蓋成非靜態方法 如下圖,放嘗試覆蓋父類的static方法為非static方法時,IDE開始報錯。

enter description here

(2)私有方法可以被覆蓋

enter description here

從上圖可以看出,父類的靜態方法是可以被子類繼承的,但是以父類作為形式類型卻是不能訪問被覆蓋的父類的方法的。

關于靜態方法在父類和子類中的調用問題

package com.company;/** * Created by shugen on 17-3-3. */public class StaticCall { public static void main(String[] args) { F f1 = new F(); F f2 = new C(); System.out.println(f1.getName()); System.out.println(f2.getName()); }}class F { public static String getName(){ return "F"; }}class C extends F{ public static String getName(){ return "C"; }}

程序的輸出如下: enter description here

出現這種現象的原因時,程序中的兩個getName方法時靜態方法,所以在內存中的地址空間時固定的,不存在沖突的問題。也就是折兩個方法在內存中占用了不同的空間,而具體執行哪一個則要看由哪個類來調用,因為時靜態方法,且兩個引用變量都是F類型的,因此,這里調用的都是F類中的getName方法。

super構造函數的位置

如果要想在子類中使用super構造函數,則必須吧super()放在子類代碼的第一行的位置。

enter description here

從上圖中可以看到,把super放在了子類的構造函數的第二行時,編譯器就會報錯了。因此,如果在使用super構造函數時不將其放在代碼的第一行就會造成編譯器報錯(即編譯錯誤)。

抽象類相關的性質

(1)抽象類只能作為其他類的基類,不能被直接實例化,而且對抽象類不能使用new操作。抽象類如果包含有抽象的變量或者值,則它們要么時null類型,要么包含了對非抽象類的實例的引用。 (2)抽象類允許包含抽象成員,但不是必須的,抽象類中可以有非抽象方法。 (3)抽象類不能時final的。因為final是不能被繼承的,因此聲明成fianal的抽象類沒有實際意義,java是不允許的。 (4)如果一個非抽象類從抽象類中派生,則其必須要覆蓋抽象類的所有抽象方法。 (5)抽象類可以被抽象類繼承,結果仍是抽象類。 (6)抽象類可以被聲明。 (7)抽象類可以不包含任何抽象方法或者抽成員。

enter description here

從上圖可以看出,一個抽象類可以不包括任何成員變量或者成員方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 商洛市| 阿克陶县| 银川市| 林西县| 云安县| 潼南县| 额济纳旗| 城步| 黎平县| 武鸣县| 曲麻莱县| 陕西省| 乌拉特后旗| 三明市| 鄯善县| 讷河市| 丹棱县| 金昌市| 平果县| 合阳县| 辽中县| 武邑县| 贞丰县| 老河口市| 虞城县| 吉安市| 连南| 云和县| 金昌市| 日照市| 中牟县| 乳源| 缙云县| 咸宁市| 云南省| 加查县| 南充市| 柳林县| 淳化县| 九龙坡区| 永川市|