日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

JavaSE总结笔记

發(fā)布時(shí)間:2025/3/13 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaSE总结笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JavaSE筆記

??快捷鍵集合

1.psvm

public static void main(String[] args) {}

2.sout

System.out.println();

3.Shift+Ehter 換行

4.Shift+F6 重命名

5.Alt+Shift+Enter 數(shù)據(jù)類型轉(zhuǎn)換

6.IDEA菜單欄Code→Generate→全選 生成構(gòu)造器

??經(jīng)典算法思想

1.冒泡排序

確定迭代次數(shù)是array.length - 1,確定每次迭代將最大值放在最后邊

確定每次比較的次數(shù)array.length - 1 - 此次迭代次數(shù)

優(yōu)化:

如果本身有序,可以設(shè)置flag,每次迭代但凡沒(méi)有發(fā)生交換則都有序

如果某次迭代內(nèi)后方全部有序,可減少區(qū)間長(zhǎng)度

2021年11月11日

1.環(huán)境安裝

1>IntelliJ IDEA 2020.1.3

2>JDK——jdk-8u131-windows-x64

3>Git

2.基礎(chǔ)知識(shí)

1>計(jì)算機(jī)

  • hardware:CPU(只和內(nèi)存聯(lián)系)、內(nèi)存、I/O

  • software:操作系統(tǒng)

2>IDEA

源碼文件HelloWorld.java,經(jīng)過(guò)編譯(compile),生成類文件/字節(jié)碼(byte code)文件HelloWorld.class,這種類文件可以在虛擬機(jī)上執(zhí)行。class并不直接與機(jī)器的操作系統(tǒng)相對(duì)應(yīng),而是經(jīng)過(guò)虛擬機(jī)間接與操作系統(tǒng)交互,由虛擬機(jī)將程序解釋給本地系統(tǒng)執(zhí)行,所以JVM是整個(gè)Java實(shí)現(xiàn)跨平臺(tái)的最核心的部分。JDK中包含了JRE,JRE又包含JVM。

  • javac:java源文件、類文件(字節(jié)碼文件)編譯器(compiler)
  • JVM(java virtual machine):java虛擬機(jī),運(yùn)行字節(jié)碼的一個(gè)程序
  • JDK(java development kit):java開發(fā)工具包,包含JRE、java工具(javac/java/jdb等) 、基礎(chǔ)類庫(kù)(Java API)
  • JRE(java runtime environment):java運(yùn)行時(shí)環(huán)境
  • Intellij IDEA:一款I(lǐng)DE的產(chǎn)品

3.使用IDEA創(chuàng)建項(xiàng)目的過(guò)程分解

1> 新建工程
經(jīng)由IDEA(程序)指定位置新建目錄、新建配置文件

2> src新建一個(gè)HelloWorld 類
IDEA 指定位置(src目錄)HelloWorld.java,文件中填充了一部分默認(rèn)內(nèi)容

3> IDEA 把代碼寫入 HelloWorld.java文件中

4> 點(diǎn)擊run

  • 編譯 IDEA根據(jù)JDK所在目錄,找到j(luò)avac進(jìn)行編譯,HelloWorld.class
  • 運(yùn)行 IDEA根據(jù)JRE所在目錄,找到j(luò)ava運(yùn)行類文件

4.類 class

  • 類名==java文件名,可以使用Shift+F6 / rename改名稱

  • 命名要求:

    • 不能以數(shù)字開頭
    • 不能含有特殊符號(hào)(字母、數(shù)字以外的符號(hào),下劃線是允許的)
    • 不太建議使用中文類型

    類名通常為HelloWorld,方法名、變量名通常為helloWorld,包名為hello_world

  • 一個(gè)java源文件中只能有一個(gè)public類

  • 類中包含方法,方法內(nèi)包含語(yǔ)句

5.數(shù)據(jù) data

全部是內(nèi)存上的數(shù)據(jù)

1>數(shù)據(jù)類型

  • 基本數(shù)據(jù)類型**(8類)**

    • 數(shù)值類型**(7類)**

      • 整型 byte short int long
      • 字符型 char,可以認(rèn)為是一種有特殊地位的整型
      • 浮點(diǎn)型 float double
    • 布爾類型**(1類)**

      ? boolean,值為 true / false

  • 引用數(shù)據(jù)類型**(3類)**

    • class類型 String s;
    • interface類型 Flyable f;
    • array類型 int[] t;

字節(jié)數(shù):一字節(jié)=1byte=8位=8bit

數(shù)據(jù)類型byteshortintlongcharfloatdoubleboolean
字節(jié)數(shù)(byte)12482481 bit

不分有符號(hào)與無(wú)符號(hào)類型,最高位1代表負(fù)數(shù),0代表正數(shù)。

使用Integer.MIN_VALUE可以獲得int類型可以表示的最小十進(jìn)制數(shù):

int min = Integer.MIN_VALUE;

2>變量(本節(jié)重點(diǎn))

👉跳轉(zhuǎn)2021年11月25日

  • 變量==內(nèi)存,變量屬于內(nèi)存上的一塊區(qū)域

  • 定義

    • 變量類型 變量名稱
    • 變量類型 變量名稱 = 值

    變量名稱表示在內(nèi)存的哪部分,變量數(shù)據(jù)類型決定變量?jī)?nèi)存的區(qū)域大小

  • 種類

    根據(jù)在代碼中定義的位置,有不同的種類,決定了變量的不同:

    作用域(scope)——代碼視角

    生命周期(life)——內(nèi)存視角

    • 全局變量

    • 局部變量(local variable)

      變量的作用域(scope)在{ }內(nèi),但對(duì)于{ }外定義的變量在{ }內(nèi)進(jìn)行的賦值是有效的;

      局部變量語(yǔ)境下,如果一個(gè)變量只定義,沒(méi)有賦值,無(wú)法直接使用(取其值)。

  • 使用

    • 賦值(出現(xiàn)在=的左邊)
    • 取值(出現(xiàn)在=的右邊)

3>基本數(shù)據(jù)類型的一定規(guī)則(類型轉(zhuǎn)換和類型提升)

6.字面量 literal

int a = 9;內(nèi)的9就是字面量

字面量屬于數(shù)據(jù),默認(rèn)類型是int。

字面量字面量的類型
9int
9L / 9llong
9.f / 9Ffloat
9.double
true / falseboolean(不允許boolean a =1)
‘a(chǎn)’char
‘xx’String

整型字面量有不同的進(jìn)制表示:二進(jìn)制0b10,八進(jìn)制0o10,十六進(jìn)制0x10;或用科學(xué)計(jì)數(shù)法表示1.3e8,即1.3x10^8。

2021年11月14日

1.賦值操作 =

【等號(hào)左邊:以變量為代表的內(nèi)存空間】a = 3【等號(hào)右邊:值,可以是字面量、變量、表達(dá)式】

通過(guò)變量去保存一個(gè)字面量

2.類型轉(zhuǎn)換(type cast)

1>等號(hào)兩邊類型一致

2>類型不一致——類型轉(zhuǎn)換

①類型提升 以參與運(yùn)算的最高類型為主

②數(shù)值類型轉(zhuǎn)換

  • int a=(int)10L

  • 轉(zhuǎn)換規(guī)則

    char

    double > float > long > int > short > byte

    • 小賦值大 默認(rèn)成立
    • 大賦值小 默認(rèn)不成立
    • 數(shù)值類型和Boolean類型、引用類型無(wú)法轉(zhuǎn)換
  • 快捷鍵 Alt+Shift+Enter

字面量變量默認(rèn)為int,但仍可以賦值

byte b = 1; short s = 2;

這是java基于字面量變量的特殊規(guī)則,byte為-128~127,所以可以賦值[-128,127]的任何數(shù)

int c = 1/3; //int類型除以int類型,此處得0

比如 1/3=0.333333,默認(rèn)向下取整為0

final可以修飾數(shù)據(jù)類型,只能被賦值一次

大小寫轉(zhuǎn)換 'y'+'A'-'a' = 'Y'

3.字符串 String

  • 不是基本類型,是引用類型
  • s+1表示的是字符串拼接操作
  • 與基本類型不能相互轉(zhuǎn)換
int a = Integer.parseInt("1"); long l = Long.parseLong("1"); boolean b = Boolean.parseBoolean("true"); String str = String.valueOf(1.0f);int aa = Integer.parseInt("11",2);//radix代表”11“的進(jìn)制 System.out.println("二進(jìn)制轉(zhuǎn)換:"+aa);

4.運(yùn)算符

運(yùn)行錯(cuò)誤

  • 編譯錯(cuò)誤 不符合語(yǔ)法規(guī)則,IDEA會(huì)提示
  • 運(yùn)行時(shí)錯(cuò)誤 程序運(yùn)行期間會(huì)拋出異常,但符合語(yǔ)法規(guī)則
  • a++

    int a = 1; System.out.println(a++); //輸出結(jié)果為1,先賦值再加1
  • 邏輯運(yùn)算符

    • 運(yùn)算都是Boolean類型
    • 遵循短路求值,比如或運(yùn)算中,只要有一個(gè)算出來(lái)為false,就不進(jìn)行后來(lái)的運(yùn)算
  • 位運(yùn)算

    • &
    • |
  • 移位操作

    • 0b101 >> 1 0b10 可以視為a/2

5.邏輯控制語(yǔ)句

  • 順序結(jié)構(gòu)

  • 分支結(jié)構(gòu)

    • if-elseif-else語(yǔ)句 無(wú)if(a)的條件
    • swtich-case-break-default語(yǔ)句
  • 循環(huán)結(jié)構(gòu)

    break 跳出循環(huán)

    continue 跳過(guò)這次循環(huán),開始下次循環(huán)

    • while語(yǔ)句
      • 右鍵點(diǎn)擊斷點(diǎn),設(shè)置條件,然后點(diǎn)擊運(yùn)行至下一斷點(diǎn)處,可以跳過(guò)一部分循環(huán)
    • for語(yǔ)句
    • do-while語(yǔ)句

作業(yè)

  • Java標(biāo)識(shí)符由字母、數(shù)字、下劃線“_”、美元符號(hào)“$”或者人民幣符號(hào)“¥”組成。

首字母不能是數(shù)字,不能是關(guān)鍵字,且對(duì)大小寫敏感。

  • 閏年

閏年分為普通閏年和世紀(jì)閏年。
普通閏年:能被4整除但不能被100整除的年份為普通閏年。
世紀(jì)閏年:能被400整除的為世紀(jì)閏年。

2021年11月16日

1.輸出

System.out.println(); //方法調(diào)用system,只能有一個(gè)參數(shù) System.out.print(); //輸出不換行 System.out.printf(); //format格式化輸出,可以有多個(gè)參數(shù),且參數(shù)類型不確定。//不換行,使用與C語(yǔ)言相同//但可以使用%n替換\n,\r是回車

2.輸入

  • 使用scanner掃描器
import java.util.Scanner;Scanner scanner = new Scanner(System.in); String line = scanner.nextLine();//單個(gè)輸入//一直等待輸入,按Ctrl+D或Ctrl+Z結(jié)束 while(scanner.hasNextLine()){String line = scanner.nextLine();System.out.println(line); } hasNext……next……
hasNextLine行為單位
hasNext以空格\t分割的單詞為單位
hasNextInt以空格\t分割的單詞為單位,但轉(zhuǎn)為整型
hasNextLong
hasNextDouble
  • hasNext()為true時(shí),nextInt()才可以取值

3.隨機(jī)數(shù)

  • Java中的隨機(jī)數(shù)都是偽隨機(jī)數(shù),Random random = new Random(2021);中2021為seed,此時(shí)固定時(shí)生成的隨機(jī)數(shù)不變。
import java.util.Random;Random random = new Random(); int r = random.nextInt(100);//100表示邊界,左閉右開
  • Random和Scanner都是引用類型。

4.方法 method

1>定義

  • 要在類里定義,不能在其他方法里定義

  • public static 返回值類型 方法名稱(形參列表){ 語(yǔ)句 return語(yǔ)句}

    此處的參數(shù)列表是形參,形參其實(shí)是一種特殊的局部變量

  • 無(wú)返回值可以將返回值類型設(shè)為void,return后的語(yǔ)句不能執(zhí)行也不允許寫

    throw new RuntimeException("此處可以寫提示");

    與return類似,此語(yǔ)句之后也不允許執(zhí)行或?qū)懻Z(yǔ)句

  • 方法沒(méi)有調(diào)用,里面的語(yǔ)句永遠(yuǎn)不會(huì)被執(zhí)行,main方法除外

  • 同一個(gè)類下,暫時(shí)不允許同名方法

2>調(diào)用

  • 方法的調(diào)用實(shí)質(zhì)是,能出現(xiàn)值的位置,即可進(jìn)行方法的調(diào)用,并且方法可以嵌套調(diào)用

  • 變量類型 變量名稱 = 方法名稱(實(shí)參)

  • 隱含的賦值操作

    • 實(shí)參賦值給形參
    • 方法調(diào)用的結(jié)果賦值給返回值
    • 返回值賦值給調(diào)用方法的變量
  • 在同類調(diào)用時(shí)可以直接寫方法名稱,在其他類調(diào)用寫類.方法名稱

2021年11月18日

1.包 package

  • 用來(lái)放類的組織單位,包(文件夾)中含有很多的類(文件)
  • 通過(guò)package聲明決定該類屬于哪個(gè)包,類的實(shí)際全名稱為 包名.類名
  • 使用某個(gè)包下的類方法
    • import 包名.類名;
    • import 包名.*;
    • 包名.類名.方法

2.git的使用

歷史博客《如何將IDEA文件提交至Gitee倉(cāng)庫(kù)》

3.方法的調(diào)用棧 call stack

  • 先進(jìn)后出

  • 主要用于表現(xiàn)此刻方法的調(diào)用關(guān)系

  • 棧幀(stack frame):每層元素

    java中的棧(調(diào)用棧)、棧幀(frame)都是JVM管理的內(nèi)存的某個(gè)名稱

    • 內(nèi)存管理

      內(nèi)存(硬件)→OS→JVM→棧區(qū)(由棧幀組成:每個(gè)棧幀對(duì)應(yīng)一次方法調(diào)用)

    • 局部變量(包含形參)

      • 在該變量對(duì)應(yīng)的方法的某次棧幀上(方法的每次被調(diào)用,都有一個(gè)唯一的棧幀,方法執(zhí)行結(jié)束,棧幀結(jié)束)

      • 局部變量的生命周期

        開始于方法開始執(zhí)行:JVM 為本次方法允許分配好了棧幀
        結(jié)束于方法執(zhí)行結(jié)束:JVM 將方法執(zhí)行中用到的棧幀回收

      • 無(wú)論是基本數(shù)據(jù)類型還是引用類型,形參的改變不會(huì)影響實(shí)參(java中全部是傳值調(diào)用)

2021年11月21日

1.方法重載 overload

C語(yǔ)言中一個(gè)編譯單元(一個(gè)C文件)內(nèi)不能出現(xiàn)同名的函數(shù)

Java中允許一個(gè)編譯單元(一個(gè)Java類)中可以出現(xiàn)相同的函數(shù)(方法),但要求參數(shù)列表不同

  • 方法的簽名:Java編譯單元中唯一確定方法的標(biāo)識(shí)

    • 簽名 = 方法名 + 參數(shù)列表

      只要求形參的類型不同,不要求形參的名稱不同

      簽名不包括返回值類型,所以返回值類型相不相同沒(méi)有關(guān)系

2.靜態(tài)屬性

靜態(tài)屬性、類變量、靜態(tài)變量是除了局部變量之外的另一種變量種類

  • 定義位置:類里但在方法外
    • public static 數(shù)據(jù)類型 變量名 = 字面量變量;
    • static{…}
  • 按順序執(zhí)行
  • 作用域:在整個(gè)類的內(nèi)部是有效的(大括號(hào)內(nèi))
  • 生命周期:伴隨著類在運(yùn)行中的生命周期而運(yùn)行的
  • 初始化問(wèn)題:伴隨著類的生命周期,所以它在類加載的過(guò)程中就初始化完成,會(huì)在Main方法使用之前
  • 默認(rèn)值是0的變形:0、false、null
  • 通過(guò)類名.變量名使用別的類下的靜態(tài)屬性變量

3.類的加載過(guò)程

將屬于一個(gè)類的數(shù)據(jù)(以類文件為代表)從硬盤上加載到內(nèi)存中

  • 某個(gè)類被用到的時(shí)候才加載

    類被用到(類名.*):

    類內(nèi)方法被用到的時(shí)

    用到類的main方法時(shí)

    用到類的靜態(tài)屬性時(shí)

  • 加載的時(shí)候被加載的數(shù)據(jù)

    • 靜態(tài)屬性
    • 方法→語(yǔ)句→字節(jié)碼指令
  • 被加載到方法區(qū)

    JVM中存在棧區(qū)和方法區(qū)

4.訪問(wèn)權(quán)限(訪問(wèn)限定符)

  • public:所有人都可以使用

  • protected:同一個(gè)包下的子類可以使用,子包下的子類中也可以使用,不同包下的子類中也可以使用,比包訪問(wèn)權(quán)限要大

  • 不寫,即default level(也稱為包訪問(wèn)權(quán)限):同一個(gè)包的子類可以使用,否則就算是在子包下的子類中也不可以使用

  • private:只有自己類的內(nèi)部可以使用

  • 可以出現(xiàn)的位置:

    • 類的內(nèi)部、用來(lái)修飾 類變量、方法
    • 類 不可以用private

5.數(shù)組 Array

1>數(shù)組

  • 一組具有相同類型的元素的集合

  • 定義 int[] a

  • 使用:只能用于初始化

    int[] a = {1,2,3,4,5}; //定義一個(gè)變量a,其類型是數(shù)組 //該數(shù)組的元素類型是int //并且進(jìn)行了初始化操作 //該數(shù)組的大小已經(jīng)確定為5 //該數(shù)組的元素分別為1、2、3、4、5Random[] b={new Random(...),new Random(...)};//這種使用是錯(cuò)誤的 int[] a; a[] = {1,2,3,4,5}; //可以使用以下語(yǔ)句 int[] a = new int[] {1,2,3,4,5};//只規(guī)定長(zhǎng)度,則默認(rèn)為0的變形 int[] a = new int[3]; //等價(jià)于 int[] a = new int[] {0,0,0};
  • 數(shù)組的長(zhǎng)度一旦確定后就不可以更改了

    //這是新創(chuàng)建了一個(gè)數(shù)組,用之前的數(shù)組a來(lái)使用 int[] a = new int[3]; a = new int[5];
  • 數(shù)組的下標(biāo) index

    • 類型:int
    • 范圍:[0,數(shù)組的長(zhǎng)度)
  • 遍歷數(shù)組:從前到后訪問(wèn)數(shù)組中的每個(gè)元素

    • 需要知道數(shù)組的元素個(gè)數(shù):a.length
    //遍歷方法 int[] a = {100,200,300}; System.out.println("方法一"); for (int i = 0; i < a.length ; i++) {System.out.println(a[i]); } System.out.println("方法二"); for(int e : a){System.out.println(e); }

2>引用和對(duì)象

  • int[] a = {100,200,300};
    • a 引用 ?

    • {100,200,300} 對(duì)象 ?

      每個(gè)對(duì)象都有自己的hash值(對(duì)象的指紋),對(duì)象不同,一般指紋不同

int[] a = b; //讓b指向a現(xiàn)在指向的對(duì)象,只是一種引用,類似于共享
  • 引用類型——形參的改變不會(huì)影響實(shí)參,但是
//5.使用交換數(shù)組方法但并沒(méi)有進(jìn)行交換 // 無(wú)論是基本類型引用還是引用類型,形參的改變不會(huì)影響實(shí)參(java中全部是傳值調(diào)用) // int[] a = { 1, 2, 3 }; // int[] b = {100, 200, 300 }; // swap(a, b); // for (int i = 0; i < a.length ; i++) { // System.out.println(a[i]); // } // for (int i = 0; i < b.length ; i++) { // System.out.println(b[i]); // }//6.改變實(shí)參,因?yàn)榇颂幐淖兊氖菍?duì)象的值,而不是引用double[] arr = {1.0, 2.0, 3.0};swap(arr, 0, 2);System.out.println("double數(shù)組交換");for (int i = 0; i < arr.length ; i++) {System.out.println(arr[i]);}}//5用到的swap方法,交換兩個(gè)數(shù)組,但需要注意并不返回,因?yàn)閖ava中全部是傳值調(diào)用 // private static void swap(int[] a, int[] b) { // int[] tmp = a; // a = b; // b = tmp; // }//方法重載,交換數(shù)組內(nèi)類型為doubleprivate static void swap(double[] array, int i, int j) {double t = array[i];array[i] = array[j];array[j] = t;}

3>使用中常見(jiàn)的兩個(gè)異常

  • java.lang.ArrayIndexOutOfBoundsException

    使用的下標(biāo)不是合法下標(biāo)時(shí)

  • java.lang.NullPointerException

    對(duì)一個(gè)值是null的引用做解引用操作時(shí)

    int[] a = null; 讓a引用不關(guān)聯(lián)(指向)任何對(duì)象

    解引用:通過(guò)引用要去動(dòng)對(duì)象中的數(shù)據(jù),比如a.length、a[0]

4>數(shù)組的操作函數(shù)

函數(shù)作用
sort(array)對(duì)整個(gè)數(shù)組排序
sort(array, int fromIndex, int toIndex)對(duì)數(shù)組的[fromIndex,int toIndex)范圍內(nèi)進(jìn)行排序
binarySearch(array,key)使用二分查找算法搜索指定數(shù)組的key
equals(array1,array2)判斷兩個(gè)數(shù)組是否相等
fill(array,element)使用element填充數(shù)組
fill(array, int fromIndex, int toIndex,element)使用element填充數(shù)組的[fromIndex,int toIndex)范圍
copyOf(array, int newLength)復(fù)制數(shù)組到一個(gè)長(zhǎng)度為newLength的數(shù)組中
copyOfRange(array, int fromIndex, int toIndex)將指定數(shù)組的指定范圍復(fù)制到新數(shù)組中,fromIndex不可以越界,toIndex可以越界,沒(méi)有的用0補(bǔ)全
toString(array)返回指定數(shù)組的內(nèi)容的字符串表示形式

2021年11月23日

1.多維數(shù)組

  • 定義

    long[][] a; 數(shù)組的類型是引用類型long[]

    //long[] b; 數(shù)組的類型是long

long[][] a = new long[10][]; //左:創(chuàng)建一個(gè)數(shù)組a,數(shù)組的元素類型為long[] //右:新創(chuàng)建了一個(gè)元素類型為long[]、長(zhǎng)度為10的對(duì)象,它是一個(gè)數(shù)組 //a是引用,右邊的新建數(shù)組為對(duì)象

2.面向?qū)ο?OOP

  • 定義

    對(duì)象:把一些相關(guān)屬性一一綁定

  • 三個(gè)層次

    • 概念層 學(xué)生
    • 邏輯層 檔案,包括學(xué)生姓名學(xué)號(hào)專業(yè)
    • 物理層 在內(nèi)存中是怎么回事

3.類的第二大作用

  • 類是構(gòu)造對(duì)象的模板

1>屬性

  • 定義

    //類的定義 class Person{//屬性的定義String name;int age; } //實(shí)例化對(duì)象的語(yǔ)法 Person p = new Person(要調(diào)用的構(gòu)造方法的參數(shù)列表); //通過(guò)引用使用引用指向?qū)ο蟮膶傩?/span> p.name = ...; ... = p.name;
  • 作用域:類內(nèi)

  • 屬性的初始化規(guī)則(4種)

    執(zhí)行順序?yàn)?#xff1a;默認(rèn)值規(guī)則 → 定義時(shí)初始化規(guī)則和構(gòu)造代碼塊規(guī)則按書寫順序 → 構(gòu)造方法規(guī)則

    • 默認(rèn)值規(guī)則:不初始化則默認(rèn)為0的變形

    • 定義時(shí)初始化規(guī)則

      class Person{String name = 'aaa';int age = 18; }
    • 構(gòu)造代碼塊規(guī)則

      {//類內(nèi),方法外//... }
    • 構(gòu)造方法規(guī)則(構(gòu)造器)

      類似于方法,但是:

      ? 沒(méi)有返回值類型的聲明

      ? 構(gòu)造方法的名稱==類名

      ? 構(gòu)造器重載

      class Student{//無(wú)其他構(gòu)造方法會(huì)默認(rèn)補(bǔ)此部分,內(nèi)部為空public Student(){//...}//相當(dāng)于方法重載public Student(String a){//...} }

2>this

  • 作用

    • 引用,類型就是當(dāng)前類

      指向當(dāng)前對(duì)象:構(gòu)造器種this指向的就是當(dāng)前正在構(gòu)造的對(duì)象

    • 在一個(gè)構(gòu)造方法中調(diào)用另一個(gè)方法

      public Person(){this(17);//調(diào)用有參構(gòu)造器 } public Person(int a){//... }

3>getter & setter

權(quán)限控制:權(quán)限最小原則

只讀不改 getter

2021年11月25日

行為:面向?qū)ο笾械囊粋€(gè)焦點(diǎn),在Java中以實(shí)例方法的形式體現(xiàn)

實(shí)例方法:定義語(yǔ)法和之前一致,除了不要加static;

? 可以直接訪問(wèn)屬性(和構(gòu)造方法類似)

1.方法

1>靜態(tài)方法(類方法) 加static修飾——不可以訪問(wèn)屬性,不可以使用this

2>普通方法(實(shí)例方法) 不加static修飾——可以訪問(wèn)屬性,可以使用this

? 實(shí)例方法的調(diào)用,必須依賴一個(gè)對(duì)象(通過(guò)引用)的存在,如引用.普通方法()

普通方法靜態(tài)方法
方法內(nèi)部有this
可以訪問(wèn)屬性
可以調(diào)用普通方法
沒(méi)有this
不能訪問(wèn)對(duì)象的屬性
不能調(diào)用普通方法
方法外部對(duì)象的引用去調(diào)用
“需要傳入一個(gè)this"
可以直接調(diào)用
“不需要傳入this"

在靜態(tài)上下文(static context)中無(wú)法直接調(diào)用普通方法、訪問(wèn)對(duì)象屬性。

static的理解:

**加了static,只和類有關(guān),和對(duì)象無(wú)關(guān)。**反之,不加static,和本來(lái)的對(duì)象息息相關(guān),不論屬性和方法都是屬于對(duì)象的。

變量

生命周期區(qū)域
局部變量跟著方法運(yùn)行走棧幀>棧
類變量、靜態(tài)變量、靜態(tài)屬性跟著類的加載卸載走類>方法區(qū)
實(shí)例變量、屬性對(duì)象實(shí)例化完成后出現(xiàn),對(duì)象回收后消亡對(duì)象>堆區(qū)

靜態(tài)方法和普通方法都在方法區(qū)

??OOP

三大特性:封裝(所以要設(shè)置訪問(wèn)權(quán)限)

  • 概念層

    現(xiàn)實(shí)生活中,萬(wàn)物皆對(duì)象(比如人物、進(jìn)程等)

  • 邏輯層

    • 存在開發(fā)人員腦海中的世界,不止可以用Java實(shí)現(xiàn)
    • 實(shí)際是對(duì)現(xiàn)實(shí)中一類有形或無(wú)形的概念的特征(特征表現(xiàn)為屬性)抽取(對(duì)其行為的抽取表現(xiàn)為方法),比如人(人都有四肢、五官)、葉子

      • 對(duì)象的正確性判定

      對(duì)象職責(zé)不同,方法不同,比如一個(gè)人求職或者學(xué)習(xí),他 學(xué)習(xí)的方法是不同的

      • 變成代碼的部分
  • 物理層

    對(duì)象在堆區(qū)

    對(duì)象在堆區(qū)是如何存放的

    對(duì)象是如何構(gòu)建出來(lái)的

    Person p = new Person();3 1 2 //大體上有三個(gè)步驟 //1. //通過(guò)類中的信息計(jì)算對(duì)象的內(nèi)存大小(隱含著用到了類) //在內(nèi)存(堆區(qū)域)由JVM分配空間 //全部用0初始化 //半成品對(duì)象構(gòu)建完成 //2執(zhí)行初始化過(guò)程 //對(duì)象實(shí)例化→加載方法→調(diào)用初始化語(yǔ)句 //對(duì)象實(shí)例化完成 //3引用賦值

    對(duì)象的死亡(不嚴(yán)謹(jǐn)):沒(méi)有任何引用指向它,就可以視為死亡

  • 2021年11月28日

    1.深淺拷貝

    • 引用賦值 2

    • 淺拷貝賦值

      • 藕斷絲連似的賦值

      • 對(duì)象內(nèi)的引用指向的對(duì)象相同

    • 深拷貝賦值

    2.線性結(jié)構(gòu) List

    邏輯層:都屬于線性結(jié)構(gòu)

    物理層:分為順序結(jié)構(gòu)和鏈?zhǔn)浇Y(jié)構(gòu),也就是順序表和鏈表

    線性結(jié)構(gòu):

    • 整體結(jié)構(gòu)一般記為容器

    • 裝在容器中的單獨(dú)的數(shù)據(jù),稱為元素、項(xiàng)、數(shù)據(jù)、值

    • 除了第一個(gè)元素和最后一個(gè)元素之外,其他元素都有共性,即有前元素和后元素

      • 第一個(gè)元素沒(méi)有prev,有next,記為first、head
      • 最后一個(gè)元素沒(méi)有next,有prev,記為last、tail
    • 只有在線性結(jié)構(gòu)中,下標(biāo)才有意義,才討論第幾個(gè)元素,下標(biāo)是表示第n個(gè)的代碼表示,所以在線性結(jié)構(gòu)中才有排序的含義

    • 數(shù)組也算一種比較特殊的線性結(jié)構(gòu),在保存元素時(shí),數(shù)組允許出現(xiàn)空洞,線性結(jié)構(gòu)不允許出現(xiàn)

    1>順序表 ArrayList

    順序表對(duì)象(在數(shù)組對(duì)象的基礎(chǔ)上構(gòu)建的),多加了自行控制容量的職責(zé)(表現(xiàn)為方法)

    下標(biāo)與元素個(gè)數(shù)size有關(guān),與容量array.length無(wú)關(guān)

    long[] newarray = Arrays.copyOf(array,newlength);//進(jìn)行擴(kuò)容

    時(shí)間復(fù)雜度:

    • 尾插尾刪 O(1)
    • 根據(jù)下標(biāo)插入刪除時(shí) O(n)
    • get(index)/set(index,e) O(1)
    • 查找 O(n)

    2>鏈表 LinkedList

    ??復(fù)雜度 complexity

    • 一個(gè)評(píng)價(jià)程序(算法)好壞的標(biāo)準(zhǔn)
    • 從兩個(gè)維度進(jìn)行評(píng)定:
      • 運(yùn)行速度——時(shí)間復(fù)雜度
      • 占用空間——空間復(fù)雜度

    1.時(shí)間復(fù)雜度 **O(1)< O(log(n)) < O(n) < O(n)*O(log(n)) < O(n^2)**前可行< O(n^3) < O(2^n)

    直接掐表的缺陷:影響因素太多,無(wú)法控制變量

    前提:給定CPU之后,單位時(shí)間內(nèi)執(zhí)行的指令條數(shù)基本恒定

    所以,衡量算法的運(yùn)行時(shí)間轉(zhuǎn)換為衡量算法的執(zhí)行指令個(gè)數(shù)

    前提:Java中的基本指令(O(1)的語(yǔ)句)可以近似地看作指令的代替

    即使固定算法,隨著算法處理的數(shù)據(jù)規(guī)模的不同,算法需要的語(yǔ)句數(shù)也是不同的。比如冒泡排序改變數(shù)字個(gè)數(shù)。

    所以:我們希望得到的時(shí)間復(fù)雜度是一個(gè)語(yǔ)句個(gè)數(shù)關(guān)于數(shù)據(jù)規(guī)模的函數(shù)關(guān)系 基本語(yǔ)句個(gè)數(shù) = f(數(shù)據(jù)規(guī)模)

    • 只保留函數(shù)關(guān)系中的最高次項(xiàng)
    • 把保留的項(xiàng)的常數(shù)系數(shù)變成1

    步驟:找最壞的情況(去掉優(yōu)化)、確定數(shù)據(jù)規(guī)模n、確定函數(shù)關(guān)系、大O表示法

    時(shí)間戳:從1970-1-1 格靈威治時(shí)間到某個(gè)時(shí)間經(jīng)過(guò)的秒數(shù)

    long b = System.currentTimeMillis(); //以毫秒為單位的時(shí)間戳//current 當(dāng)前的Millis毫秒

    規(guī)模n擴(kuò)大多少倍,消耗的時(shí)間就擴(kuò)大大O內(nèi)的函數(shù)關(guān)系

    假設(shè)在某臺(tái)計(jì)算機(jī)上,冒泡排序50個(gè)數(shù),耗費(fèi)6秒的時(shí)間,冒泡排序500個(gè)數(shù)需要多長(zhǎng)時(shí)間?
    O(n個(gè)2) n的規(guī)模擴(kuò)大了10倍,消耗的時(shí)間10^2 600s

    單路遞歸一般是O(n)

    二路遞歸(漢諾塔和斐波那契)一般是O(2^n)

    數(shù)組的用下標(biāo)訪問(wèn)時(shí)間復(fù)雜度為O(1)

    2.空間復(fù)雜度

    單路遞歸一般是O(1)

    二路遞歸一般是O(n)

    2021年11月30日

    1.鏈表 LinkedList

    結(jié)點(diǎn) node

    • 元素
    • 下一個(gè)結(jié)點(diǎn)的位置(引用)

    通過(guò)頭結(jié)點(diǎn)代表鏈表,即使沒(méi)有頭結(jié)點(diǎn)

    等號(hào)左邊一定是引用,等號(hào)右邊一定是對(duì)象

    作業(yè):寫一份順序表代碼

    2021年12月2日

    1.鏈表的特殊情況

    • empty鏈表(空鏈表)
    • 只有一個(gè)結(jié)點(diǎn)的情況
    • 頭結(jié)點(diǎn)、尾結(jié)點(diǎn)

    2021年12月7日

    1.鏈表操作

    • 翻轉(zhuǎn)、刪除、合并、刪除重復(fù)、分割
    • 復(fù)雜鏈表復(fù)制

    2.鏈表對(duì)象

    雙向無(wú)頭不循環(huán)

    • 屬性、方法、一致性
    • 分情況考慮:
      • 空鏈表、有一個(gè)結(jié)點(diǎn)的鏈表、其他情況的鏈表
      • 頭結(jié)點(diǎn)、尾結(jié)點(diǎn)、中間結(jié)點(diǎn)
    • 重點(diǎn):根據(jù)下標(biāo)輸入、刪除

    3.內(nèi)部類

    • 靜態(tài)內(nèi)部類——用來(lái)控制權(quán)限
    • 普通內(nèi)部類

    ??static

    1.靜態(tài)方法

    2.靜態(tài)導(dǎo)包,省略Arrays

    import static java.util.Arrays.*;

    2021年12月9日

    1.繼承

    概念層的 is - a 關(guān)系

    類A(動(dòng)物)→ 類B(貓🐱)

    類B繼承類A,類B派生于類A,類B擴(kuò)展于類A

    類A:父類(parent class)、基類(base class)、超類

    類B:子類(sub class)、派生類(derived class)

    class B extends A{//B的方法//IDEA提示的加粗的方法是自己的方法,其他的為繼承的方法。 }
    • 繼承關(guān)系

      • 不同類可以繼承一個(gè)類,但不支持一個(gè)類繼承多個(gè)類(多繼承)
      • class A{}隱含著類A繼承自java.lang.Object類
    • 邏輯上,子類對(duì)象中包含一個(gè)"父類對(duì)象",無(wú)論有沒(méi)有權(quán)限訪問(wèn)。即類B有類A的全部方法和屬性,只是一些可以訪問(wèn),一些不可以。

    • 子類對(duì)象實(shí)例化之前,必須在子類的構(gòu)造方法中,調(diào)用父類的構(gòu)造方法

      • 通過(guò)super()調(diào)用
        • 通過(guò)super可以明確訪問(wèn)父類,無(wú)歧義時(shí)通過(guò)this也可以訪問(wèn)父類
        • super看到的是父類允許子類看到的(有訪問(wèn)權(quán)限的)
      • 當(dāng)父類有無(wú)參構(gòu)造方法時(shí),super()可以省略
    • 子類加載前需要先把父類加載好,不管子類的構(gòu)造器在哪里,都要先加載好父類

    • 構(gòu)造代碼塊在實(shí)例化的時(shí)候執(zhí)行的

    • 多態(tài):對(duì)象有多種形態(tài),比如動(dòng)物有貓、狗等多種類型

    • 方法重寫時(shí),即使是父類中的this.也是new的對(duì)象類型的this對(duì)象

    ??能使用哪些方法,看引用類型;使用的是哪個(gè)對(duì)象的方法,看new的對(duì)象類型

    • 向上轉(zhuǎn)型是自然的,向下轉(zhuǎn)型是有風(fēng)險(xiǎn)的,要進(jìn)行風(fēng)險(xiǎn)測(cè)試if(Pet instanceOf Dog)才能轉(zhuǎn)

    2022年01月04日

    1.復(fù)習(xí)

    • 初始化順序(父類在子類前)

      • 類的加載化的初始化順序
      • 對(duì)象實(shí)例化的加載順序
    • 多態(tài)的語(yǔ)法知識(shí)

    2.abstract

    1>抽象類

    • 抽象類被剝奪了實(shí)例化對(duì)象的能力(比如大的概念動(dòng)物類),是用來(lái)繼承的

      可以引用Animal animal;,不能實(shí)例化對(duì)象new Animal();

    • 抽象類與普通類的區(qū)別

      抽象類不能實(shí)例化對(duì)象,允許出現(xiàn)抽象方法

      “有抽象方法的是抽象類”是錯(cuò)誤的

    • Java賦予了抽象類新的能力

      允許定義一些方法,但不實(shí)現(xiàn)(沒(méi)有方法體,只是聲明,留給子類去必須重寫,稱為抽象方法)

    2>抽象方法

    • 抽象類與抽象方法的關(guān)系

      抽象方法只能出現(xiàn)在抽象類中,不能出現(xiàn)在普通類中

      “凡是抽象類中一定要出現(xiàn)抽象方法”是錯(cuò)誤的

    • 例子

      比如線性表(抽象)類定義’頭插’方法(其中包含’按照下標(biāo)插入’),鏈表和順序表中’定義按照下標(biāo)插入’方法

    3.final

    1>最終變量

    • 只能賦值一次

    2>最終類

    • 通過(guò)final修飾的類,無(wú)法被繼承

    抽象類、普通類、最終類都允許出現(xiàn)一種方法——最終方法

    3>最終方法

    • 通過(guò)final修飾的方法,不允許被重寫
    • 允許出現(xiàn)在任何類中,出現(xiàn)在最終類中意義不大(因?yàn)樽罱K類無(wú)法被繼承,其中的方法自然不會(huì)被重寫)

    4.類的三種職責(zé)

    • ①放置靜態(tài)屬性/方法的位置
    • ②實(shí)例化對(duì)象
    • ③被繼承
    類的類型備注
    抽象類
    普通類②③
    最終類

    5.接口 Interface

    可以理解為一種極端的抽象類(全部只有抽象方法的抽象類),所以不可以被實(shí)例化對(duì)象,它描述的是一個(gè)概念

    • 不會(huì)出現(xiàn)屬性(其實(shí)可以出現(xiàn),但是是特定的)

    • 只能出現(xiàn)方法(默認(rèn)是抽象方法,并且被public修飾)

    • 與抽象類的差異

      • 類描述現(xiàn)實(shí)中的一類事物:抽象事物(比如動(dòng)物,線性表)和具體事物(狗、順序表);

        接口大多時(shí)候只是一組能力的聚合,描述具備某種能力的東西(比如會(huì)飛,會(huì)跑),具體是什么事物不知道

      • 類可以被繼承,只允許單繼承,extends

        接口是用來(lái)被實(shí)現(xiàn)的,允許一個(gè)類同時(shí)實(shí)現(xiàn)多個(gè)接口implements,并且接口本身也允許多繼承自其他接口

    6.Cloneable 接口

    具備克隆能力,拷貝的對(duì)象是淺拷貝的

    當(dāng)某個(gè)對(duì)象被Cloneable修飾時(shí),JVM內(nèi)部會(huì)對(duì)其特殊處理,允許

    SomeClass sc = new SomeClass(); SomeClass copy = clone sc; //對(duì)象復(fù)制(拷貝/克隆)過(guò)程

    7.對(duì)象的比較(一)

    • 同一性 同一個(gè)東西
    • 相等性 同類東西,但不是同一個(gè)
    • 相似性 同內(nèi)容東西,比如是版本2

    Java中沒(méi)有原生提供相似性判斷邏輯的邏輯,但是有相等性判斷的約束

    重寫的"equals"是相等性比較(默認(rèn)是同一性比較):在Object中有一個(gè)equals(相等)方法,所有類繼承自O(shè)bject類,所以都有equals方法

    "=="是同一性比較:對(duì)于基本類型來(lái)說(shuō)同一性就是相等性,對(duì)于引用類型來(lái)說(shuō)同一性只是同一性

    2022年01月06日

    1.對(duì)象的比較(二)

    1>comparable 接口

    p1.compareTo(p2); //重寫compareTo方法// this > obj 返回 >0 // this < obj 返回 <0 // this == obj 返回 ==

    2>comparator 接口

    comparator(p1,p2); //重寫compare方法

    2.Java中的字符串

    String常見(jiàn)方法:

    從前往后 indexOf() 4種:目標(biāo)為String或char兩種+給定/不給定form兩種

    從后往前 lastIndexOf() 4種

    2022年01月09日

    1.方法

    String s; //判斷是否以括號(hào)內(nèi)字符串為前綴boolean b = s.startsWith("字符串");boolean b = endsWith("字符串"); //判斷是否包含括號(hào)內(nèi)字符串boolean b = s.contains("字符串"); //全部替換,使用一個(gè)字符(串)去替換另一個(gè)字符(串)s.replace('被替換字符', '替換字符');s.replace("被替換字符串", "替換字符串"); //全部替換s.replaceAll("被替換字符串", "替換字符串") //只替換第一個(gè)s.replaceFirst("被替換字符串", "替換字符串") //截取字符串 左閉右開substring(首下標(biāo),[尾下標(biāo)]) //不輸入尾下標(biāo),默認(rèn)為長(zhǎng)度 //以括號(hào)內(nèi)字符分割字符串為數(shù)組類型String[] parts = s.split("\\."); //數(shù)組通過(guò)連接符連接String v = String.join("delimiter連接符",arr) //修剪字符串兩邊的空白字符(包含空格、制表符(Nt)、回車、換行)s.trim()

    2.字串的不可變特性及其優(yōu)化

    1>不可變特性

    對(duì)象一旦創(chuàng)建之后,無(wú)法被任何方式修改

    成本:每次修改字符串,需要?jiǎng)?chuàng)建對(duì)象

    收益:簡(jiǎn)化開發(fā)難度,不會(huì)讓別人更改你給的東西

    如何做到:

    • 不可被繼承 類被final修飾

    • 屬性被final修飾

    • 防止內(nèi)部的屬性對(duì)象逃逸

      只能保證"指向"不指向其他對(duì)象,但不能保證指向的對(duì)象內(nèi)內(nèi)容不能更改,會(huì)造成屬性逃逸

    2>優(yōu)化

    JVM使用池化(pooled)技術(shù)進(jìn)行優(yōu)化

    邏輯上創(chuàng)建一個(gè)字符串對(duì)象池,這個(gè)對(duì)象池常見(jiàn)的術(shù)語(yǔ)有:哈希池

    入池對(duì)象:

    • 寫在代碼中的字面量字符串默認(rèn)入池

    • new出來(lái)的對(duì)象默認(rèn)不會(huì)入池

    • 通過(guò)s.intern();強(qiáng)制s對(duì)象入池

      如果s指向的對(duì)象已經(jīng)在池里,返回池里的對(duì)象

      如果不在,則將對(duì)象放入池中

    3>結(jié)論

    所以只比較對(duì)象的相等性,不去關(guān)心同一性的問(wèn)題

    3.StringBuilder 構(gòu)造器

    從結(jié)構(gòu)上完全可以把它當(dāng)成一個(gè)關(guān)于字符的順序表。

    append(); toString(); //…… reverse(); replace(); substring();

    StringBuffer是StringBuilder的早期版本,性能極低但是線程安全的(沒(méi)有價(jià)值)。

    4.異常

    針對(duì)代碼中的非正常情況進(jìn)行處理的

    1>異常

    優(yōu)點(diǎn):避免層層上報(bào)直到某個(gè)層級(jí)才可以處理該錯(cuò)誤,發(fā)生異常就跳到能處理異常的地方

    缺點(diǎn):采用異常機(jī)制會(huì)帶來(lái)性能損失

    • 異常情況和正常情況完全分離
      • 異常走throw形式
      • 正常走return形式

    2>關(guān)鍵字

    • try + catch + finally

      可以寫try + catch,try + finally,try + catch + finally。

      誰(shuí)對(duì)異常負(fù)責(zé),誰(shuí)寫try catch。

      執(zhí)行順序:finally一定執(zhí)行

    try{//正常執(zhí)行的語(yǔ)句 }catch(異常的類型1 變量名){ //}catch(RuntimeException exc){//遇到 異常類型的異常,該進(jìn)行的操作 }catch(異常的類型2 變量名){//…… }finally{//必須執(zhí)行的語(yǔ)句 }
    • throw 拋出異常

      throw new 異常類型的對(duì)象(引用)

    • throws 聲明風(fēng)險(xiǎn)

      public void 方法(...) throws 異常1,異常2{//......要使用方法就要承擔(dān)風(fēng)險(xiǎn)異常 }

      這樣就可以使調(diào)用者用catch處理可能會(huì)出現(xiàn)的風(fēng)險(xiǎn),不會(huì)讓它沒(méi)人負(fù)責(zé)

    3>異常對(duì)象的構(gòu)造方法

    ①無(wú)參構(gòu)造方法

    ②允許傳入String Message

    ③通過(guò)一個(gè)異常構(gòu)造另一個(gè)異常

    飯不夠吃異常 e = ...; 物資不夠異常 exc = new 物資不夠異常(e);由于物資不夠異常,所以導(dǎo)致飯不夠吃異常

    4>Java程序中輸出內(nèi)容的通道

    • 標(biāo)準(zhǔn)輸出:一般用來(lái)輸出非錯(cuò)誤信息

    • 標(biāo)準(zhǔn)錯(cuò)誤:一般用來(lái)輸出錯(cuò)誤信息

    目的地默認(rèn)情況的情況都是控制臺(tái),只是走兩條路,異常一般走的是緊急通道。都走正常通道先出發(fā)的一定先到達(dá),但走兩條路不一定誰(shuí)先到達(dá)。

    5>異常負(fù)責(zé)

    由下向上,如果沒(méi)人負(fù)責(zé),由JVM負(fù)責(zé),終止程序

    6>編碼規(guī)范

    不要吞異常(即catch異常啥也不干),可以把原有的異常作為原因?qū)懺赾atch里

    public void method3() throws IOException{//拋受查異常的時(shí)候必須要用throws聲明throw new IOException(); } //問(wèn)題:使用method3方法會(huì)有IOException異常 //解決方法一 聲明 //public void method4() throws IOException{ //解決方法二 catch //實(shí)際中用非受查異常RuntimeException將受查異IOException常包起來(lái) public void method4(){try{method3();}catch(IOException exc){ //解決傳染性問(wèn)題throw new RuntimeException(exc); //會(huì)輸出exc信息,看到原因} }

    7>異常分類

    • 錯(cuò)誤

      • 繼承自Error類的就是錯(cuò)誤,也可以算作一種非受查異常
      • 因?yàn)樵O(shè)備等其他硬性環(huán)境導(dǎo)致的,程序無(wú)法修復(fù)的問(wèn)題,比如CPU燒了
    • 受查異常(檢查異常)

      • 繼承自Exception類,但不屬于RuntimeException子類的

      • 程序代碼BUG,比如空指針異常,數(shù)組下標(biāo)越界異常

      • 使得代碼具備傳染性

        使用方法就要么用catch處理要么也聲明異常列表,可以使用非受查異常把受查異常包起來(lái),哪個(gè)類關(guān)心這個(gè)異常的時(shí)候哪個(gè)類處理它

    • 非受查異常

      • 繼承自RuntimeException類的
      • 經(jīng)過(guò)重試、程序自動(dòng)修復(fù)解決的問(wèn)題,比如內(nèi)存不夠用,網(wǎng)絡(luò)不穩(wěn)定

    我們應(yīng)該catch受查異常,不catch非受查異常,錯(cuò)誤catch了也解決不了。由于實(shí)際的復(fù)雜性,這種規(guī)則一般不太遵守。

    Java對(duì)于受查異常,強(qiáng)制要求:

    • 一個(gè)方法如果拋出了受查異常,則必須通過(guò)throws聲明
    • 一個(gè)方法如果拋出了非受查異常,可以聲明也可以不聲明

    8>自定義異常 一般繼承自RuntimeException

    2022年01月16日

    throws 異常1,異常2{
    //…要使用方法就要承擔(dān)風(fēng)險(xiǎn)異常
    }

    這樣就可以使調(diào)用者用catch處理可能會(huì)出現(xiàn)的風(fēng)險(xiǎn),不會(huì)讓它沒(méi)人負(fù)責(zé)**3>異常對(duì)象的構(gòu)造方法**①無(wú)參構(gòu)造方法②允許傳入String Message③通過(guò)一個(gè)異常構(gòu)造另一個(gè)異常```java 飯不夠吃異常 e = ...; 物資不夠異常 exc = new 物資不夠異常(e);由于物資不夠異常,所以導(dǎo)致飯不夠吃異常

    4>Java程序中輸出內(nèi)容的通道

    • 標(biāo)準(zhǔn)輸出:一般用來(lái)輸出非錯(cuò)誤信息

    • 標(biāo)準(zhǔn)錯(cuò)誤:一般用來(lái)輸出錯(cuò)誤信息

    目的地默認(rèn)情況的情況都是控制臺(tái),只是走兩條路,異常一般走的是緊急通道。都走正常通道先出發(fā)的一定先到達(dá),但走兩條路不一定誰(shuí)先到達(dá)。

    5>異常負(fù)責(zé)

    由下向上,如果沒(méi)人負(fù)責(zé),由JVM負(fù)責(zé),終止程序

    6>編碼規(guī)范

    不要吞異常(即catch異常啥也不干),可以把原有的異常作為原因?qū)懺赾atch里

    public void method3() throws IOException{//拋受查異常的時(shí)候必須要用throws聲明throw new IOException(); } //問(wèn)題:使用method3方法會(huì)有IOException異常 //解決方法一 聲明 //public void method4() throws IOException{ //解決方法二 catch //實(shí)際中用非受查異常RuntimeException將受查異IOException常包起來(lái) public void method4(){try{method3();}catch(IOException exc){ //解決傳染性問(wèn)題throw new RuntimeException(exc); //會(huì)輸出exc信息,看到原因} }

    7>異常分類

    • 錯(cuò)誤

      • 繼承自Error類的就是錯(cuò)誤,也可以算作一種非受查異常
      • 因?yàn)樵O(shè)備等其他硬性環(huán)境導(dǎo)致的,程序無(wú)法修復(fù)的問(wèn)題,比如CPU燒了
    • 受查異常(檢查異常)

      • 繼承自Exception類,但不屬于RuntimeException子類的

      • 程序代碼BUG,比如空指針異常,數(shù)組下標(biāo)越界異常

      • 使得代碼具備傳染性

        使用方法就要么用catch處理要么也聲明異常列表,可以使用非受查異常把受查異常包起來(lái),哪個(gè)類關(guān)心這個(gè)異常的時(shí)候哪個(gè)類處理它

    • 非受查異常

      • 繼承自RuntimeException類的
      • 經(jīng)過(guò)重試、程序自動(dòng)修復(fù)解決的問(wèn)題,比如內(nèi)存不夠用,網(wǎng)絡(luò)不穩(wěn)定

    我們應(yīng)該catch受查異常,不catch非受查異常,錯(cuò)誤catch了也解決不了。由于實(shí)際的復(fù)雜性,這種規(guī)則一般不太遵守。

    Java對(duì)于受查異常,強(qiáng)制要求:

    • 一個(gè)方法如果拋出了受查異常,則必須通過(guò)throws聲明
    • 一個(gè)方法如果拋出了非受查異常,可以聲明也可以不聲明

    8>自定義異常 一般繼承自RuntimeException

    總結(jié)

    以上是生活随笔為你收集整理的JavaSE总结笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。