【學習筆記】《Java編程思想》 第8~11章

来源:https://www.cnblogs.com/mcq1999/archive/2019/12/23/12083193.html
-Advertisement-
Play Games

第八章 多態 多態的條件: 1. 要有繼承 2.父類對象引用子類對象 3. 要有方法的重寫 多態的作用:消除類型之間的耦合關係。 將一個方法調用與一個方法主體關聯起來稱作綁定。若在程式執行前進行綁定,叫做前期綁定;在運行時根據對象的類型進行綁定,叫做後期綁定,也叫動態綁定、運行時綁定。 Java中除 ...


第八章 多態

  1. 多態的條件:

    1. 要有繼承

    2.父類對象引用子類對象

    3. 要有方法的重寫

  2. 多態的作用:消除類型之間的耦合關係。
  3. 將一個方法調用與一個方法主體關聯起來稱作綁定。若在程式執行前進行綁定,叫做前期綁定;在運行時根據對象的類型進行綁定,叫做後期綁定,也叫動態綁定、運行時綁定。
  4. Java中除了static方法和final方法之外,其他所有的方法都是後期綁定。所以final的作用還有關閉動態綁定。
  5. 只有非private方法才可以被覆蓋,但是還需要密切註意覆蓋private方法的現象,這時雖然編譯器不會報錯,但是也不會按照我們的預期的執行。
  6. 如果某個子對象要依賴於其他對象,銷毀的順序應該和初始化順序相反。
  7. 域是不具有多態性的,只有普通的方法調用是多態的。如果直接訪問某個域,這個訪問就將在編譯期進行解析,即域是靜態解析的。靜態方法也是不具有多態性的

第九章 介面

  1. 抽象方法和抽象類:

    抽象方法是不完整的,僅有聲明而沒有方法體
    abstract void f();

    包含抽象方法的類叫做抽象類;如果一個類包含一個或多個抽象方法,該類必須被定義為抽象的
    如果從一個抽象類繼承,並想創建該類的對象,那麼就必須為基類中的所有抽象方法提供方法定義;如果不這樣做,那麼導出類也是抽象類,且編譯器會強制我們用abstract關鍵字來限制這個類。
  2. interface這個關鍵字產生一個完全抽象的類,它根本就沒有提供任何具體實現

    要讓一個類遵循某個特定介面(或一組介面),需要使用implements關鍵字

  3. 如果從一個非介面的類繼承,那麼只能從一個類繼承;可以繼承多個介面
  4. 介面可以多繼承介面來擴展,介面還可以嵌套。
  5. 介面是實現多重繼承的途徑,而生成遵循某個介面的對象的典型方式就是工廠方法。在工廠對象上調用的是創建方法,而該工廠對象將生成介面的某個實現的對象。
  6. 介面可以包含域,且隱式地是static 和 final的。
  7. 介面關鍵字interface前可以添加public修飾符,不加預設是包訪問許可權,介面的方法預設都是public的。

第十章 內部類

  1. 將一個類的定義放在另一個類的定義內部,這就是內部類。
  2. 從外部類的非靜態方法之外的任意位置創建某個內部類的對象,那麼必須具體地指明這個對象的類型OuterClassName.InnerClassName。
  3. 非static的普通內部類自動擁有對其外圍類所有成員的訪問權(包括private)

  4. 如果需要生成對外部類對象的引用,可以使用外部類的名字後面緊跟.this
    public class DotThis {
        void f() {
    	System.out.println("DotThis.f()");
        }
        public class Inner {
    	public DotThis outer() {
    	    return DotThis.this;//通過.this返回外部類對象
    	}
        }
        public Inner inner() {return new Inner();}
        public static void main(String[] args) {
    	DotThis dotThis = new DotThis();
    	DotThis.Inner dtInner = dotThis.inner();
    	dtInner.outer().f();
        }
    }
    

    如果要創建內部類對象,必須使用外部類對象和.new

    public class DotNew {
        public class Inner {}
        public static void main(String[] args) {
            DotNew dn = new DotNew();
            DotNew.Inner dni = dn.new Inner();
        }
    }
    
  5. 如果擁有的是抽象類或者具體類,而不是介面,那麼就只能使用內部類實現多重繼承
    public class Example1 {
        public String getName() {
            return "llb";
        }
    }
    public class Example2 {
        public int getAge() {
            return 25;
        }
    }
    
    public class MultiImplementation {
        private class test1 extends Example1 {
            public String getName() {
                return super.getName();
            }
        }
        private class test2 extends Example2 {
            public int getAge() {
                return super.getAge();
            }
        }
        public String getName() {
            return new test1.getName();
        }
        public int getAge() {
            return new test2.getAge();
        }
    
        public static void main(String[] args) {
            MultiImplementation my = new MultiImplementation();
            System.out.println("姓名: " + my.getName());
            System.out.println("年齡: " + my.getAge());
        }
    }
    
  6. 局部內部類是指內部類定義在方法或作用於內

      • 局部內部類不能有訪問說明符
      • 局部內部類可以訪問當前代碼塊內的常量以及此外圍類的所有成員

     局部內部類會跟著其他類一起通過編譯,但是在定義該局部內部類的方法或作用域之外,該局部內部類是不可用的

  7. 內部類聲明為static時,不再包含外圍對象的引用.this,稱為嵌套類(與C++嵌套類大致相似,只不過在C++中那些類不能訪問私有成員,而在Java中可以訪問)。
    - 創建嵌套類,不需要外圍對象。
    - 不能從嵌套類的對象中訪問非靜態的外圍對象。
    public class OuterClass {
        private static String address = "Shanghai";
        public static class StaticInnerClass {
            public String getAddress() {
    	    return address;
    	}
        }
        public static void main(String[] args) {
    	OuterClass.StaticInnerClass sic = new  
                                         OuterClass.StaticInnerClass();
    	String address = sic.getAddress();
    	System.out.println(address);
        }
    }
    
  8. 匿名內部類創建方式為:

    new 外部類構造器(參數列表)或介面 {}
    1. 在定義類的同時就生成了該內部類的一個實例,隨後該類的定義會消失,所以匿名內部類不能被重覆使用
    2. 匿名內部類必須繼承一個父類或者實現一個介面,但是也只能繼承一個父類或實現一個介面
    3. 匿名內部類中不能定義構造方法(沒有類名),不能存在任何的靜態成員變數和靜態方法
    4. 匿名內部類不能是抽象的,它必須實現所繼承的類或者實現的介面中的全部抽象方法
    public interface Contents {
        int value();
    }
    public class Parcel7 {
        public Contents contents() {
            return new Contents() {
                private int i = 1;
                public int value() { return i; }
            };
        }
    
        //等價於
    /*
        class MyContents implements Contents {
            private int i = 1;
            public int value() { return i; }
        }
        public Contents contents() { return new MyContents(); }
    */
    
        public static void main(String[] args) {
            Parcel7 parcel7 = new Parcel7();
            Contents c = parcel7.contents();
        }
    }

    給匿名內部類傳遞參數時,若該形參在內部類被使用,那麼該形參必須被聲明為final

    public class Parcel9 {
        //dest是一個在外部定義的對象,必須將其定義為final參數引用
        public Destination destination(final String dest) {
    	return new Destination() {
    	    private String label = dest;
    	    @Override
    	    public String readLabel() {
                    return label;
    	    }
    	};
        }
        public static void main(String[] args) {
    	Parcel9 parcel9 = new Parcel9();
    	Destination destination = parcel9.destination("Shanghai");
    	System.out.println(destination.readLabel());
        }
    }
  9. 為什麼要是final?內部類並不是直接調用方法傳遞的參數,而是利用自身的構造器對傳入的參數進行備份,自己內部方法調用的實際上是自己的屬性而不是外部方法傳遞進來的參數,在內部類中的屬性和外部方法的參數兩者看似是同一個東西,但實際上卻不是,也就是說在內部類中對屬性的修改並不會影響到外部的形參,如果內部類中的屬性改變了,而外部方法的形參卻沒有改變,這是難以接受的,為了保證參數的一致性,就規定使用final來避免兩者不同時變化的情況發生。
  10. 每個類都會產生一個.class文件,其中包含瞭如何創建該類型的對象的全部信息;內部類也必鬚生成有個.class文件以包含它們的class對象信息,其命名規則是:

    外圍類的名字,加上”$“,再加上內部類的名字,如果時匿名內部類,編譯器會簡單地產生一個數字作為其標識符,例如:

    Outer$Inner.class
    Outer$1.class

第十一章 持有對象

  1. Collection是一個集合介面,提供了對集合對象進行操作的通用介面方法
    Collections是一個包裝類,包含有各種集合操作的靜態方法,此類不能實例化,就像一個工具類,服務於Collection框架
    Collection介面是最基本的集合介面,一個Collection代表一組Object,即Collection的元素
  2. List,Set,Queue介面都是Collection介面的實現

    • List:必須按照插入的順序保存元素
    • Set:不能有重覆的元素
    • Queue:按照隊列的規則來確定對象產生的順序(通常與元素插入的順序相同)
  3. 在Java.util包中的Arrays和Collections類中都有很多實用方法,可以在Collection中添加一組元素;Arrays.asList()方法接受一個數組或是一個用逗號分割的元素列表(使用可變參數),並將其轉換為一個List對象;Collections.addAll()方法接受一個Collection對象,以及一個數組或是一個用逗號分割的列表,將元素添加到Collection中
    import java.util.*;
    
    public class AddingGroups {
        public static void main(String[] args) {
    	Collection<Integer> collection = 
    	    new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
    	Integer[] moreInts = {6, 7, 8, 9, 10};
    	collection.addAll(Arrays.asList(moreInts));//更快,但不夠靈活
    	Collections.addAll(collection, 11, 12, 13, 14, 15);
    	Collections.addAll(collection, moreInts);//更加靈活
    	List<Integer> list = Arrays.asList(16, 17, 18, 19, 20);
    	list.set(1, 99);
        }
    }
  4. Arrays類似於Collections,是一個工具類

    Arrays.asList()返回一個受指定數組支持的固定大小的列表,可以用來將數組轉換成List

    反過來,利用List的toArray()方法,可以將List轉換成數組

  5. 容器的列印

    必須使用Arrays.toString()來產生數組的可列印表示

  6. List

    ArrayList:隨機訪問,但是在List的中間插入或移除元素時較慢

    LinkedList:通過代價較低的在List中間進行的插入和刪除操作,提供了優化的順序訪問;隨機訪問較慢

    ArrayList常見方法

    contains(Object o):確定某個對象是否在列表中

    remove(int index):移除指定位置上的元素

    indexOf(Object o):返回列表中首次出現指定元素的索引,如果不包含該元素,返回-1

    add(E e):將制定元素添加到此列表的尾部

    add(int index, E e):將指定元素插入到指定位置

  7. 迭代器是一個對象,它的工作是遍歷並選擇序列中的對象

    Java中的Iterator只能單向移動,只能用來:

    1. 使用方法iterator()要求容器返回一個Iterator;Iterator準備好返回序列的第一個元素
    2. 使用next()獲得序列中的下一個元素
    3. 使用hasNext()檢查序列中是否還有元素
    4. 使用remove()將迭代器新近返回的元素刪除
  8. LinkedList常見方法

    addFirst(E e)/addLast(E e):將元素添加到列表的開頭/結尾

    getFirst()/element():返回列表的第一個元素

    peek()/peekFirst():獲取但不移除列表的第一個元素

    offer(E e)/offerLast(E e):將元素插入到列表末尾

  9. Queue

    隊列時一個典型的先進先出(FIFO)的容器,即從容器的一端放入事物,從另一端取出,並且事物放入容器的順序與取出的順序是一樣的

    LinkedList提供了方法以支持隊列的行為,並且它實現了Queue介面,因此LinkedList可以用作Queue的一種實現,也可以將LinkedList向上轉型為Queue

  10. Set

    Set不保存重覆的元素;Set最常被使用的是測試歸屬性,我們可以很容易地詢問某個對象是否在某個Set中

    存儲元素的方式:

    HashSet:使用散列函數

    LinkedHashSet:使用散列,但是看起來使用了鏈表來維護元素的插入順序

    TreeSet:將元素存儲在紅-黑樹結構中

  11. Map:一組成對的“鍵值對”對象,允許使用鍵來查找值;映射表允許我們使用另一個對象來查找某個對象,它被稱為“關聯數組”,因為它將某些對象與另外一些對象關聯在了一起,或者被稱為“字典”

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();

    更複雜的形式

    Map<Integer, List<String>> map = 
                                   new HashMap<Integer, List<String>>();
    map.put(1, rrays.asList("lv", "long", "bao"));

    map的鍵是一個Set,值是一個Collection

    Map常見方法

    get(Object o):返回指定鍵所映射的值,如果不包含該鍵的映射關係,返回null

    put(K key, V value):將指定的值與此映射中的指定鍵關聯,如果已經存在映射關係,更新值

    hashCode():返回此映射的哈希碼值

    Map的三種實現

    HashMap:基於“拉鏈法”實現的散列表,一般用於單線程中,不是線程安全的

    HashTable:基於“拉鏈法”實現的散列表,一般用於多線程中,是線程安全的

    TreeMap:有序的散列表,通過紅黑樹實現的,一般用於單線程中存儲有序的映射

  12. 總結:
    1. 數組將數字與對象聯繫起來:它保存類型明確的對象,查詢對象時,不需要對結果做類型轉換;它可以時多維的,可以保存基本類型的數據;但是,數組一旦生成,其容量不能改變
    2. Collection保存單一的元素,而Map保存關聯的鍵值對:有了Java泛型,你就可以指定容器中存放的對象類型,因此你就不會將錯誤類型的對象放置到容器中,並且在從容器中獲取元素時,不必進行類型轉換;各種Collection和Map都可以在你向其中添加更多的元素時,自動調整其尺寸;容器不能持有基本類型,但是自動包裝機制會仔細地執行基本類型到容器中所持有包裝器類型之間的雙向裝換
    3. 像數組一樣,List也建立數字索引與對象的關聯,因此,數組和List都是排好序的容器;List能夠自動擴充容量
    4. 如果要進行大量的隨機訪問,就使用ArrayList;如果要經常從表中間插入或刪除元素,則應該使用LinkedList
    5. 各種Queue以及棧的行為,由LinkedList提供支持
    6. Map是一種將對象(而非數字)與對象相關聯的設計:HashMap設計用來快速訪問;TreeMap保持“鍵”始終處於排序狀態,所以沒有HashMap快;LinkedHashMap保持元素插入的順序,但是也通過散列提供了快速訪問能力
    7. Set不接受重覆元素:HashSet提供了最快的查詢速度;TreeSet保持元素處於排序狀態;LinkedHashSet以插入順序保存元素
    8. 新程式中不應該使用過時的Vector,Hashtable和Stack(原因參考:https://www.cnblogs.com/fudashi/p/7214609.html

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從Excel到Python:最常用的36個Pandas函數關於Excel,你一定用的到的36個Python函數 本文涉及pandas最常用的36個函數,通過這些函數介紹如何完成數據生成和導入、數據清洗、預處理,以及最常見的數據分類,數據篩選,分類彙總,透視等最常見的操作。 生成數據表 常見的生成數據 ...
  • 本文主要和大家分享最詳細的linux安裝php過程,然後寫好了nginx的安裝配置,後面就是php的安裝和mysql的安裝,不過時間有限,而且放篇里也太長,所以都是分開來寫,php安裝完畢後就是mysql的配置了。 一:檢查是否安裝了php 1)yum安裝檢查:yum list已安裝| grep p ...
  • linux下部署php項目環境可以分為兩種,一種使用Apache,php,mysql的壓縮包安裝,一種用yum命令進行安裝。 使用三種軟體的壓縮包進行安裝,需要手動配置三者之間的關係。apache和php之間的配置沒有什麼難度,但是和mysql進行配置的時候就需要對php的瞭解了。 我的官方群點擊此 ...
  • 本篇文章給大家分享的內容是關於php redis 操作手冊,有著一定的參考價值,有需要的朋友可以參考一下 String 類型操作 1 string是redis最基本的類型,而且string類型是二進位安全的。意思是redis的string可以包含任何數據。 2 3 比如jpg圖片或者序列化的對象 4 ...
  • PHP高併發和大流量的解決方案 一 高併發的概念 在互聯網時代,併發,高併發通常是指併發訪問。也就是在某個時間點,有多少個訪問同時到來。 二 高併發架構相關概念 1、QPS (每秒查詢率) : 每秒鐘請求或者查詢的數量,在互聯網領域,指每秒響應請求數(指HTTP請求) 2、PV(Page View) ...
  • $GLOBALS——引用全局作用域中可用的全部變數。 $GLOBALS一個包含了全部變數的全局組合數組。變數的名字就是數組的鍵。(即所有出現過的全局變數,都可通過$GLOBALS獲取到) 在PHP中,定義在函數體外的全局變數,函數內部是不能直接獲取的,所以需要global聲明或者$GLOBALS[] ...
  • 1)set中每個元素的值都唯一,而且系統能根據元素的值自動進行排序。set中元素的值不能直接被改變 set具備的兩個特點: 1. set中的元素都是排序好的 2. set中的元素都是唯一的,沒有重覆的 2)聲明:例:set<int> s; 3)set的常用的方法 (s.~) begin(); // ...
  • 由於當前C++項目需要使用ajax庫去post調用ashx介面,介面地址如下所示: 需要傳遞的參數如下: 然後發現qml比較好調用ajax.js庫,所以本章通過C++界面去獲取qml方法來實現調用ashx介面(以一個C++界面demo程式為例) 1.抓post數據 通過網頁獲取到的post數據如下所 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...