主頁 > 後端開發 > JAVA SE基礎知識總結

JAVA SE基礎知識總結

2021-03-05 11:06:18 後端開發

JAVA基礎篇

  • 1_JAVA語言概述
    • 1.1 JAVA的總體概述
    • 1.2 JAVA語言概述
      • 1.2.1 基礎常識
      • 1.2.2 計算機語言的發展迭代史
      • 1.2.3 Java語言版本迭代概述
      • 1.2.4 Java語言應用的領域
      • 1.2.5 Java語言的特點
    • 1.3 開發環境的搭建(重點)
      • 1.3.1 JDK、JRE、JVM的關系
      • 1.3.2 JDK的下載、安裝
      • 1.3.3 path環境變數的配置
        • 1.3.3.1 為什么配置path環境變數?
        • 1.3.3.2 如何配置?
      • 1.3.4 第一個JAVA程式
      • 1.3.5 注釋與API檔案等...
        • 1.3.5.1 注釋:Comment
        • 1.3.5.2 Java API 檔案
        • 1.3.5.3 良好的編程風格
        • 1.3.5.4 EditPlus
  • 2_JAVA的基礎語法
    • 2.1 關鍵字與識別符號
      • 2.1.1 java關鍵字的使用
      • 2.1.2 保留字:
      • 2.1.3 識別符號的使用
    • 2.2 變數的使用和資料型別
      • 2.2.1 變數的分類
      • 2.2.2 定義變數的格式
      • 2.2.3 變數使用的注意點:
      • 2.2.4 基本資料型別變數間運算規則
      • 2.2.5 String與8種基本資料型別間的運算
    • 2.3 進制(只做了解)
    • 2.4 運算子
    • 2.5 流程控制(回圈陳述句)
  • 3_陣列
    • **陣列的宣告**:三種方式
    • **二維的陣列**:一維的元素是另一個陣列
  • 4_面向物件
    • 4.1 面向物件學習的三條主線:
    • 4.2 面向物件中兩個重要的概念:
    • 4.3 面向程序和面向物件的區別
    • 4.4 靜態
    • 4.5 封裝
    • 4.6 繼承
      • 4.6.1 繼承的語法
      • 4.6.2 java繼承的特點:
      • 4.6.3、方法的多載和方法的重寫:
    • 4.7 多型
    • 4.8 抽象
    • 4.9 static:靜態的
    • 4.10 介面
    • 4.11 封裝類
    • 4.12 列舉
    • 4.13 內部類
    • 4.14 注解
  • 5_例外處理
    • 5.1 例外
      • 5.1.1 例外的體系結構
      • **5.1.2 從程式的執行角度來看分為運行時例外和編譯時例外**
      • 5.1.3 常見的例外型別,請舉例說明:
    • 5.2 例外的處理
      • 5.2.1 **例外處理方式一:try-catch-finally**
      • 5.2.2 例外處理方式二:throws,throw
      • 5.2.3 自定義例外:

1_JAVA語言概述

1.1 JAVA的總體概述

總體概述圖

第一部分:編程語言的核心結構
主要知識點:變數基礎語法分支回圈陣列流程控制
第二部分:JAVA面向物件的核心邏輯
主要知識點:封裝繼承多型抽象
第三部分:JAVA SE 高級部分
主要知識點:集合、泛型、例外、反射、網路編程、I/O、多執行緒、…

1.2 JAVA語言概述

1.2.1 基礎常識

軟體:即一系列按照特定順序組織的計算機資料和指令的集合,分為:系統軟體 和 應用軟體
系統軟體:windows , mac os , linux ,unix,android,ios,…
應用軟體:word ,ppt,畫圖板,…
人機互動方式: 圖形化界面 OR 命令列方式

常用的DOS命令:
DOS命令

1.2.2 計算機語言的發展迭代史

1、機器語言

最初的計算機所使用的是由“0”和“1”組成的二進制數,二進制是計算機的語言的基礎,計算機發明之初,計算機只能被少部分人使用,人們需要用0、1組成的指令序列交由計算機執行,對于機器語言的使用與普及都是很令人頭疼的問題,對于程式的移植能力幾乎沒有,從而時間成本,人力成本十分昂貴,但機器語言也不是沒有優勢,由于這種語言是直接對計算機硬體進行操作,所以在特定型號的計算機上面,運算效率也是很高的,機器語言的出現對于未來的計算機語言發展起到了很好的推動作用,所以機器語言也是第一代計算機語言,

2、匯編語言

匯編語言是在機器語言的基礎上誕生的一門語言,用一些簡潔的英文字母、符號串來替代一個特定的指令的二進制串,這也提高了語言的記憶性和識別性,對于程式的開發與維護起到了積極作用,匯編語言同樣也是直接對硬體進行操作,這樣依然局限了它的移植性,但是使用匯編語言針對計算機特定硬體而編制的匯編語言程式,對于計算機硬體的功能和特長的發揮已有了很大進步,它精煉而質量高,所以至今仍是一種常用的程式開發語言,
  
3、高級語言

從最初與計算機交流的痛苦經歷中,人們意識到,應該設計一種這樣的語言,這種語言接近于數學語言或人的自然語言,同時又不依賴于計算機硬體,編出的程式能在所有機器上通用,經過努力,1954年,第一個完全脫離機器硬體的高級語言—FORTRAN問世了,40多年來,共有幾百種高級語言出現,有重要意義的有幾十種,影響較大、使用較普遍的有FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、C、PROLOG、Ada、C++、VC、VB、Delphi、JAVA等,高級語言的發展也經歷了從早期語言到結構化程式設計語言,從面向程序到非程序化程式語言的程序,相應地,軟體的開發也由最初的個體手作業坊式的封閉式?生產,發展為產業化、流水線式的工業化生產,

面向物件:Java,JS,Python,Scala,…
面向程序:C,Pascal、Fortran

1.2.3 Java語言版本迭代概述


1991年 Green專案,開發語言最初命名為Oak (橡樹)
1994年,開發組意識到Oak 非常適合于互聯網
1996年,發布JDK 1.0,約8.3萬個網頁應用Java技術來制作
1997年,發布JDK 1.1,JavaOne會議召開,創當時全球同類會議規模之最
1998年,發布JDK 1.2,同年發布企業平臺J2EE
1999年,Java分成J2SE、J2EE和J2ME,JSP/Servlet技術誕生
2004年,發布里程碑式版本:JDK 1.5,為突出此版本的重要性,更名為JDK 5.0
2005年,J2SE -> JavaSE,J2EE -> JavaEE,J2ME -> JavaME
2009年,Oracle公司收購SUN,交易價格74億美元
2011年,發布JDK 7.0
2014年,發布JDK 8.0,是繼JDK 5.0以來變化最大的版本
2017年,發布JDK 9.0,最大限度實作模塊化
2018年3月,發布JDK 10.0,版本號也稱為18.3
2018年9月,發布JDK 11.0,版本號也稱為18.9

1.2.4 Java語言應用的領域

Java Web開發:后臺開發
大資料開發:
Android應用程式開發:客戶端開發

1.2.5 Java語言的特點

面向物件性:
兩個要素:類、物件
三個特征:封裝、繼承、多型
健壯性:① 去除了C語言中的指標 ②自動的垃圾回識訓制 -->仍然會出現記憶體溢位、記憶體泄漏
跨平臺型:write once,run anywhere:一次編譯,到處運行
功勞歸功于:JVM
JVM

1.3 開發環境的搭建(重點)

1.3.1 JDK、JRE、JVM的關系

JDK = JRE + 集成開發工具
JRE = JVM + JAVA SE基礎類別庫

1.3.2 JDK的下載、安裝

下載:http://www.oracle.com/technetwork/java/javase/downloads/index.html
安裝:傻瓜式安裝:JDK 、JRE
注意問題:安裝軟體的路徑中不能包含中文、空格,

1.3.3 path環境變數的配置

1.3.3.1 為什么配置path環境變數?

path環境變數:windows作業系統執行命令時所要搜尋的路徑
為什么要配置path:希望java的開發工具(javac.exe,java.exe)在任何的檔案路徑下都可以執行成功,

1.3.3.2 如何配置?

找到環境變數

右鍵我的電腦點屬性:
在這里插入圖片描述
點擊高級系統設定

在這里插入圖片描述
選擇環境變數
在這里插入圖片描述
配置系統環境變數
在這里插入圖片描述

新建JAVA_HOME變數,變數值是JDK安裝的根目錄
在這里插入圖片描述
在Path變數中添加JAVA_HOME

Path是原有變數,只能編輯,不要新建,
在這里插入圖片描述
添加:%JAVA_HOME%\bin.并上移到第一位
在這里插入圖片描述
環境變數配置成功之后,需要在cmd下運行javac和java命令出現如下影像代表配置成功
在這里插入圖片描述

1.3.4 第一個JAVA程式

新建java源檔案,編譯java源檔案,運行位元組碼檔案
創建一個java源檔案:
HelloWorld.java
在這里插入圖片描述

class HelloChina{
	public static void main(String[] args){
		System.out.println("Hello,World!");
	}
}

編譯源檔案使用javac命令

javac HelloChina.java

編譯成功后形成class檔案
運行可執行檔案

java HelloChina

運行結果:
在這里插入圖片描述

1.3.5 注釋與API檔案等…

1.3.5.1 注釋:Comment

分類:

單行注釋://
多行注釋:/*     */
檔案注釋:/**     */

作用:

① 對所寫的程式進行解釋說明,增強可讀性,方便自己,方便別人
② 除錯所寫的代碼
特點:

①單行注釋和多行注釋,注釋了的內容不參與編譯,
②多行注釋不可以嵌套使用

1.3.5.2 Java API 檔案

API: application programming interface,習慣上:將語言提供的類別庫,都稱為api.
API檔案:針對于提供的類別庫如何使用,給的一個說明書,類似于《新華字典》

1.3.5.3 良好的編程風格

在這里插入圖片描述

1.3.5.4 EditPlus

EditPlus是一款由韓國 Sangil Kim (ES-Computing)出品的小巧但是功能強大的可處理文本、HTML和程式語言的Windows編輯器,你甚至可以通過設定用戶工具將其作為C,Java,Php等等語言的一個簡單的IDE,
官網下載: https://www.editplus.com/

2_JAVA的基礎語法

2.1 關鍵字與識別符號

2.1.1 java關鍵字的使用

定義:被Java語言賦予了特殊含義,用做專門用途的字串(單詞)
特點:關鍵字中所字母都為小寫
在這里插入圖片描述
在這里插入圖片描述

2.1.2 保留字:

	現Java版本尚未使用,但以后版本可能會作為關鍵字使用,
	具體哪些保留字:goto 、const
	注意:自己命名識別符號時要避免使用這些保留字

2.1.3 識別符號的使用

定義:凡是自己可以起名字的地方都叫識別符號,
涉及到的結構:
包名、類名、介面名、變數名、方法名、常量名
規則:(必須要遵守,否則,編譯不通過)

在這里插入圖片描述

規范:(可以不遵守,不影響編譯和運行,但是要求大家遵守)
在這里插入圖片描述
注意點
在起名字時,為了提高閱讀性,要盡量意義,“見名知意”,

2.2 變數的使用和資料型別

2.2.1 變數的分類

按資料型別分類
在這里插入圖片描述
詳細說明:

整型:

byte(1位元組=8bit) \ short(2位元組) \ int(4位元組) \ long(8位元組)
① byte范圍:-128 ~ 127
② 宣告long型變數,必須以"l"或"L"結尾
③ 通常,定義整型變數時,使用int型,
④整型的常量,默認型別是:int型

浮點型 :

float(4位元組) \ double(8位元組)
① 浮點型,表示帶小數點的數值
② float表示數值的范圍比long還大
③ 定義float型別變數時,變數要以"f"或"F"結尾
④ 通常,定義浮點型變數時,使用double型,
⑤浮點型的常量,默認型別為:double

字符型

char (1字符=2位元組)
① 定義char型變數,通常使用一對’’,內部只能寫一個字符
② 表示方式:1.宣告一個字符 2.轉義字符 3.直接使用 Unicode 值來表示字符型常量

布爾型

boolean
① 只能取兩個值之一:truefalse
② 常常在條件判斷、回圈結構中使用

按宣告的位置分類(了解)
在這里插入圖片描述

2.2.2 定義變數的格式

資料型別 變數名 = 變數值;

 int one = 100;

資料型別 變數名;
變數名 = 變數值;

  int one;
  one = 100;

2.2.3 變數使用的注意點:

① 變數必須先宣告,后使用
② 變數都定義在其作用域內,在作用域內,它是有效的,換句話說,出了作用域,就失效了
③ 同一個作用域內,不可以宣告兩個同名的變數

2.2.4 基本資料型別變數間運算規則

涉及到的基本資料型別:除了boolean之外的其他7種
自動型別轉換(只涉及7種基本資料型別)
結論:當容量小的資料型別的變數與容量大的資料型別的變數做運算時,結果自動提升為容量大的資料型別,
byte 、char 、short --> int --> long --> float --> double
特別的:當byte、char、short三種型別的變數做運算時,結果為int型
說明:此時的容量大小指的是,表示數的范圍的大和小,比如:float容量要大于long的容量

強制型別轉換(只涉及7種基本資料型別):自動型別提升運算的逆運算,
1.需要使用強轉符:()
2.注意點:強制型別轉換,可能導致精度損失,

2.2.5 String與8種基本資料型別間的運算

  1. String屬于參考資料型別,翻譯為:字串
  2. 宣告String型別變數時,使用一對""
  3. String可以和8種基本資料型別變數做運算,且運算只能是連接運算:+
  4. 運算的結果仍然是String型別
    避免:
String s = 123;//編譯錯誤
String s1 = "123";
int i = (int)s1;//編譯錯誤

2.3 進制(只做了解)

編程中涉及的進制及表示方式:
在這里插入圖片描述
二進制的使用說明:

計算機底層的存盤方式:所有數字在計算機底層都以二進制形式存在,
二進制資料的存盤方式:所有的數值,不管正負,底層都以補碼的方式存盤,
原碼、反碼、補碼的說明:
正數:三碼合一
負數:
在這里插入圖片描述

2.4 運算子

算術運算子:
+ - * / % ++ –

%運算只能在整數型時使用,浮點數不適用,

++前 是變數先自加再運算,后++ 是變數先運算在自加,

賦值運算子
= += -= *= /= %=

=運算子右側會出現四種情況

int i = 100;// 常量值賦值,什么型別的常量值賦值給什么型別的變數,
int i = 100 + 50;// 運算式運算結果賦值,
int j = i;// 變數給變數賦值,值傳遞,
double d = Math.random();// 方法的回傳值賦值,
one += 10 等同于 one = one + 10;

關系運算子
< > <= >= == !=

關系運算子連接的關系運算式,關系運算式的結果是boolean,

邏輯運算子:
邏輯運算子的作用是連接多個關系運算式,& | ^ ! && ||

&符號:左右兩端的關系運算式同時回傳true的時候整個運算式回傳true,有一端回傳false則整個運算式是false,

|符號:左右兩端有一端是回傳true則整個運算式回傳true,只有兩端同時回傳false整個運算式才回傳false,

^符號:異或就是找不同,左右兩端的運算式回傳的結果不一樣,則回傳true,左右兩端回傳的結果一樣則回傳false,

!:反轉一個boolean運算式的結果,true變false,false變true,

&&:短路與,短路與左側關系運算式為false則右側關系運算式將不再運算,

||:短路或,短路或左側運算式回傳為true則右側運算式不再運算,

三目運算子:
?:,問號左側是一個boolean運算式,當boolean運算式的結果是true 則執行:號左側的運算式,回傳false則執行:右側的運算式,

位運算子(了解):
& | ^ ~ << >> >>> 對于數學運算,位運算的效率更高,位運算只能操作整數,

<< 左移 : 任何一個數左移N位,相當于這個數乘以2的N次方, >>右移:任何一個數右移N為,相當于這個數除以2的N次方法,

2.5 流程控制(回圈陳述句)

順序結構:程式從上到下執行,

判斷結構:if,if-else

if(條件運算式){// 條件運算式回傳true,則執行if塊,if塊執行結束程式會向下繼續,如果回傳false則跳過if塊執行后面的代碼,
    
}
if(條件運算式){// if后面的運算式回傳true則執行if塊,回傳false則執行else塊,
    
}else{
}
    

分支結構:多重的if-else

if(條件1){
}else if(條件2){// 多重的else if可以寫任何多個,沒有個數限制
}else if(條件3){
}
.......
else{// 可選結構
}

分支結構:switch-case

switch(運算式){
case 常量1:
	執行陳述句1;
	//break;
case 常量2:
	執行陳述句2;
	//break;
default:
	//可選
     break;

回圈結構 :while,do-while,for

while(回圈條件){// 回圈條件為true則進入回圈體,回圈體執行完畢,則回傳起點重新判斷回圈條件
    // 回圈操作
}
// while回圈,先判斷后執行,如果回圈條件的初始值不滿足則一次回圈都不執行
do{
    // 回圈操作
}while(回圈條件);
// do-while回圈,先執行后判斷,回圈體會首先執行一次,然后判斷回圈條件,回圈條件true則繼續回圈,false則退出回圈,
for(回圈變數的定義;回圈條件;回圈變數的改變){// 用于執行回圈次數確定,先判斷后執行,三個運算式都可以根據需求進行省略,但是兩個分號不能省略,
    // 回圈操作
}

二重回圈:嵌套的回圈

// 一個回圈完整的包含在另一個回圈的回圈體里,可以是任何一個回圈結構去包含另一個回圈系結構
for(){// 外層回圈
    for(){// 內層回圈
        // 外層回圈執行一次,內層回圈要完整的執行完所有的操作,所以內層回圈的回圈體執行的次數是外層回圈次數*記憶體回圈次數,
    }
}

3_陣列

陣列的概念:陣列是一個裝載多個資料的容器,

陣列的四個要素:陣列的型別,陣列名,陣列元素,訪問下標,

陣列的宣告:三種方式

int[] one = new int[5];// 陣列必須在宣告的時候給出長度,且這個長度不再改變,第一種宣告方式,給出陣列長度,但是沒有給陣列元素賦值,陣列元素上是默認值,

int[] two = {30,50};// 陣列在宣告的同時給每一個元素賦值,陣列的長度根據大括號中的值得數量決定,這種方式必須在一行之內完成,

int[] three
three = new int[]{30,40,50};// 陣列在宣告的同時給每一個元素賦值,陣列的長度根據大括號中的值得數量決定,這種方式允許在兩行之內完成,

陣列的遍歷:

// 普通for回圈遍歷陣列
for(int i = 0;i < nums.length; i++){
    System.out.println(nums[i]);// 訪問陣列元素的方式是陣列名[下標],下標的合法訪問區間,是0到陣列長度-1.訪問陣列元素時,如果下標在合法區間,則訪問可以正常進行,如果訪問下標超過了合法區間則會拋出陣列越界例外,
}

二維的陣列:一維的元素是另一個陣列

int[][] nums = new int[5][3];// 同時給出一維和二維的陣列長度,

int[][] nums = new int[5][];// 只給出一維的長度,不給二維的長度,此時一維元素為null,
nums[0] = new int[3];// 創建新陣列給一維元素賦值,

int[][] nums = {{35,87,90},{35,77,20,17},{90,87,65,100,40}};// 靜態宣告二維陣列,必須在宣告陣列的同時完成賦值

int[][] nums;
nums = new int[][]{{1,2,3},{1,2,3},{1,2,3}};// 靜態初始化二維陣列,允許在陣列宣告之后賦值,

二維陣列的遍歷

for(int i = 0;i < nums.length; i++){// 回圈遍歷一維陣列
    for(int j = 0;j < nums[i].length; j++){
        System.out.println(nums[i][j]);
    }
}

4_面向物件

4.1 面向物件學習的三條主線:

  • 1.Java類及類的成員:屬性、方法、構造器;代碼塊、內部類

  • 2.面向物件的大特征:封裝性、繼承性、多型性、(抽象性)

  • 3.其它關鍵字:this、super、static、final、abstract、interface、package、import等

4.2 面向物件中兩個重要的概念:

類:對一類事物的描述,是抽象的、概念上的定義
物件:是實際存在的該類事物的每個個體,因而也稱為實體

面向物件程式設計的重點是類的設計
設計類,就是設計類的成員,

4.3 面向程序和面向物件的區別

  • 面向程序:考慮問題主要是分步,步驟不可逆,順序執行,

  • 面向物件:考慮問題主要是找到解決問題的類,用類創建物件,用物件呼叫屬性或者方法,

  • 類:是一個規范,是一個模板,規定了一類事物必須有的屬性和方法,

  • 物件:使用類創建出來的具體的客觀存在的物體,使用物件呼叫屬性,使用物件呼叫方法,

在java程式中定義類

public class Student{// 定義類的時候給出若干屬性和方法,類體中主要是定義屬性和方法,
    public String stuName;
    public int stuAge;
    
    public void sayHello(){// 定義方法,方法有五個常規部分,訪問修飾符,回傳型別,方法名,引陣列,方法體,訪問修飾符暫時記public,回傳型別如果沒有回傳值則寫void,引陣列如果沒有引數則小括號空著,大括號中是方法體, 
    }
    
    public int methodOne(){// 當一個方法規定了回傳型別,必須在方法結束前,回傳一個該型別的變數,
        int one = 0;
        one = 100;
        return one;// java語言規定回傳值只能回傳一個值,
    }
    
    public void methodTwo(int i,double d){// 方法有引數,引數是基礎型別,一個方法定義引數,那么呼叫這個方法的時候必須按照要求傳參,引數型別要求,引數個數要求,順序要求,
        System.out.println(i+d);
    }
    
    public void methodThree(String s){// 引數是參考型別,引數是物件,物件有屬性,物件有方法,
        System.out.println(s.equals("Tom"));
    }
}

4.4 靜態

static關鍵字:static關鍵字能修飾類的成員,被static關鍵字修飾的屬性叫靜態屬性,被static關鍵字修飾的方法叫靜態方法,

靜態成員的特征:

  • 1、靜態成員可以不用創建物件,直接由類名呼叫,也可以由物件名呼叫,但不推薦這樣做,

  • 2、靜態的成員只能訪問靜態的成員,不能訪問普通成員,靜態的成員初始化時間比較早,在類的加載同時初始化,普通的成員在創建物件時初始化,

  • 3、靜態屬性是類所有物件共有屬性,也被稱作類變數,靜態屬性出現在記憶體的方法區中,

4.5 封裝

面向物件語言的三大特性:封裝,繼承,多型,

封裝:將類的細節隱藏起來,通過private修飾符,阻止外界訪問,通過給private修飾的成員提供public的訪問方法類實作訪問,

JavaBean:所有的屬性都是private修飾的,所有的private修飾的屬性都有public修飾的get/set方法,必須擁有一個無參的構造方法,有參的構造方法可選,

public class Student {
    private String stuName;
    private Integer stuAge;
    private String stuGender;

    public Student() {
    }

    public Student(String stuName, Integer stuAge, String stuGender) {
        this.stuName = stuName;
        this.stuAge = stuAge;
        this.stuGender = stuGender;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public Integer getStuAge() {
        return stuAge;
    }

    public void setStuAge(Integer stuAge) {
        this.stuAge = stuAge;
    }

    public String getStuGender() {
        return stuGender;
    }

    public void setStuGender(String stuGender) {
        this.stuGender = stuGender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuName='" + stuName + '\'' +
                ", stuAge=" + stuAge +
                ", stuGender='" + stuGender + '\'' +
                '}';
    }
}

4.6 繼承

4.6.1 繼承的語法

public class Father{
    
    private int one;
    
    public int getOne(){
        return one;
    }
    public void setOne(int one){
        this.one = one;
    }
    
    public void show(){
        System.out.println("one="+one);
    }
}

public class Son extends Father{// Son類繼承自Father類,Son類是子類,Father類是父類,
    // 子類可以繼承到父類所有的屬性和方法,但是不能繼承構造方法,private的屬性和方法可以被子類繼承,但是不能被子類直接訪問,需要通過public修飾的方法方法,
    private int two;// 子類可以擁有自己的屬性和方法
    public int getTwo(){
        return two;
    }
    public void setTwo(int two){
        this.two = two;
    }
    
    public void getInfo(){
        System.out.println("one="+this.getOne()+",two="+this.two;
    }
}

4.6.2 java繼承的特點:

java語言使用單繼承,單繼承就是一個java類只能有一個父類,一個父類可以有多個子類,

一個java類如果顯示的繼承自類一個類,那么它的父類就是顯示繼承的類,如果一個java類沒有顯示的繼承,那么它隱示的繼承自Object,所以所有的java類的父類都是Object,Object就是java繼承樹的根節點,

4.6.3、方法的多載和方法的重寫:

方法的多載:發生在一個類中,方法名相同,引陣列不同(引數型別不同,引數個數不同,引數順序不同),

方法的重寫:發生在父子類中,子類撰寫一個方法名,引陣列,訪問修飾符,回傳型別和父類方法完全一樣的方法,子類重寫的父類方法的修飾符只允許比父類方法更寬不能比父類方法更窄,子類重寫父類 的方法時,子類重寫的方法的回傳型別允許是父類方法回傳型別的子型別,方法重寫是一個方法,一旦子類重寫了父類的方法,再呼叫的一定是子類重寫的方法,

4.7 多型

多型的概念:任何一個需要父類參考的位置,都可以傳遞一個子類物件,

多型的實作步驟

1、有繼承,有父子類,
2、父類定義方法,子類重寫方法,
3、父類的參考,子類的物件,

class Father{
    public void methodOne(){
        System.out.println("父類的methodOne");
    }
}

class Son extends Father{
    public void methodOne(){
        System.out.println("子類重寫的methodOne");
    }
}

class Test{
    public static void main(String[] args){
        Father f = new Son();// 創建物件多型
        f.methodOne();// 子類一旦重寫父類方法,再次呼叫的一定是子類重寫的方法,
        
        // Son son = new Son();
        methodTwo(new Son());// 引數定義是父型別別,傳遞引數時傳遞子類物件,
        
        Father[] nums = new Father[5];// 宣告一個父型別別的物件陣列
        nums[0] = new Son();// 為陣列元素賦值時傳遞子類物件,
        nums[1] = new Son();
        nums[2] = new Son();
        nums[3] = new Son();
        nums[4] = new Son();
    }
    
    public static void methodTwo(Father f){// 方法定義的引數是父型別別引數,
        f.methodOne();
    }
}

4.8 抽象

abstract關鍵字:可以修飾類,被修飾的類稱作抽象類,抽象類不能被實體化,可以修飾方法,被修飾的方法稱作抽象方法,抽象方法沒有方法體,抽象的方法必須在抽象的類中,抽象的類中可以有抽象的方法也可以有普通的方法

abstract class Father{
    public abstract void methodOne();// 抽象的方法沒有方法體,抽象的方法必須在抽象的類里
    public void methodTwo(){
        // 抽象的類中還可以有普通的方法,
    }
}

class Son extends Father{
    public void methodOne(){
        // 子類繼承自抽象父類,必須重寫父類中所有的抽象方法,
    }
}

class Test{
    public static void main(String[] args){
       // Father f = new Father();// 抽象類不能創建物件
        Father f = new Son();// 抽象類需要物件,只能創建抽象了的子類物件,
    }
}

注意點

  • 1.abstract不能用來修飾:屬性、構造器等結構
  • 2.abstract不能用來修飾私方法、靜態方法、final的方法、final的類

4.9 static:靜態的

可以用來修飾的結構:主要用來修飾類的內部結構
屬性、方法、代碼塊、內部類

靜態成員的特征:

  • 1、靜態成員可以不用創建物件,直接由類名呼叫,也可以由物件名呼叫,但不推薦這樣做,

  • 2、靜態的成員只能訪問靜態的成員,不能訪問普通成員,靜態的成員初始化時間比較早,在類的加載同時初始化,普通的成員在創建物件時初始化,

  • 3、靜態屬性是類所有物件共有屬性,也被稱作類變數,靜態屬性出現在記憶體的方法區中,

//示例代碼
class Circle{
	
	private double radius;
	private int id;//自動賦值
	
	public Circle(){
		id = init++;
		total++;
	}
	
	public Circle(double radius){
		this();
//		id = init++;
//		total++;
		this.radius = radius;
		
	}
	
	private static int total;//記錄創建的圓的個數
	private static int init = 1001;//static宣告的屬性被所物件所共享
	
	public double findArea(){
		return 3.14 * radius * radius;
	}

	public double getRadius() {
		return radius;
	}

	public void setRadius(double radius) {
		this.radius = radius;
	}

	public int getId() {
		return id;
	}

	public static int getTotal() {
		return total;
	}

}

4.10 介面

介面的語法

public interface A{
    // 介面中所有的屬性默認是公開靜態常量
    public static final String NAME = "Tom";
    // 介面中所有的方法默認是公開抽象
    public abstract void methodOne();
}

*介面的特點:

  • 1、介面不允許實體化,

  • 2、介面必須配備實作類,

*介面的實作類:

// 使用implements關鍵字,類B是介面A的實作類
// 一個介面的實作類必須實作介面中所有的抽象方法
public class B implements A{
    public void methodOne(){
        System.out.println("hello world!");
    }
}
// 一個介面可以有多個實作類
public class C implements A{
    public void methodOne(){
        System.out.println("bye bye!");
    }
}

// 一個類可以實作多個介面,一個類實作多個介面必須,實作這些介面中的所有的抽象方法,
public class D implements A,Comparable{
    
}

介面可以繼承,并且是多繼承

interface A{
    public void methodOne();
}

// 介面可以繼承介面
interface B extends A{
    // 子介面繼承父介面,子介面將繼承到父介面中的方法
    
    public void methodTwo();
}

class C implements B{
    public void methodOne(){};
    
    public void methodTwo(){};
}

interface D{
}
// 介面可以多繼承
interface E extends A,D{
}

4.11 封裝類

概念:java語言為每一種基礎資料型別都對應的準備了一個參考型別,這個參考型別叫做封裝類,

封裝類的基本操作

// 1、創建封裝類物件
Integer one = new Integer(10);
Integer two = new Integer("50");

// 2、物件轉基礎型別
int i = one.intValue();

// 3、基礎型別轉封裝型別
Integer one = new Integer(i);
Integer two = Integer.valueOf(i);

// 4、String型別轉封裝型別
Integer one = new Integer("50");

// 5、封裝型別轉String
String s = one.toString();

// 6、基礎型別轉String
String s = Integer.toString(i);

自動裝箱和自動拆箱:從jdk1.5開始,基礎型別和對應參考型別可以自動轉換,如果是參考型別需要進行運算,參考型別必須轉成基礎型別,

4.12 列舉

概念:列舉用于適應只有固定的幾個值的情況,比如一年有四季,一個年有十二個月,一個星期有七天,

實作列舉:jdk1.5之前的列舉

public class Gender{
    // 提供公開靜態常量的該類屬性
    public static final Gender MAN = new Gender();
    public static final Gender WEMON = new Gender();
    
    // 構造方法私有
    private Gender(){
        
    }
}

jdk 1.5之后的列舉

public enum Gender{
    // 必須在類體的第一部分宣告該類屬性的公開靜態常量
    // 除屬性名外的其他修飾部分全部省略
    MAN,WEMON;
    
    // enum宣告的類體中,所有的構造方法默認是private修飾
}

4.13 內部類

概念:一個類定義在另一個類的類體中,這個里面的類叫內部類,外面的類叫外部類,

分類

  • 1、靜態成員內部類:宣告在外部類的類體中,由static關鍵字修飾,

特點:可以在內部類中宣告靜態的成員,可以不需要創建外部類物件,直接創建內部類物件,可以訪問外部類靜態的成員,不能訪問外部類普通的成員,

  • 2、普通成員內部類:宣告在外部類的類體中,沒有static關鍵字修飾,

特點:只能在內部類類體中宣告普通成員,需要先創建外部類物件,在由外部類物件創建內部類物件,可以訪問外部類所有的成員,

  • 3、區域內部類:宣告在方法體中的內部類,不能脫離宣告內部類的方法使用,

  • 4、匿名內部類:匿名內部類是區域內部類的特殊形式,匿名內部類通常作為類的子類或者介面的實作類,

4.14 注解

注解從jdk1.5開始的時候出現,@注解名,注解可以出現在類的任何一個位置,注解可以實作一些功能,做出一些標注,檢測一些語法,但是注解不能影響程式的運行結果,

系統注解

@SuppressWarnings("unused") // 抑制警告注解

@Deprecated // 標注方法過時注解

@Override // 檢測方法重寫注解

元注解:修飾注解的注解

@Target //標注注解可以修飾那些內容
@Retention // 標注注解的生命周期
@Documented // 標注注解可以隨生成檔案進入API中
@Inherited // 標注注解可以在繼承時被子類繼承到

5_例外處理

概念:程式運行時的錯誤,
例外的流程:在一行代碼運行時出現例外,程式會在例外產生行終止,創建并拋出一個該類例外物件,例外物件在沒有被捕獲的情況下會一直向上拋出,一旦例外物件拋給虛擬機,則虛擬機立即終止當前行程,

例外處理的目的:例外處理的目的是防止例外物件拋給虛擬機,防止因為例外導致程式終止,

5.1 例外

5.1.1 例外的體系結構

在這里插入圖片描述

 * java.lang.Throwable
 * 		|-----java.lang.Error:一般不撰寫針對性的代碼進行處理,
 * 		|-----java.lang.Exception:可以進行例外的處理
 * 			|------編譯時例外(checked)
 * 					|-----IOException
 * 						|-----FileNotFoundException
 * 					|-----ClassNotFoundException
 * 			|------運行時例外(unchecked,RuntimeException)
 * 					|-----NullPointerException
 * 					|-----ArrayIndexOutOfBoundsException
 * 					|-----ClassCastException
 * 					|-----NumberFormatException
 * 					|-----InputMismatchException
 * 					|-----ArithmeticException

5.1.2 從程式的執行角度來看分為運行時例外和編譯時例外

編譯時例外:執行javac.exe命名時,可能出現的例外
運行時例外:執行java.exe命名時,出現的例外

5.1.3 常見的例外型別,請舉例說明:

//******************以下是運行時例外***************************
	//ArithmeticException
	@Test
	public void test6(){
		int a = 10;
		int b = 0;
		System.out.println(a / b);
	}
	
	//InputMismatchException
	@Test
	public void test5(){
		Scanner scanner = new Scanner(System.in);
		int score = scanner.nextInt();
		System.out.println(score);
		
		scanner.close();
	}
	
	//NumberFormatException
	@Test
	public void test4(){
		
		String str = "123";
		str = "abc";
		int num = Integer.parseInt(str);
		
		
		
	}
	
	//ClassCastException
	@Test
	public void test3(){
		Object obj = new Date();
		String str = (String)obj;
	}
	
	//IndexOutOfBoundsException
	@Test
	public void test2(){
		//ArrayIndexOutOfBoundsException
//		int[] arr = new int[10];
//		System.out.println(arr[10]);
		//StringIndexOutOfBoundsException
		String str = "abc";
		System.out.println(str.charAt(3));
	}
	
	//NullPointerException
	@Test
	public void test1(){
		
//		int[] arr = null;
//		System.out.println(arr[3]);
		
		String str = "abc";
		str = null;
		System.out.println(str.charAt(0));
		
	}

	//******************以下是編譯時例外***************************
	@Test
	public void test7(){
//		File file = new File("hello.txt");
//		FileInputStream fis = new FileInputStream(file);
//		
//		int data = fis.read();
//		while(data != -1){
//			System.out.print((char)data);
//			data = fis.read();
//		}
//		
//		fis.close();
		
	}

5.2 例外的處理

java例外處理的抓拋模型:

程序一
“拋”:程式在正常執行的程序中,一旦出現例外,就會在例外代碼處生成一個對應例外類的物件,
并將此物件拋出,
一旦拋出物件以后,其后的代碼就不再執行,
關于例外物件的產生:
① 系統自動生成的例外物件
② 手動的生成一個例外物件,并拋出(throw)
程序二:
“抓”:可以理解為例外的處理方式:① try-catch-finally ② throws

5.2.1 例外處理方式一:try-catch-finally

try{
    // try塊監控可能出現例外的代碼
}catch(Exception ex){
    // catch塊捕獲例外物件,進行例外處理
}fianlly{
    // 無論出現不出現例外,finally塊一定執行,用于釋放自愿
}

5.2.2 例外處理方式二:throws,throw

public void methodOne()throws Exception{// throws關鍵字用于宣告方法不處理的例外,將該類例外拋給呼叫點處理
    throw new Excetpion();// throw關鍵字用于拋出手動創建的例外物件
}

throw 和 throws區別:
throw 表示拋出一個例外類的物件,生成例外物件的程序,宣告在方法體內,
throws 屬于例外處理的一種方式,宣告在方法的宣告處,

例外的分類
Exception是所有例外類的總父類,只要是例外類必須是Exception的子類

除RuntimeException及其子類以外的所有例外類:這類例外被稱作已檢查例外,這類例外強制處理,

RuntimeException及其子類:這類例外被稱作未檢查例外,這類例外不強制處理,但是一旦爆發例外還是走例外流程,

5.2.3 自定義例外:

自定義已檢查例外則繼承Exception,自定義未檢查例外則繼承RuntimeException,

自定義例外重寫getMessage()方法,或者構造方法傳參呼叫super()將例外資訊傳遞給父類的構造方法,

示例代碼:

public class MyException extends Exception{
	
	static final long serialVersionUID = -7034897193246939L;
	
	public MyException(){
		
	}
	
	public MyException(String msg){
		super(msg);
	}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266360.html

標籤:java

上一篇:一、Java基礎

下一篇:Mybatis學習筆記 【1】

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more