1. 程式人生 > 其它 >Java_Day17(內部類、常用API、包裝類)

Java_Day17(內部類、常用API、包裝類)

技術標籤:Java語言基礎與面向物件程式設計實踐java

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修飾的 成員
    如果在內部類中使用this此時的this代表的是內部類的當前物件
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(應用)

  1. 概述
    Math 包含執行基本數字運算的方法
  2. 呼叫方式
    Math類中無構造方法,但內部的方法都是靜態的,則可以通過 類名.進行呼叫
  3. 常用方法
方法名說明
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才是真正的面向物件

常用的操作之一:用於基本資料型別與字串之間的轉換

基本資料型別包裝類
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

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型別

  1. 一個基本型別的資料和字串拼接 就可以實現將基本型別轉換為String
String s = 3 + "";
System.out.println(s + 1);//31

  1. 使用包裝類提供的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
    }
}


  1. 使用String類提供的valueOf
System.out.println(String.valueOf(100) + 100);//100100

String 轉換為 int

  1. 先使用Integer.valueOf將字串數字轉成Integer,再呼叫intValue()方法轉換為int
  2. 通過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”
思路:

  1. 將字串按照空格分割成一個字串陣列
  2. 將其中的每一個元素轉換為數字
  3. 將轉換後的數字儲存到一個整型陣列中
  4. 使用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
    }
}

在這裡插入圖片描述