Java_Day17(內部類、常用API、包裝類)
阿新 • • 發佈:2020-12-27
Java_Day17(內部類、常用API、包裝類)
內部類
在類的內部建立一個類,這個類就稱為內部類
內部類分為成員內部類和區域性內部類
成員內部類
包含內部類的類稱為外部類
public class OuterClass {
private int num =10;
private int num1 = 20;
//成員內部類
public class InnerClass{
private double a = 100.1;
public void print(){
System. out.println(num +"---"+num1);
show();
}
}
public void show(){
System.out.println(num +"---"+num1);
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
System.out.println(oc.num);
System. out.println(oc.num1);
oc.show();
// 呼叫內部類的成員方法、成員屬性
//1 需要建立內部類的物件,需要通過外部類的物件來建立內部類的物件,創建出來的物件是內部類型別
InnerClass innerClass = new OuterClass().new InnerClass();
System.out.println(innerClass.a);
innerClass.print();
}
}
- 包含有成員內部類的類 編譯之後 會產生多個class檔案
- 在成員內部類中不能存在static修飾的 成員
package cn.lanqiao.inner;
public class OuterClass {
private int num =10;
private int num1 = 20;
//成員內部類
private class InnerClass{
private double a = 100.1;
int i = 100;
public InnerClass(){
}
public InnerClass(int i){
this.i = i;
}
public void print(){
System.out.println(num +"---"+num1);
show();
}
}
public void show(){
System.out.println(num +"---"+num1);
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
System.out.println(oc.num);
System.out.println(oc.num1);
oc.show();
// 呼叫內部類的成員方法、成員屬性
//1 需要建立內部類的物件 需要通過 外部類 的物件來建立內部類的物件 創建出來的物件是內部類型別
InnerClass innerClass = new OuterClass().new InnerClass();
// 使用外部類已有的物件來建立外部類 同時可以使用他的過載的 構造方法
InnerClass innerClass1 =oc.new InnerClass(100);
System.out.println(innerClass.a);
innerClass.print();
}
}
區域性內部類
package cn.lanqiao.inner;
public class OuterClass {
private int num =10;
private int num1 = 20;
public void show(){
System.out.println(num +"---"+num1);
// 區域性內部類 相當於方法的一個區域性變數 區域性變數不能使用訪問修飾符
class InnerClass{
private int i = 100;
public void print(){
System.out.println(num +"--"+ num1+"--"+i);
}
}
// 區域性內部類的 宣告週期和區域性變數相同 僅限於當前方法中來使用 在方法的 外部是訪問不到的
//在方法中如果要訪問區域性內部類的成員 則需要建立區域性內部類的 物件來訪問
InnerClass innerClass = new InnerClass();
System.out.println(innerClass.i);
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
oc.show();
}
}
編譯也會產生多個class檔案
匿名內部類
匿名內部類一般用於在方法的引數上,當方法的引數是一個抽象類或者介面的時候,可以採用匿名內部類的形式來傳入方法的實參
public interface InterDemo {
void method();
}
public class ClassDemo {
public void show(InterDemo interDemo){
interDemo.method();
}
public static void main(String[] args) {
ClassDemo demo = new ClassDemo();
demo.show(new InterDemo() {
@Override
public void method() {
System.out.println("這是使用匿名內部類來實現介面的");
}
});
}
}
常用API
Math(應用)
- 概述
Math 包含執行基本數字運算的方法 - 呼叫方式
Math類中無構造方法,但內部的方法都是靜態的,則可以通過類名.
進行呼叫 - 常用方法
方法名 | 說明 |
---|---|
public static int abs(int a) | 返回引數的絕對值 |
public static double ceil(double a) | 返回大於或等於引數的最小double值,等於一個整數 |
public static double floor(double a) | 返回小於或等於引數的最大double值,等於一個整數 |
public static int round(float a) | 按照四捨五入返回最接近引數的int |
public static int max(int a,int b) | 返回兩個int值中的較大值 |
public static int min(int a,int b) | 返回兩個int值中的較小值 |
public static double pow(double a,double b) | 返回a的b次冪的值 |
public static double random() | 返回值為double的正值,[0.0,1.0) |
Random 類(應用)
Math 類中雖然為我們提供了產生隨機數的方法 Math.random(),但是通常我們需要的隨機數範圍並不是[0, 1)之間的 double 型別的資料,這就需要對其進行一些複雜的運算。如果使用 Math.random()計算過於複雜的話,我們可以使用例外一種方式得到隨機數,即Random 類,這個類是專門用來生成隨機數的,並且 Math.random()底層呼叫的就是Random 的 nextDouble()方法。
System(應用)
方法名 | 說明 |
---|---|
public static void exit(int status) | 終止當前執行的 Java 虛擬機器,非零表示異常終止 |
public static long currentTimeMillis() | 返回當前時間(以毫秒為單位) |
包裝類
基本型別包裝類
- Java 是面向物件的語言,但並不是“純面向物件”的,因為我們經常用到的基本資料型別就不是物件。但是我們在實際應用中經常需要將基本資料轉化成物件,以便於操作。
比如:將基本資料型別儲存到 Object[ ]陣列或集合中的操作等等。 - 為了解決這個不足,Java 在設計類時為每個基本資料型別設計了一個對應的類進行代表,這樣八個和基本資料型別對應的類統稱為包裝類(Wrapper Class)。
針對八種基本資料型別定義相應的引用型別—包裝類(封裝類)
有了類的特點,就可以呼叫類中的方法, Java才是真正的面向物件
常用的操作之一:用於基本資料型別與字串之間的轉換
基本資料型別 | 包裝類 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
Integer
方法名 | 說明 |
---|---|
public Integer(int value) | 根據 int 值建立 Integer 物件(過時) |
public Integer(String s) | 根據 String 值建立 Integer 物件(過時) |
public static Integer valueOf(int i) | 返回表示指定的 int 值的 Integer 例項 |
public static Integer valueOf(String s) | 返回一個儲存指定值的 Integer 物件 String |
public static void main(String[] args) {
// 如果在使用過程中,呼叫方法的時候,如果方法上畫了刪除線 則表示該方法不推薦使用,但是 依然可以使用
Integer integer = new Integer("10");
//使用Integer來獲取最大的整數
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
//推薦使用的 獲取Integer物件的方法
// 實現了將基本型別的資料轉換為他的包裝類物件
Integer in = Integer.valueOf(100);
// 將基本型別的String型別轉換為基本 型別對應的包裝類
Integer in2 = Integer.valueOf("bac");//字串中的內容只能為數字 否則就會出現NumberFormatException
}
自動裝箱和自動拆箱
Integer in3 = 120;// 自動裝箱 始於jdk1.5
int i = in;// 自動拆箱
int和String型別的相互轉換
將一個int型別轉化為String型別
- 一個基本型別的資料和字串拼接 就可以實現將基本型別轉換為String
String s = 3 + "";
System.out.println(s + 1);//31
- 使用包裝類提供的toString方法
package cn.lanqiao.wrapper;
public class IntegerDemo {
public static void main(String[] args) {
// 如果在使用過程中,呼叫方法的時候,如果方法上畫了刪除線 則表示該方法不推薦使用,但是 依然可以使用
Integer integer = new Integer("10");
//使用Integer來獲取最大的整數
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
//推薦使用的 獲取Integer物件的方法
// 實現了將基本型別的資料轉換為他的包裝類物件
Integer in = Integer.valueOf(100);
// 將基本型別的String型別轉換為基本 型別對應的包裝類
Integer in2 = Integer.valueOf("200");//字串中的內容只能為數字 否則就會出現NumberFormatException
Integer in3 = 120;// 自動裝箱 始於jdk1.5
int i = in;// 自動拆箱
String s = 3 + "";
System.out.println(s + 1);//31
System.out.println(in2.toString() + 100);//200100
}
}
- 使用String類提供的valueOf
System.out.println(String.valueOf(100) + 100);//100100
String 轉換為 int
- 先使用Integer.valueOf將字串數字轉成Integer,再呼叫intValue()方法轉換為int
- 通過Integer靜態方法parseInt()進行轉換 public static int parseInt(String s)
//將String 型別轉換為int型別
//方式一:先使用Integer.valueOf將字串數字轉成Integer,再呼叫intValue()方法轉換為int
String str = "1000";
Integer ii = Integer.valueOf(str);
// 使用intValue方法
int ii1 = ii.intValue();
// 可以使用自動拆箱
int ii2= ii;
//方式二通過Integer靜態方法parseInt()進行轉換 public static int
int ii3 = Integer.parseInt(str);
}
案例:字串中資料排序
需求:有一個字串:“91 27 46 38 50”,請寫程式實現最終輸出結果是:“27 38 46 50 91”
思路:
- 將字串按照空格分割成一個字串陣列
- 將其中的每一個元素轉換為數字
- 將轉換後的數字儲存到一個整型陣列中
- 使用Arrays提供的 排序方法或者使用我們自己寫的排序方法對陣列進行排序
public class StrChangInt {
public static void main(String[] args) {
String str = "91 27 46 38 50";
String[] strArr = str.split(" ");
Integer[] intArr = new Integer[strArr.length];
for(int i = 0 ; i < strArr.length;i++){
intArr[i] = Integer.parseInt(strArr[i]);
}
Arrays.sort(intArr);
for(Integer integer : intArr){
System.out.println(integer);
}
}
}
包裝類的快取問題
- 整型、char型別所對應的包裝類,在自動裝箱時,對於-128~127之間的值會進行快取處理,其目的是提高效率。
- 快取處理的原理為:如果資料在-128~127這個區間,那麼在類載入時就已經為該區間的每個數值建立了物件,並將這256個物件存放到一個名為cache的陣列中。每當自動裝箱過程發生時(或者手動呼叫valueOf()時),就會先判斷資料是否在該區間,如果在則直接獲取陣列中對應的包裝類物件的引用,如果不在該區間,則會通過new呼叫包裝類的構造方法來建立物件。下面我們以Integer類為例,看一看Java為我們提供的原始碼,加深對快取技術的理解
public class StrChangInt {
public static void main(String[] args) {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false
Integer m = 123;
Integer n = 123;
// 只要自動裝箱的資料的範圍在-128---127之間 都是 直接從快取物件陣列中去獲取元素
System.out.println(m == n);//true
Integer x = 128;
Integer y = 128;
System.out.println(x == y);//false
}
}