面向對象進階第三天 內部類 內部類是什麼? 類的5大成分(成員變數、成員方法、構造器、代碼塊、內部類)之一 類中的類 使用場景 當一個事物的內部,還有一個部分需要一個完整的結構進行描述時。 內部類有幾種 1、靜態內部類 是什麼?有static修飾,屬於外部類本身。 特點:只是位置在類裡面。類有的成分 ...
內部類
內部類是什麼?
-
類的5大成分(成員變數、成員方法、構造器、代碼塊、內部類)之一
-
類中的類
使用場景
-
當一個事物的內部,還有一個部分需要一個完整的結構進行描述時。
內部類有幾種
-
1、靜態內部類
-
是什麼?有static修飾,屬於外部類本身。
-
特點:只是位置在類裡面。類有的成分它都有。
-
創建對象:
外部類.內部類名 對象名 = new 外部類名.內部類構造器;
-
拓展
1、靜態內部類可以直接訪問外部類的靜態成員嗎? 可以的
2、靜態內部類中是否可以直接訪問外部類的實例成員? 不可以的
-
-
2、成員內部類(實例內部類)
-
是什麼?
-
無static修飾,屬於外部類的對象的。
-
-
特點:JDK 16中類有的成分,它都有。
-
創建對象 :
外部類.內部類 對象名 = new 外部類構造器.new 內部類構造器;
-
拓展
1、成員內部類中是否可以直接訪問外部類的靜態成員? 可以
2、成員內部類的實例方法中是否可以直接訪問外部類的實例成員? 可以
-
-
3、局部內部類
-
定義在方法,代碼塊,構造器中,執行代碼處的類。雞肋語法!
-
-
4、匿名內部類(重點)
-
使用匿名內部類的好處:
-
方便構建子類對象,最終目的:簡化代碼
-
-
格式:
new 類名|介面|抽象類(){
方法重寫;
} -
特點:
-
匿名內部類是一個沒有名字的局部內部類,本身也是一個所謂的子類對象。
-
匿名內部類產生的對象類型,相當於是當前new的那個的類型的子類類型。
-
-
枚舉
是什麼? 是一種特殊類型。 枚舉的特征:
-
枚舉類都是繼承了枚舉類型:java.lang.Enum
-
枚舉都是最終類,不可以被繼承。
-
構造器都是私有的,枚舉對外不能創建對象。
-
枚舉類的第一行預設都是羅列枚舉對象的名稱的。
-
枚舉類相當於是多例模式。
泛型
認識泛型
-
定義類、介面、方法時,同時聲明瞭一個或者多個類型變數(如:<E>) ,稱為泛型類、泛型介面,泛型方法、它們統稱為泛型。
-
作用
-
泛型提供了在編譯階段約束所能操作的數據類型,並自動進行檢查的能力!這樣可以避免強制類型轉換,及其可能出現的異常。
-
泛型類
-
定義類的同時定義了泛型的類就是泛型類
-
泛型類的格式
修飾符 class 類名<類型變數,類型變數,…> {
} -
作用
-
在編譯階段可以指定能操作的數據的類型
-
-
原理
-
把出現泛型變數的地方全部替換成傳輸的真實數據類型。
-
泛型介面
-
使用了泛型定義的介面就是泛型介面
-
格式
修飾符 interface 介面名稱<泛型變數> {
} -
作用
-
泛型介面可以讓實現類選擇當前功能需要操作的數據類型
-
-
原理
-
實現類可以在實現介面的時候傳入自己操作的數據類型,這樣重寫的方法都將是針對於該類型的操作。
-
泛型方法
-
定義方法時同時定義了泛型的方法就是泛型方法
-
格式
修飾符 <類型變數,類型變數,…> 返回值類型 方法名(形參列表) {
} -
作用
-
方法中可以使用泛型接收一切實際類型的參數,方法更具備通用性。
-
-
原理
-
把出現泛型變數的地方全部替換成傳輸的真實數據類型。
-
泛型通配符、上下限
-
? 可以在“使用泛型”的時候代表一切類型。
-
E T K V 是在定義泛型的時候使用的。
-
泛型的上下限
-
? extends Car: ?必須是Car或者其子類 泛型上限
-
? super Car : ?必須是Car或者其父類 泛型下限
-
泛型的註意事項:擦除問題、基本數據類型問題
-
泛型是工作在編譯階段的,一旦程式編譯成class文件,class文件中就不存在泛型了,這就是泛型擦除。
-
泛型不支持基本數據類型,只能支持對象類型(引用數據類型)。
java.lang包下常用API
API概述
API全稱是應用程式編程介面,是Java寫好的程式,程式員可以直接調用。
Object類:toString方法
Object是祖宗類,它裡面的方法,一切子類對象都可以使用。
public String toString()
-
預設是返回當前對象的地址信息。
Student s = new Student("張三",'女', 23);
-
System.out.println(s.toString());
-
返回對象地址
-
-
System.out.println(s);
-
直接輸出對象名,預設是調用toString方法的
-
toString存在的意義:
-
預設返回對象的地址其實是沒有意義的
-
真實存在的意義是被子類重寫,以便返回子類對象的內容。
Object類:equals方法
public boolean equals(Object o )
-
預設是比較2個對象的地址是否一樣,返回true 或者false
equals存在的意義
-
預設比較對象的地址其實是沒有意義的,因為== 號可以更簡單的完成
-
存在的的真實意義是被子類重寫,以便比較對象的內容。
protected Object clone()
當某個對象調用這個方法時,這個方法會複製一個一模一樣的新對象返回。
分類:
-
淺克隆:拷貝出的新對象,與原對象中的數據一模一樣(引用類型拷貝的只是地址)
-
深克隆:
對象中基本類型的數據直接拷貝。
對象中的字元串數據拷貝的還是地址。
對象中還包含的其他對象,不會拷貝地址,會創建新對象。
Objects
Objects是一個工具類,提供了更安全的方式比較2個對象。
Student s = null;
-
s.equals(s2); 空指針異常
-
Objects.equals(s, s2); 返回false
Objects常見方法:
方法名 | 說明 |
---|---|
public static boolean equals(Object a, Object b) | 比較兩個對象的,底層會先進行非空判斷,從而可以避免空指針異常。再進行equals比較 |
public static boolean isNull(Object obj) | 判斷變數是否為null ,為null返回true ,反之返回false |
包裝類
其實就是8種基本數據類型對應的引用類型。
作用:實現一切皆對象
包裝類的分類:
基本數據類型 | 引用數據類型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
包裝類其實可以隨便用的:int integer
-
自動裝箱
-
基本類型的數據可以賦值其給包裝類
-
-
自動拆箱
-
包裝類的數據賦值給基本數據類型
-
包裝類的特有功能:
1、基本類型變成字元串
// 1、調用包裝類繼承自Object的toString方法 String rs1 = it6.toString(); // "23" System.out.println(rs1 + 1); // 231 // 2、調用靜態方法: public static String toString(int i) String rs2 = Integer.toString(it6);// "23" System.out.println(rs2 + 1); // 3、直接加 “” String rs3 = it6 + ""; // "23" System.out.println(rs3 + 1);
2、把字元串變成基本數據類型(重點)
String age = "23"; // int ageInt = Integer.parseInt(age); int ageInt = Integer.valueOf(age); System.out.println(ageInt + 1); String price = "98.5"; // double priceDb = Double.parseDouble(price); double priceDb = Double.valueOf(price); System.out.println(priceDb + 0.5);