(2020)JAVA基礎篇(一)

上善若水的傻子發表於2020-10-20

JAVA基礎

一、概述

1、Java簡述

Java是一種物件導向程式設計的語言,有封裝,繼承,多型,沒有多繼承;有自帶的垃圾回收機制。

2、Java的優缺點

2.1、優點
  • JAVA是純物件導向的語言
  • 平臺無關性,可移植性強:一次編譯,到處執行。.java程式經過編譯器,編譯成.class的位元組碼檔案,只要不同的系統上面安裝了JVM(java 虛擬機器)就可以執行這個位元組碼檔案
  • JAVA提供了很多內建的類庫:簡化開發人員的設計工作,同時縮短了專案開發的時間。提供多執行緒,網路程式設計,以及垃圾回收的部分
  • JAVA提供對WEB應用開發的支援。如Applet,Servlet和JSP可以用來開發WEB應用程式
  • 較好的安全性和健壯性:陣列邊界檢測和Bytecode檢驗。java的強型別機制,垃圾回收機制,異常處理,安全檢查機制
2.2、缺點
  • 解釋型語言,執行效率極低,不支援底層的操作
  • 取消了指標,不夠靈活(這樣安全)

3、JDK有哪些版本

  • OpenJDK:開源的,是一個參考模型
  • OracleJDK:是OpenJDK的一個實現,比OpenJDK更穩定,在響應和JVM效能上都是非常不錯的

4、JDK,JRE,JVM是什麼,能做什麼?

4.1JVM、

Java Virtual Machine 虛擬機器,JAVA程式執行在上面,不同的平臺有自己的虛擬機器,因此JAVA語言支援跨平臺。

4.2JRE、

Java Runtime Environment Java執行時環境:只要機器上安裝了JRE就可以執行Java程式。它是由JVM和核心類庫組成

4.3JDK、

Java Development Kit Java開發工具包,包括JRE和開發工具包(編譯工具javac.exe,打包工具jar.exe)等

5、Java程式執行的流程

java程式---->經過編譯器---->生成.class檔案(位元組碼)---->JVM---->將位元組碼解釋成機器碼---->在機器上執行

二、基礎語法

1、資料型別

  • 基本型別

    • 數值型(8):
      • 整數型別:byte(1),short(2),int(4),long(8)
      • 浮點型:float(4),double(8)
    • 字元型:char(2)
    • 布林型:boolean(1)
  • 引用型別(3)

    • 介面
    • 陣列
    • String
    • Enum

String型別不是基本的資料型別

1.1、短整數short,整數int,長整數long,位元組型byte
//短整數型別(-32768----+32767)
short a=32767;
short b=-32768;
System.out.println("a:"+a+'\n'+"b:"+b);
/**
* a:32767
* b:-32768
*/
//整數型別(-2^31----+2^31-1)
int c= (int) Math.pow(2,32768);
int d= (int) Math.pow(2,32767)-1;
System.out.println("c:"+c+'\n'+"d:"+d);
/**
*c:2147483647
*d:2147483646
*/
//長整數型別(-2^64----+2^64-1)
//位元組型:當賦值的值不是一個整數時,將這個通過Unicode轉化為一個整數
byte age='4';
byte age2='.';
System.out.println("age:"+age);
System.out.println("age2:"+age2);

//位元組陣列。陣列中不是整數的也轉化為相應的整數(通過ASCII碼,這個是和字元型相反的)
byte[] b = new byte[11];
System.out.println(b);
b[0]=-128;
b[1]=20;
b[2]='a';
b[10]='w';
System.out.println("-------------");
for (i = 0;  i< b.length; i++) {
    System.out.println(b[i]);
}
1.2、浮點型
  • 浮點型(float)

Java的浮點數遵循IEEE754標準,採用二進位制資料的科學計數法來表示浮點數,對於float型數值,第1位是符號位,接下里8位表示指數,再接下來的23位表示尾數;

  • 雙精度型(double)

對於double型別數值,第一位也是符號位,接下來的11位表示指數,再接下來的52位表示尾數。

1.3、字元型

char,一個字元由兩個位元組儲存,但只能表示一個字元,不管是數字還是字元還是其他的符號,都會轉化為一個字元

  • 如果是’ '之間的,結果就是單引號之間的、
  • 如果是數字,將通過ASCII碼轉化為一個字元
char a2='2';   //2
char b=97;      //a
char c=2;       //正文開始
char e=34;      //"
char d='#';     //#
1.4、布林型

true,false

2、運算子

2.1、按位與&和邏輯與&&(短路與)的區別(按位或和邏輯或也一樣)

相同點:左右兩邊都是true,結果才為true

不同點:邏輯與當左邊的為false時,不會計算右邊的表示式

2.2、運算子的優先順序

按位高於邏輯的

優先順序運算子
1.  ()   []
2+(正)  -(負)  ++  –  ~  !
3*  /  %
4+(加)  -(減)
5<<   >>(無符號右移)   >>>(有符號右移)
6<  <=   >  >=   instanceof
7==   !=
8&
9|
10^
11&&
12||
13?:
14賦值

三、物件導向

3、JAVA物件導向的三大特性

封裝,繼承,多型

3.1、實現多型的三個必要條件和兩種實現方式:
  • 必要條件:
    • 繼承,重寫,向上轉型

繼承:在多型中必須存在有繼承關係的子類和父類。

重寫:子類對父類中某些方法進行重新定義,在呼叫這些方法時就會呼叫子類的方法。

向上轉型:在多型中需要將子類的引用賦給父類物件,只有這樣該引用才能夠具備技能呼叫父類的方法和子類的方法。

  • 繼承:多個子類重寫父類的同一個方法
  • 介面:實現介面並覆蓋介面中的方法
3.2、什麼是多型機制?Java語言是如何實現多型的?

所謂多型就是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即一個引用變數倒底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中實現的方法,必須在由程式執行期間才能決定。因為在程式執行時才確定具體的類,這樣,不用修改源程式程式碼,就可以讓引用變數繫結到各種不同的類實現上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式程式碼就可以改變程式執行時所繫結的具體程式碼,讓程式可以選擇多個執行狀態,這就是多型性。

多型分為編譯時多型和執行時多型。其中編輯時多型是靜態的,主要是指方法的過載,它是根據引數列表的不同來區分不同的函式,通過編輯之後會變成兩個不同的函式,在執行時談不上多型。而執行時多型是動態的,它是通過動態繫結來實現的,也就是我們所說的多型性。

3.3、抽象類和介面的對比

抽象類是用來捕捉子類的通用特性的。介面是抽象方法的集合。

從設計層面來說,抽象類是對類的抽象,是一種模板設計,介面是行為的抽象,是一種行為的規範。

相同點

  • 介面和抽象類都不能例項化
  • 都位於繼承的頂端,用於被其他實現或繼承
  • 都包含抽象方法,其子類都必須覆寫這些抽象方法

不同點

引數抽象類介面
宣告抽象類使用abstract關鍵字宣告介面使用interface關鍵字宣告
實現子類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有宣告的方法的實現子類使用implements關鍵字來實現介面。它需要提供介面中所有宣告的方法的實現
構造器抽象類可以有構造器介面不能有構造器
訪問修飾符抽象類中的方法可以是任意訪問修飾符介面方法預設修飾符是public。並且不允許定義為 private 或者 protected
多繼承一個類最多隻能繼承一個抽象類一個類可以實現多個介面
欄位宣告抽象類的欄位宣告可以是任意的介面的欄位預設都是 static 和 final 的

抽象類的abstract關鍵字可以修飾類或者方法。

宣告一個抽象方法:它是沒有方法體的,如果一個類中有抽象方法,那麼這個類也必須是抽象類,並且它的繼承類要麼實現它的抽象方法要麼繼承類也是抽象類。

為什麼要用抽象類 什麼情況下用抽象類

  • 根本原因:無法完整的描述一個類
  • 抽象類中的抽象方法,必須要子類去實現(或者子類也是抽象類就不用去實現,看業務需求)
  • 和介面相比:介面裡面的方法都要實現,當介面裡面的方法比較多的時候,就會很麻煩。但是抽象類就沒有限制。
  • 易於理解

4、內部類

內部類也就是將類的定義在一個類中定義。分為靜態內部類,區域性內部類,成員內部類,匿名內部類

4.1、靜態內部類(靜態的只能使用靜態的資料)

有static修飾的內部類,他可以訪問類中的外部類的所有靜態變數,而不可訪問外部類的非靜態變數,靜態內部類的建立方式,new.外部類().內部類()

4.2、成員內部類

在成員位置定義的內部類,可以訪問外部類的所有資料。但是它的例項化需要依賴外部類的例項,外部類例項.new 內部類()

4.3、區域性內部類

定義在外部類的方法中,在普通方法中的話,內部類可以訪問外部類的所有資料;在靜態方法中的話,只能訪問外部類的靜態資源。區域性內部類的例項化只能建立在方法中。new 內部類()

4.4、匿名內部類

沒有名字的內部類,開發者比較常用。使用new 內部類()

特點:

  • 匿名內部類必須繼承一個抽象類或者實現一個介面
  • 匿名內部類中不能定義任何靜態資源
  • 當所在的方法的形參需要被內部類使用時,必須宣告為final

內部類的優點

我們為什麼要使用內部類呢?因為它有以下優點:

  • 一個內部類物件可以訪問建立它的外部類物件的內容,包括私有資料!
  • 內部類不為同一包的其他類所見,具有很好的封裝性;
  • 內部類有效實現了“多重繼承”,優化 java 單繼承的缺陷。
  • 匿名內部類可以很方便的定義回撥。

內部類有哪些應用場景

  1. 一些多演算法場合
  2. 解決一些非物件導向的語句塊。
  3. 適當使用內部類,使得程式碼更加靈活和富有擴充套件性。
  4. 當某個類除了它的外部類,不再被其他的類使用時。

區域性內部類和匿名內部類在訪問區域性變數時為什麼變數加上final?

是因為生命週期不一樣,區域性變數直接儲存在棧中,方法呼叫結束就會將這個變數銷燬,但是內部類對區域性變數的引用還存在,如果內部類要呼叫這個區域性變數就會出錯,所以要將這個區域性變數加上final,這樣就不會出錯了。

5、重寫和過載

方法的過載和重寫都是實現多型的方式,區別在於牽著實現的是編譯時的多型性,後者是執行時的多型性。

  • 過載:只是方法名一樣,其他的不同
  • 重寫:方法名和引數列表必須相同

6、相等和equals的區別

==:作用是判斷兩個物件的地址是不是相等,即判斷兩個物件是不是同一個物件(基本資料型別比較的是值,引用資料型別比較的是記憶體地址)

equals():判斷兩個物件是否相等,判斷是兩個物件的地址是否相等。一般會重寫類中的equals方法,判斷兩個物件的值是否相等。equals是Object中的方法,它裡面比較的是物件的記憶體地址,而String中比較的是物件的值。

  • new String()建立的物件在堆中儲存
  • 直接賦值建立的字串儲存在串池中
String a=new String("ab");  //在堆中被建立
String b="ab";      //在串池中被建立
String c="ab";      //引用串池中已近存在的"ab"

System.out.println(a==b);   //false,他們的地址不相等
System.out.println(a==c);   //false,他們的地址不相等
System.out.println(b==c);   //true,b在串池被建立,c引用的b,所以他們的地址相等
System.out.println(a.equals(b));    //true

System.out.println("****");
int age1=10;
int age2=10;
System.out.println(age1==age2);  //true

7、雜湊值和equals方法

hashcode是一個雜湊值,一個int整數,這個雜湊值的作用是該物件在雜湊表的索引位置。

雜湊表中儲存的是key-value,雜湊值就是key,value就是物件。它的作用就是快速的檢索出對應的值。

那為什麼會hashcode呢?

當把物件放在Hashset中,會先計算物件的hashcode來判斷物件加入的位置,也會和已經加入的物件的hashcode作比較,如果沒有一樣的,那麼就再將這個物件放到雜湊表中;如果有物件的hashcode一樣,那麼在呼叫equals方法比較這兩個物件是否真的相等,如果相等,不會讓其加入hashset,否則。

  • hashcode方法預設在堆中產生獨特值,一般的話都會重寫這個方法。
  • 物件的相等比較的是記憶體中的值是否相等,飲用比較的是指向他們的記憶體地址是否先等

8、java的只有值傳遞

方法呼叫的引數值(基本型別)只是一個拷貝,不能修改原始值。但是如果引數值是引用型別的話就會修改原始值:::(引用是地址的指向一樣,基本型別只是一個拷貝

四、IO流

1、BIO同步阻塞IO

資料的讀取寫入必須在一個執行緒內等待其完成。使用簡單方便,併發能力低

2、NIO同步非阻塞IO

客戶端和服務端通過channel通訊,實現了多路複用。

3、AIO非同步非阻塞IO

基於時間和回撥機制

五、反射

JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。

靜態編譯和動態編譯

  • **靜態編譯:**在編譯時確定型別,繫結物件
  • **動態編譯:**執行時確定型別,繫結物件

反射機制優缺點

  • 優點: 執行期型別的判斷,動態載入類,提高程式碼靈活度。
  • 缺點: 效能瓶頸:反射相當於一系列解釋操作,通知 JVM 要做的事情,效能比直接的java程式碼要慢很多

Java獲取反射的三種方法

1.通過new物件實現反射機制 2.通過路徑實現反射機制 3.通過類名實現反射機制

public class Student {
    private int id;
    String name;
    protected boolean sex;
    public float score;
}

public class Get {
    //獲取反射機制三種方式
    public static void main(String[] args) throws ClassNotFoundException {
        //方式一(通過建立物件)
        Student stu = new Student();
        Class classobj1 = stu.getClass();
        System.out.println(classobj1.getName());
        //方式二(所在通過路徑-相對路徑)
        Class classobj2 = Class.forName("fanshe.Student");
        System.out.println(classobj2.getName());
        //方式三(通過類名)
        Class classobj3 = Student.class;
        System.out.println(classobj3.getName());
    }
}


六、常用API

儲存字串可以使用char陣列,但String的底層封裝了char陣列,所以一般使用String來操作字串。

1、String有哪些特性、

  • 不變性:常量字串不能被修改

  • 常量池優化:String建立的物件,儲存在串池中,下次建立相同的物件會直接放回其引用。

  • 使用final定義String類,表示被繼承,提高了系統的安全性

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence {
    
    //修改String常量
    String desc="Spring cloud";
    
    Field valueFieldsOfStrimng = String.class.getDeclaredField("value");
    valueFieldsOfStrimng.setAccessible(true);
    char[]value = (char[])valueFieldsOfStrimng.get(desc);
    value[5]='@';
    System.out.println(desc);
    
    //output :Sprin@ cloud
    

2、String常用的方法

System.out.println(desc.length());
System.out.println(desc.indexOf('o'));
System.out.println(desc.charAt(2));
System.out.println(desc.replace('d','a'));
System.out.println(desc.trim());
String[] array=desc.split(" ");
for (String arr:array) {
    System.out.println(arr);
}
System.out.println(array);
System.out.println(desc.toLowerCase());
System.out.println(desc.toUpperCase());
System.out.println(desc.substring(2));
System.out.println(desc.equals(desc.substring(5)));

3、String和StringBuffer、StringBuilder的區別是什麼?String為什麼是不可變的

StringBuffer是執行緒安全的,並有一定的快取,字串太大會增加字元創的容量,多執行緒操作字元創

StringBulider是想成不安全的,單執行緒操作字元創

相關文章