java問題積累

VickW發表於2020-11-04

Java基礎知識點

基本資料型別值傳遞傳遞的是值,形參改變,實參不變

引用資料型別值傳遞傳遞的是地址值,形參改變,實參也變

特殊:String 在值傳遞時,形參改變,實參不會改變(字串是常量,不允許改變)

== 比較

基本資料型別:比較的是基本資料型別的值是否相同

引用資料型別:比較的是引用資料型別的地址值是否相同

棧裡面存的變數或者引用資料名屬於實參,給方法裡面傳的是形參(在方法小括號裡面)

形參:用於接收實際資料的變數

實參:實際參與運算的變數

計算機儲存裝置的最小資訊單元叫“位(bit)”,我們又稱之為“位元位”,通常用小寫的字母b表示。而計算機最小的儲存單元叫“位元組(byte)”,通常用大寫字母B表示,位元組是由連續的8個位組成。

字串是一個常量,一經賦值,不允許改變,字串直接賦值(String s=“abc”)存放在字串常量池中,(String s=new String()),new出來的東西都是存在堆記憶體中,每一次new都是宣告一個新的變數

字串的拼接操作本質上並不是修改字串,(常量池裡面的內容一經宣告,不允許修改)拼接操作是在常量池裡重新宣告一個新的字串,然後將字串的指向修改為指向這個新宣告的字串(修改字串的指向,並沒有修改字串的地址值字串的地址也發生了改變),以此達到拼接字串的目的

  • String str1 = new String();
    str1 += "abc";
    System.out.println(str1);  //abc
    String str2 = str1.concat("abc");
    System.out.println(str2);  //abcabc
    String str = "ankcj"; 
    //獲取字串的地址 Integer.toHexString(str.hashCode())
    System.out.println("@" +Integer.toHexString(str.hashCode()));//@58a86c5
    

char 預設值’\u0000’ (空格) int 預設值 0 boolean預設值false double預設值0.0

資料型別轉換

我們在做運算的時候,一般要求參與運算的資料型別必須一致

隱式轉換 byte,short,char --> int --> long --> float --> double

強制轉換 目標型別 變數名 = (目標型別) (被轉換的資料);
不建議強制轉換,因為會有精度的損失。

一旦運算當中有不同型別的資料,那麼結果將會是資料型別範圍大的那種(隱式轉換)

只有變數才能使用自增、自減運算子。常量不可發生改變,所以不能用

只有變數才能使用賦值運算子(=,+=,-=,*=,/=),常量不能進行賦值。
複合賦值運算子其中隱含了一個強制型別轉換。(+=,-=,/=,)

邏輯運算子

 & 邏輯與:有falsefalse| 邏輯或:有truetrue^ 邏輯異或:相同為false,不同為true! 邏輯非:非falsetrue,非truefalse&& 與(並且):全都是true,才是true;否則就是false
 
 || 或(或者):至少一個是true,就是true;全都是false,才是false

 !  非(取反):本來是true,變成false;本來是false,變成true

注意:

  1. &&和||具有短路效果,左邊如果已經確定結果,則右邊語句不會再執行
  2. |和& 沒有短路效果,左邊程式碼和右邊程式碼都會執行

switch(表示式) {case…default…}

表示式的取值byte,short,int,char(long不可以做switch的表示式)

JDK5以後可以是列舉

JDK7以後可以是String

注意:

  1. 在switch語句中,如果case的後面不寫break,將出現穿透現象,也就是不會在判斷下一個case的值,直接向後執行,直到遇到break,或者整體switch結束。 break表示中斷,結束的意思,可以結束switch語句。
  2. default語句表示所有情況都不匹配的時候,就執行該處的內容,和if語句的else相似。

for迴圈語句和while迴圈語句的小區別:

控制條件語句所控制的那個變數,在for迴圈結束後,就不能再被訪問到了,而while迴圈結束還可以繼續使用,如果你想繼續使用,就用while,否則推薦使用for。原因是for迴圈結束,該變數就從記憶體中消失,能夠提高記憶體的使用效率。

迴圈的使用推薦:for – while – do…while

隨機數

Random類 需要導包、建立物件、使用

Math.random() 無需導包,直接使用,產生的是0~1 [0,1) 之間的隨機小數


JVM記憶體劃分

  • 棧 儲存區域性變數

  • 堆 儲存new出來的東西

  • 方法區 (物件導向進階講)

  • 本地方法區 (和系統相關)

  • 暫存器 (給CPU使用)

類的五大成分

​ 1.成員變數
​ 2.構造器
​ 3.成員方法
​ 4.程式碼塊
​ 5.內部類

四大修飾符

  • public:可以修飾類、屬性、方法

  • protected:可以修飾屬性、方法

  • default:可以修飾類、屬性、方法

  • private:可以修飾屬性、方法

  • 注意:1.如果public修飾外部類,那麼外部類名要和檔名保持一致

    ​ 2.protected的受保護的方法,在同包下、本類中可以直接呼叫;但是在不同包的子類中,建立父類物件訪問不到父類的保護方法,只能用子類物件來訪問受保護方法,且子類物件要重防寫方法

public
公開的
protected
受保護的
default
預設的
private
私有的
本類中OKOKOKOK
同包下OKOKOK
不同包下的子類OKOK
不同包下的其他類OK

方法的過載

  • 在同一個類中,允許存在一個以上的同名方法,只要它們的引數個數或者引數型別不同即可

  • 與返回值型別無關,只有引數個數,引數型別,引數順序有關

  • int ----> String

  • String---->int

//int ---> String
int a = 10;
String s = ""+a; //10

//int ---> String
String str = Integer.toString(100);
System.out.println(str);  //100

//String ---> int  當String內容全是十進位制數字時才能轉化
String s3 = "30";
Integer c = Integer.valueOf(s3);
System.out.println("c = " + c);  //30
int d = Integer.parseInt(s3); //30

int max = Integer.MAX_VALUE; //2147483647
int min = Integer.MIN_VALUE; //-2147483648

區域性變數,成員變數,成員方法

  • 成員變數 就是事物的屬性 ,可以不初始化,會提供預設值 位置:類中,方法外
  • 成員方法 就是事物的行為 位置:類中
區別
區域性變數棧記憶體中,在使用前要賦初始值,在方法內宣告或者作為方法的形參
隨著方法的呼叫而存在,隨著方法的呼叫結束而結束
成員變數堆記憶體中,在類中方法外宣告,可不賦初始值,會提供預設值
隨著物件的存在而存在,隨著物件的消失而消失
成員方法描述事物的行為,在類中定義

什麼是封裝

  1. 物件導向的三大特性之一

  2. 將不需要對外提供的內容都隱藏(private)起來(隱藏其內部結構)

  3. 把屬性隱藏,提供公共方法對其訪問

  4. 屬性私有化,提供對應公開的getXxx()/setXxx()方法

  5. 通過方法來控制成員變數的操作,提高了程式碼的安全性

  6. 把程式碼用方法進行封裝,提高了程式碼的複用性,實現程式碼的元件化設計

什麼是繼承 extends

  1. is-a 類與類之間的關係 extends關鍵字
  2. 物件導向的三大特性之一
  3. java支援單繼承,也支援多層繼承
  4. 父類定義了共性內容,子類定義該類的個性內容
  5. 子類繼承父類後,(子類就是”父類“ is-a)子類會繼承父類的一些屬性和方法,子類可以直接訪問父類非私有的成員屬性和成員方法
  6. 父類的構造方法、靜態方法不會被子類繼承
  7. 父類可以使用自己的屬性及行為,但是不可以使用子類新擴充的屬性和行為.
  8. 父類的私有成員屬性、私有成員方法會被子類繼承,私有成員屬性可以通過公開的getter/setter來訪問,私有成員方法子類訪問不到,但是會被子類繼承(理解:父親給兒子一個保險箱,但是沒給鑰匙,但兒子確實繼承了這個保險箱,只是打不開而已)
  9. 注意事項:繼承中子父類構造方法呼叫順序(先父後子)
  10. 在每次建立子類物件時,我們先初始化父類內容,再初始化其子類的內容。在子類物件的記憶體空間中,會開闢一塊父類空間,用來存父類中的內容,這樣便可以包含父類的成員,如果父類成員是非私有的,那麼子類可以直接使用。(建立子類物件時,只是在子類空間中開闢了一塊父類空間,但是並沒有建立父類的物件

什麼是多型

  • 物件導向的三大特性之一

  • 最終體現形態為:父類的引用變數指向子類物件(子類例項)

  • 多型程式碼格式: 父類型別變數名 = new 子類型別();

  • 多型的前提是必須有子父類關係或者類實現介面關係,否則無法完成多型

  • 多型的使用場景:

    1.為變數賦值時使用多型,達到父類應用指向子類物件的賦值

    2.直接為變數賦值

    3.呼叫方法時,為方法引數賦值

    4.方法返回值,可以定義父類型別,但是返回子類物件.當該方法被調 用 時,用父類型別接收

  • 多型的好處:大大提高了程式的擴充套件性;提高了程式的複用性

  • 多型的弊端:多型編譯階段是看左邊父類型別的,如果子類有些獨有的功能,此時多型的寫法就無法訪問子類獨有功能了

  • 多型引數:實際開發的過程中,父類型別作為方法形式引數,傳遞子類物件給方法,進行方法的呼叫,更能體現出多型的擴充套件性與便利。

  • 多型轉型:

向上轉型:   多型本身是子類型別向父類型別向上轉型
		   使用格式:父類型別 變數名 = new 子類型別();
           如:Person p = new Student();

向下轉型(使用強制型別轉換):
使用格式:子類型別 變數名 = (子類型別) 父類型別的變數;
父類型別  f = new 子類型別();
子類型別   z = (子類型別)f;
如:Student stu = (Student) p;  //變數p 實際上指向Student物件

instanceof關鍵字:用來判斷執行期型別;判斷物件是否屬於某種資料型別

關聯關係 has-a

  • 物件和物件之間的連線
  • 程式碼表現形式:一個類做為另一個類的屬性存在(即“有”的關係)

依賴關係 use-a

  • 含義:指一個類A使用到了另一個類B(比如說一個類做為一個類中方法的形參)
  • 特性:這種關係是具有偶然性的、臨時性的、非常弱的,但是類B的變化會影響到類A。

對比this和super

對比區別
this代表所在類的物件引用 理解:方法被哪個物件呼叫,this就代表那個物件
訪問本類的成員變數或者成員方法
super訪問父類的成員變數或者成員方法
一般會遵循一個大原則:就近原則
區域性 > 本類成員 > 父類成員

static關鍵字

  • 含義:靜態
  • static修飾變數和方法都是屬於類的,不再屬於某一個特定的物件(直接通過類名點來訪問,不需要建立物件來訪問,可以但沒必要);沒有static修飾的變數和方法都是屬於類的每一個物件(需要建立物件後,通過物件名點來訪問)
  • 靜態變數和方法會隨著類的載入而載入,存放在方法區中的靜態區(全域性區)中

final關鍵字

  • 含義:最終的意思,可以修飾類、變數、方法
  • 修飾類:類不能被繼承
  • 修飾方法:方法不能被重寫
  • 修飾變數:變數能且只能被賦值一次

抽象類 abstract

  1. 抽象類用來描述一種型別應該具備的基本特徵與功能,具體如何去完成這些行為由子類通過方法重寫來完成

  2. 不能被例項化,不能建立物件,只能做為模板類等待被繼承

  3. 抽象類中可以有構造方法、成員屬性、抽象方法(沒有方法體)

  4. 抽象類中可以沒有抽象方法,但是有抽象方法的類一定是抽象類

  5. 抽象類中構造方法的作用:供子類建立物件時(預設的super()),初始化父類成員使用

  6. 抽象類的實現類要求:要麼重寫抽象父類的所有抽象方法,要麼就做為一個抽象類等待被繼承

  7. 抽象類存在的意義是為了被子類繼承,抽象類體現的是模板思想

    注意事項:

    1.抽象類一定是個父類,因為抽象類是不斷抽取共性需求而來的

    2.設計時由具體類抽取出抽象類,而開發階段應該先定義抽象父類,再根據不同需求由父類定義子類

單例設計模式

  1. 將建構函式私有化,使其不能在類外通過new建立物件
  2. 在類內部產生一個唯一的例項化物件,並將其封裝為private static型別的成員變數
  3. 定義一個公開的靜態方法,返回給外界唯一的物件
  4. 分類:餓漢單例設計模式、懶漢單例設計模式

內部類

1.內部類基本概念

  1. 內部類就是在一個類中定義另一個類,是一個相對概念
  2. 內部類分為:成員內部類和區域性內部類
  3. 定義內部類的時候,和正常定義類的過程一樣,同樣包含各種修飾符、繼承與實現關係等
  4. 內部類可以直接訪問外部類的所有成員
  5. 外部類編譯後,在方法區中會出現兩個class檔案
  6. (注:在日常的企業級開發中,我們很少會使用到內部類來實現業務邏輯)
  7. 可以使用的修飾符:訪問許可權修飾符、static、final、abstract

2.匿名內部類

使用:在建立一個類時沒有類名,簡化程式碼時建立,在實現一個介面或new一個類的例項 化物件時使用匿名內部類是區域性內部類的一種

過程:臨時定義一個型別的子類,定義後立刻建立剛剛定義的這個類的物件

目的:匿名內部類是建立某個型別子類物件的快捷方式,我們為了臨時定義一個類的子類, 並建立這個子類的物件而使用匿名內部類

理解:將定義子類與建立子類物件兩個步驟由一個格式一次完成。雖然是兩個步驟,但是兩 個步驟是連在一起的、即時的。匿名內部類如果不定義變數引用,則也是匿名物件。

格式:

new 父類(){
	//重寫需要重寫的方法
};

3.靜態內部類

定義:在一個類的內部宣告一個用static修飾的類,當你使用內部類時,可以通過外部類訪 問,和使用靜態成員屬性、靜態成員方法一樣

定義格式:

public class Outer{
	static class Inner{
		//其他程式碼
	}
}

訪問格式:

//同類中可以省略外部類名訪問
Inner x = new Inner();
//不同類中
Outer.Inner i = new Outer.Inner();

4.成員內部類

定義:在一個類的內部申明一個類,當你使用內部類時,可以通過外部類物件訪問,就跟操 作成員屬性、成員方法一樣。

定義格式:

public class Outer{
	class Inner{
		//其他程式碼
	}
}

訪問格式:

Outer.Inner  x = new Outer().new Inner();

5.區域性內部類

定義:在一個類的方法中申明內部類,當你呼叫這個方法時,才可以使用內部類(用的少)

定義格式:

public class Outer{
	public void method{
		class Inner{
			//其他程式碼
		}
	}
}

訪問格式: 只能在外部類的方法中建立物件並訪問。

程式碼塊

1.靜態程式碼塊

定義:必須有static修飾,必須放在類下。與類一起載入執行

格式:

static{
     // 執行程式碼
}

特點

  • 每次執行類,載入類的時候都會先執行靜態程式碼塊一次。
  • 靜態程式碼塊是自動觸發執行的,只要程式啟動靜態程式碼塊就會先執行一次。
  • 作用:在啟動程式之前可以做資源的初始化,一般用於初始化靜態資源

2.例項程式碼塊

定義:沒有static修飾,必須放在類下。與物件初始化一起載入

格式:

{
     // 執行程式碼
}

特點

  • 無static修飾。屬於物件,與物件的建立一起執行的。

  • 每次呼叫構造器初始化物件,例項程式碼塊都要自動觸發執行一次。

  • 例項程式碼塊實際上是提取到每一個構造器中去執行的。

  • 作用:例項程式碼塊用於初始化物件的資源。

只能在外部類的方法中建立物件並訪問。

程式碼塊

1.靜態程式碼塊

定義:必須有static修飾,必須放在類下。與類一起載入執行

格式:

static{
     // 執行程式碼
}

特點

  • 每次執行類,載入類的時候都會先執行靜態程式碼塊一次。
  • 靜態程式碼塊是自動觸發執行的,只要程式啟動靜態程式碼塊就會先執行一次。
  • 作用:在啟動程式之前可以做資源的初始化,一般用於初始化靜態資源

2.例項程式碼塊

定義:沒有static修飾,必須放在類下。與物件初始化一起載入

格式:

{
     // 執行程式碼
}

特點

  • 無static修飾。屬於物件,與物件的建立一起執行的。

  • 每次呼叫構造器初始化物件,例項程式碼塊都要自動觸發執行一次。

  • 例項程式碼塊實際上是提取到每一個構造器中去執行的。

  • 作用:例項程式碼塊用於初始化物件的資源。

相關文章