JAVA語言基礎小小總結

1.接口

1.1 接口是什麼

  • Java裏的interface, 就是抽象方法和常量值的集合,與class平行

  • [public] interface interfaceName[extends<Superinterface_list>]{
        public static final members
            
        public abstract methods
    }
    

1.2 接口的定義、實現和繼承

  • 定義:

    • 接口定義在同名字的java文件內:可以用public修飾;

    • 接口不是定義在同名字的java文件內:不能帶任何權限修飾符,且只能被同1個包內的類訪問,其他類不能訪問。

    • 跟外部類一樣,外部接口不能用private 和 protected來修飾。

    • 接口的所有變量都是public static final,可以省略不寫。

    • 接口的所有方法都是public abstract,也可以省略不寫。而抽象類允許非抽象方法的存在,這是接口和抽象類的區別之一。

    • 接口裏沒有this指針,沒有構造函數。

    • java8之後允許有default、static的方法和方法體。

    • 附java修飾符:

      在這裏插入圖片描述

  • 實現:

    • 實現接口的非抽象類必須重寫接口的所有方法。一個抽象類實現接口,可以不重寫接口的方法,而一個非抽象類繼承這個抽象類的話,那麼這個非抽象類就要重寫接口的所以方法。

    • 多態(與繼承的多態類似):

      public class Interface_1{
      	public static void f(){
      		It_1 a = new It_class(); // It_1爲接口,It_class爲實現了這個接口的類
      		a.print();
      	}
      }
      
    • 一個類可以實現多個接口。

  • 繼承:一個接口可以繼承多個接口。

1.3 爲什麼會出現接口

  • 實現多態
  • 實現多繼承

2. 容器

  • java容器分類圖(實線爲實現類):

    在這裏插入圖片描述

在這裏插入圖片描述

  • ArrayList LinkedList Vector
    底層原理 數組 雙向鏈表 數組
    安全性 非線程安全 非線程安全 相對線程安全,很多方法使用了sychronized
    元素 允許重複,允許爲空 允許重複,允許爲空 允許重複,允許爲空
HashSet TreeSet HashMap ConcurrentHashMap TreeMap
底層原理 HashMap TreeMap Entry數組+鏈表+紅黑樹 與HashMap相同 紅黑樹
安全性 非線程安全 非線程安全 非線程安全 線程安全(分段鎖,效率比Hashtable高) 非線程安全
元素 忽略重複 有序 無序 無序 有序

3. 異常

在這裏插入圖片描述

移步:https://www.runoob.com/java/java-exceptions.html

4. 泛型

  • 常用方式:泛型類、泛型接口和泛型方法。

  • 泛型類:

    public class genericClass <E> {
        private E value;
        public void setValue(E ele){
            this.value = ele;
        }
        public E getValue(){
            return value;
        }
    }
    
  • 泛型接口:

    public interface Generator<T> {
        public T next();
    }
    
  • 泛型方法:

    public <E> E genericFunc(E element){
            return element;
    }
    

5. 反射

5.1 反射是什麼

JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。

5.2 反射的用處/用法

  • 有博主總結的很好的,具體移步:https://www.cnblogs.com/yonyong/p/9429079.html

  • 獲取Class對象的三種方式(Class類沒有公共構造方法)

    • 通過Object中的getObject()方法

      Person p = new Person();
      Class c = p.getClass();
      
    • 通過 類名.class 獲取到字節碼文件對象(任意數據類型都具備一個class靜態屬性,看上去要比第一種方式簡單)

      Class c2 = Person.class;
      
    • 通過Class類中的方法(將類名作爲字符串傳遞給Class類中的靜態方法forName即可)

      Class c3 = Class.forName("Person");
      

5.3 爲什麼會有反射

  • 爲了代碼簡潔,提高代碼的複用率,外部調用方便,源代碼,反編譯都能看到。
  • 有博主總結的很好的,具體移步:https://www.cnblogs.com/yonyong/p/8595737.html

6. 註解(Annotation)

6.1 註解是什麼

  • Java 註解(Annotation)又稱 Java 標註,是 JDK5.0 引入的一種註釋機制。
  • Java 語言中的類、方法、變量、參數和包等都可以被標註。
  • 和 Javadoc 不同,Java 標註可以通過反射獲取標註內容。
  • 在編譯器生成類文件時,標註可以被嵌入到字節碼中。
  • Java 虛擬機可以保留標註內容,在運行時可以獲取到標註內容 。
  • 它也支持自定義 Java 標註。

6.2 註解的用處/用法

  • 註解的定義

    public @interface TestAnnotation {
    }
    //它的形式跟接口很類似,不過前面多了一個 @ 符號。上面的代碼就創建了一個名字爲 TestAnnotaion 的註解。
    
  • 註解的應用

    @TestAnnotation
    public class Test {
    }
    //創建一個類 Test,然後在類定義的地方加上 @TestAnnotation 就可以用 TestAnnotation 註解這個類了。
    
  • 元註解

    • 元註解是一種基本註解,但是它能夠應用到其它的註解上面。
    • @Retention:Retention即保留期,當 @Retention 應用到一個註解上的時候,它解釋說明了這個註解的的存活時間。取值如下:
      • RetentionPolicy.SOURCE 註解只在源碼階段保留,在編譯器進行編譯時它將被丟棄忽視。
      • RetentionPolicy.CLASS 註解只被保留到編譯進行的時候,它並不會被加載到 JVM 中。
      • RetentionPolicy.RUNTIME 註解可以保留到程序運行的時候,它會被加載進入到 JVM 中,所以在程序運行時可以獲取到它們。
    • @Documented:它的作用是能夠將註解中的元素包含到 Javadoc 中去。
    • @Target:指定了註解運用的地方。取值如下:
      • ElementType.ANNOTATION_TYPE 可以給一個註解進行註解
      • ElementType.CONSTRUCTOR 可以給構造方法進行註解
      • ElementType.FIELD 可以給屬性進行註解
      • ElementType.LOCAL_VARIABLE 可以給局部變量進行註解
      • ElementType.METHOD 可以給方法進行註解
      • ElementType.PACKAGE 可以給一個包進行註解
      • ElementType.PARAMETER 可以給一個方法內的參數進行註解
      • ElementType.TYPE 可以給一個類型進行註解,比如類、接口、枚舉
    • @Inherited:如果一個父類被 @Inherited 註解過的註解進行註解的話,而且它的子類沒有被任何註解應用的話,那麼這個子類就繼承了父類的註解。
    • @Repeatable:JAVA8新特性,註解的值可以同時取多個。
  • 註解的屬性

    • 註解的屬性也叫做成員變量。註解只有成員變量,沒有方法。註解的成員變量在註解的定義中以“無形參的方法”形式來聲明,其方法名定義了該成員變量的名字,其返回值定義了該成員變量的類型。

      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface TestAnnotation {
          int id();
          String msg();
      }
      //上面代碼定義了 TestAnnotation 這個註解中擁有 id 和 msg 兩個屬性。在使用的時候,我們應該給它們進行賦值。
      
      //賦值的方式是在註解的括號內以 value=”” 形式,多個屬性之前用 ,隔開。
      @TestAnnotation(id=3,msg="hello annotation")
      public class Test {
      }
      
    • 需要注意的是,在註解中定義屬性時它的類型必須是 8 種基本數據類型外加 類、接口、註解及它們的數組

      //註解中屬性可以有默認值,默認值需要用 default 關鍵值指定。比如:
      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface TestAnnotation {
          public int id() default -1;
          public String msg() default "Hi";
      }
      //TestAnnotation 中 id 屬性默認值爲 -1,msg 屬性默認值爲 Hi。它可以這樣應用:
      @TestAnnotation()
      public class Test {}
      //因爲有默認值,所以無需要再在 @TestAnnotation 後面的括號裏面進行賦值了,這一步可以省略.
      
      //另外,還有一種情況。如果一個註解內僅僅只有一個名字爲 value 的屬性時,應用這個註解時可以直接接屬性值填寫到括號內。
      public @interface Check {
          String value();
      }
      //上面代碼中,Check 這個註解只有 value 這個屬性。所以可以這樣應用:
      @Check("hi")
      int a;
      
      //最後,還需要注意的一種情況是一個註解沒有任何屬性。比如:
      public @interface Perform {}
      //那麼在應用這個註解的時候,括號都可以省略。
      @Perform
      public void testMethod(){}
      
  • JAVA預置的註解

    • @Deprecated:這個元素是用來標記過時的元素,想必大家在日常開發中經常碰到。編譯器在編譯階段遇到這個註解時會發出提醒警告,告訴開發者正在調用一個過時的元素比如過時的方法、過時的類、過時的成員變量。

    • @Override:提示子類要複寫父類中被 @Override 修飾的方法。

    • @SuppressWarnings:阻止警告的意思。之前說過調用被 @Deprecated 註解的方法後,編譯器會警告提醒,而有時候開發者會忽略這種警告,他們可以在調用的地方通過 @SuppressWarnings 達到目的。

      @SuppressWarnings("deprecation")
      
    • @SafeVarargs:參數安全類型註解。它的目的是提醒開發者不要用參數做一些不安全的操作,它的存在會阻止編譯器產生 unchecked 這樣的警告。

    • @FunctionalInterface:函數式接口註解,這個是 Java 1.8 版本引入的新特性。函數式編程很火,我們進行線程開發中常用的 Runnable 就是一個典型的函數式接口,它就被 @FunctionalInterface 註解。函數式接口可以很容易轉換爲 Lambda 表達式。

6.3 爲什麼會出現註解

  • 註解主要給編譯器及工具類型的軟件用的。
  • 註解的提取需要藉助於 Java 的反射技術,反射比較慢,所以註解使用時也需要謹慎計較時間成本。

7. I/O

7.1 JAVA中有幾種類型的流?

  • 字符流和字節流

在這裏插入圖片描述

  • 字節流繼承inputStream和OutputStream
    字符流繼承自InputSteamReader和OutputStreamWriter

  • 總體結構圖:

    在這裏插入圖片描述

7.2 字節流和字符流怎麼選擇?兩者的區別?

  • 大多數情況下使用字節流會更好,IO 操作都是直接操作磁盤文件,所以這些流在傳輸時都是以字節的方式進行的,圖片等都是按字節存儲的。
  • 如果對於操作需要通過 IO 在內存中頻繁處理字符串的情況使用字符流會好些,因爲字符流具備緩衝區,提高了性能。
  • 緩衝區就是一段特殊的內存區域,很多情況下當程序需要頻繁地操作一個資源(如文件或數據庫)則性能會很低,所以爲了提升性能就可以將一部分數據暫時讀寫到緩存區,以後直接從此區域中讀寫數據即可,這樣就顯著提升了性。對於 Java 字符流的操作都是在緩衝區操作的,所以如果我們想在字符流操作中主動將緩衝區刷新到文件則可以使用 flush() 方法操作。
  • 字節流和字符流的區別:字節流的操作不會經過緩衝區(內存)而是直接操作文本本身的,而字符流的操作會先經過緩衝區(內存)然後通過緩衝區再操作文件。

7.3 什麼是JAVA序列化,如何實現JAVA序列化?

  • 序列化就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,可以將流化後的對象傳輸於網絡之間
  • 序列化的實現:將需要被序列化的類實現Serialize接口,沒有需要實現的方法,此接口只是爲了標註對象可被序列化的。然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,再使用ObjectOutputStream對象的write(Object obj)方法就可以將參數obj的對象寫出。

7.4 流一般需要不需要關閉,如果關閉的話在用什麼方法,一般要在那個代碼塊裏面關閉比較好?

  • 流一旦打開就必須關閉,使用close方法,放入finally語句塊中(finally 語句一定會執行)。

  • 序列化的實現:將需要被序列化的類實現Serialize接口,沒有需要實現的方法,此接口只是爲了標註對象可被序列化的。然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,再使用ObjectOutputStream對象的write(Object obj)方法就可以將參數obj的對象寫出。

--------本篇完--------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章