1. 程式人生 > 其它 >內部類&API

內部類&API

1. 引數傳遞

1.1 類名作為形參和返回值(應用)

  • 1、類名作為方法的形參

    方法的形參是類名,其實需要的是該類的物件

    實際傳遞的是該物件的【地址值】

  • 2、類名作為方法的返回值

    方法的返回值是類名,其實返回的是該類的物件

    實際傳遞的,也是該物件的【地址值】

  • 示例程式碼:

    class Cat {
    public void eat() {
      System.out.println("貓吃魚"); 
    }
    }
    class CatOperator { 
    public void useCat(Cat c) { //Cat c = new Cat(); 
      c.eat(); 
    }
    public Cat getCat() {
      Cat c = new Cat(); 
      return c; 
    } 
    }
    public class CatDemo { 
    public static void main(String[] args) { //建立操作類物件,並呼叫方法
      CatOperator co = new CatOperator(); 
      c = new Cat();
      co.useCat(c); 
      Cat c2 = co.getCat(); //new Cat() 
      c2.eat(); 
    } 
    }
    

1.2 抽象類作為形參和返回值(理解)

  • 抽象類作為形參和返回值

    • 方法的形參是抽象類名,其實需要的是該抽象類的子類物件
    • 方法的返回值是抽象類名,其實返回的是該抽象類的子類物件
  • 示例程式碼:

    abstract class Animal {
      public abstract void eat();
    }
    class Cat extends Animal {
      @Override 
      public void eat() {
        System.out.println("貓吃魚"); 
      } 
    }
    class AnimalOperator {
      public void useAnimal(Animal a) { //Animal a = new Cat();
        a.eat(); 
      }
      public Animal getAnimal() {
        Animal a = new Cat();
        return a; 
      }
    }
    public class AnimalDemo {
      public static void main(String[] args) { //建立操作類物件,並呼叫方法 
        AnimalOperator ao = new AnimalOperator();
        Animal a = new Cat();
        ao.useAnimal(a);
        Animal a2 = ao.getAnimal(); //new Cat()
        a2.eat();
      }
    }
    

1.3 介面名作為形參和返回值(理解)

介面作為形參和返回值

  • 方法的形參是介面名,其實需要的是該介面的實現類物件
  • 方法的返回值是介面名,其實返回的是該介面的實現類物件

示例程式碼:

interface Jumpping {
  void jump();
}
class JumppingOperator {
  public void useJumpping(Jumpping j) { //Jumpping j = new Cat(); 
    j.jump();
  }
  public Jumpping getJumpping() { 
    Jumpping j = new Cat();
    return j; 
  }
}
class Cat implements Jumpping {
  @Override
  public void jump() { 
    System.out.println("貓可以跳高了");
  }
}
public class JumppingDemo {
  public static void main(String[] args) { //建立操作類物件,並呼叫方法 
    JumppingOperator jo = new JumppingOperator();
    Jumpping j = new Cat(); 
    jo.useJumpping(j);
    Jumpping j2 = jo.getJumpping(); //new Cat()
    j2.jump();
  }
}

2. 內部類

2.1 內部類的基本使用(理解)

  • 內部類概念

    • 在一個類中定義一個類。舉例:在一個類A的內部定義一個類B,類B就被稱為內部類
  • 內部類定義格式

    • 格式&舉例:

      /* 格式: 
      		class 外部類名{
          		修飾符 class 內部類名{
              }
          } 
      */
      class Outer {
        public class Inner {
        
        }
      }
      
  • 內部類的訪問特點

    • 內部類可以直接訪問外部類的成員,包括私有
    • 外部類要訪問內部類的成員,必須建立物件
  • 示例程式碼:

    /* 內部類訪問特點:
    				內部類可以直接訪問外部類的成員,包括私有 
    				外部類要訪問內部類的成員,必須建立物件    
     */
    public class Outer { 
      private int num = 10; 
      public class Inner { 
        public void show() { 
          System.out.println(num);
        }
      }
      public void method() {
        Inner i = new Inner();
        i.show();
      }
    }
    

2.2 成員內部類(理解)

  • 成員內部類的定義位置

    • 在類中方法,跟成員變數是一個位置
  • 外界建立成員內部類格式

    • 格式:外部類名.內部類名 物件名 = 外部類物件.內部類物件;
    • 舉例:Outer.Inner oi = new Outer().new Inner();
  • 成員內部類的推薦使用方案

    • 將一個類,設計為內部類的目的,大多數都是不想讓外界去訪問,所以內部類的定義應該私有化,私有化之後,再提供一個可以讓外界呼叫的方法,方法內部建立內部類物件並呼叫。
  • 示例程式碼:

    class Outer { 
      private int num = 10; 
      private class Inner {
        public void show() {
          System.out.println(num); 
        } 
      }
      public void method() {
        Inner i = new Inner();
        i.show(); 
      }
    }
    public class InnerDemo {
      public static void main(String[] args) { 
        //Outer.Inner oi = new Outer().new Inner(); 
        //oi.show();
        Outer o = new Outer();
        o.method();
      }
    }
    

2.3 區域性內部類(理解)

  • 區域性內部類定義位置

    • 區域性內部類是在方法中定義的類
  • 區域性內部類方式方式

    • 區域性內部類,外界是無法直接使用,需要在方法內部建立物件並使用
    • 該類可以直接訪問外部類的成員,也可以訪問方法內的區域性變數
  • 示例程式碼

    class Outer { 
      private int num = 10; 
      public void method() {
        int num2 = 20;
        class Inner {
          public void show() { 
            System.out.println(num); 
            System.out.println(num2);
          }
        }
        Inner i = new Inner(); 
        i.show(); 
      }
    }
    public class OuterDemo {
      public static void main(String[] args) { 
        Outer o = new Outer(); 
        o.method(); 
      }
    }
    

2.4 匿名內部類(應用)

  • 匿名內部類的前提

    • 存在一個類或者介面,這裡的類可以是具體類也可以是抽象類
  • 匿名內部類的格式

    • 格式:new 類名 ( ) { 重寫方法 } new 介面名 ( ) { 重寫方法 }

    • 舉例:

      new Inter(){ 
      @Override 
      public void method(){} 
      } 
      
  • 匿名內部類的本質

    • 本質:是一個繼承了該類或者實現了該介面的子類匿名物件
  • 匿名內部類的細節

    • 匿名內部類可以通過多型的形式接受

      Inter i = new Inter(){
        @Override
        public void method(){
        }
      }
      
  • 匿名內部類直接呼叫方法

    interface Inter{ 
      void method();
    }
    class Test{ 
      public static void main(String[] args){ 
        new Inter(){ 
          @Override 
          public void method(){ 
            System.out.println("我是匿名內部類");
          } 
        }.method(); // 直接呼叫方法
      }
    }
    

2.4 匿名內部類在開發中的使用(應用)

  • 匿名內部類在開發中的使用

    • 當發現某個方法需要,介面或抽象類的子類物件,我們就可以傳遞一個匿名內部類過去,來簡化傳統的程式碼
  • 示例程式碼:

    interface Jumpping { 
      void jump();
    }
    class Cat implements Jumpping {
      @Override
      public void jump() {
        System.out.println("貓可以跳高了");
      }
    }
    class Dog implements Jumpping {
      @Override public void jump() {
        System.out.println("狗可以跳高了");
      }
    }
    class JumppingOperator {
      public void method(Jumpping j) { //new Cat(); new Dog();
        j.jump();
      }
    }
    class JumppingDemo {
      public static void main(String[] args) {
        //需求:建立介面操作類的物件,呼叫method方法
        JumppingOperator jo = new JumppingOperator();
        Jumpping j = new Cat();
        jo.method(j);
        
        
        Jumpping j2 = new Dog();
        jo.method(j2);
        System.out.println("--------"); 
        
        // 匿名內部類的簡化
        jo.method(new Jumpping() {
          @Override
          public void jump() { 
            System.out.println("貓可以跳高了");
          }
        });
        // 匿名內部類的簡化
        jo.method(new Jumpping() {
          @Override
          public void jump() {
            System.out.println("狗可以跳高了"); 
          }
        }); 
      }
    }
    

3. 常用API

3.1 Math(應用)方法名 說明

  • 1、Math類概述

    • Math 包含執行基本數字運算的方法
  • 2、Math中方法的呼叫方式

    • Math類中無構造方法,但內部的方法都是靜態的,則可以通過 類名.進行呼叫
  • 3、Math類的常用方法

    方法名 說明
    public static int abs(int a) 返回引數的絕對值
    public static double ceil(double a) 返回大於或等於引數的最小double值,等於一個整數
    public static double flfloor(double a) 返回小於或等於引數的最大double值,等於一個整數
    public static int round(flfloat 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)

3.2 System(應用)

  • System類的常用方法

    方法名 說明
    public static void exit(int status) 終止當前執行的 Java 虛擬機器,非零表示異常終止
    public static long currentTimeMillis() 返回當前時間(以毫秒為單位)
  • 示例程式碼

    • 需求:在控制檯輸出1-10000,計算這段程式碼執行了多少毫秒

      public class SystemDemo {
        public static void main(String[] args) {
          // 獲取開始的時間節點
          long start = System.currentTimeMillis();
          for (int i = 1; i <= 10000; i++) {
            System.out.println(i);
          }
          // 獲取程式碼執行結束後的時間節點
          long end = System.currentTimeMillis();
          System.out.println("共耗時:" + (end - start) + "毫秒"); 
        }
      }
      

3.3 Object類的toString方法(應用)

  • Object類概述

    • Object 是類層次結構的根,每個類都可以將 Object 作為超類。所有類都直接或者間接的繼承自該類,換句話說,該類所具備的方法,所有類都會有一份
  • 檢視方法原始碼的方式

    • 選中方法,按下Ctrl + B
  • 重寫toString方法的方式

      1. Alt + Insert 選擇toString
      1. 在類的空白區域,右鍵 -> Generate -> 選擇toString
  • toString方法的作用:

    • 以良好的格式,更方便的展示物件中的屬性值
  • 示例程式碼:

    class Student extends Object {
      private String name;
      private int age;
      
      public Student() {
      }
      
      public Student(String name, int age) {
        this.name = name;
        this.age = age;
      }
      
      public String getName() {
        return name; 
      }
      
      public void setName(String name) {
        this.name = name;
      }
      
      public int getAge() {
        return age;
      }
      
      public void setAge(int age) {
        this.age = age;
      }
      
      @Override
      public String toString() {
        return "Student{" +
          			"name='" + name + '\'' +
          			", age=" + age +
          '}';
      }
    }
    public class ObjectDemo {
      public static void main(String[] args) {
        Student s = new Student();
        s.setName("林青霞");
        s.setAge(30);
        System.out.println(s);
        System.out.println(s.toString());
      }
    }
    
  • 執行結果:

    Student{name='林青霞', age=30}
    Student{name='林青霞', age=30}
    

3.4 Object類的equals方法(應用)

  • equals方法的作用

    • 用於物件之間的比較,返回true和false的結果
    • 舉例:s1.equals(s2); s1和s2是兩個物件
  • 重寫equals方法的場景

    • 不希望比較物件的地址值,想要結合物件屬性進行比較的時候。
  • 重寫equals方法的方式

      1. alt + insert 選擇equals() and hashCode(),IntelliJ Default,一路next,fifinish即可
      1. 在類的空白區域,右鍵 -> Generate -> 選擇equals() and hashCode(),後面的同上。
  • 示例程式碼:

    class Student {
      private String name;
      private int age;
      
      public Student() {
      }
      
      public Student(String name, int age) {
        this.name = name;
        this.age = age;
      }
      
      public String getName() {
        return name;
      }
      
      public void setName(String name) {
        this.name = name;
      }
      
      public int getAge() {
        return age;
      }
      
      public void setAge(int age) {
        this.age = age;
      }
      
      @Override
      public boolean equals(Object o) {
        //this -- s1 
        //o -- s2
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        
        Student student = (Student) o; //student -- s2
        
        if (age != student.age) return false;
        return name != null ? name.equals(student.name) : student.name == null;
      }
    }
    public class ObjectDemo {
      public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("林青霞");
        s1.setAge(30);
        
        Student s2 = new Student();
        s2.setName("林青霞");
        s2.setAge(30);
        //需求:比較兩個物件的內容是否相同
        
        System.out.println(s1.equals(s2));
      }
    }
    

3.5 氣泡排序原理(理解)

  • 氣泡排序概述
    • 一種排序的方式,對要進行排序的資料中相鄰的資料進行兩兩比較,將較大的資料放在後面,依次對所有的資料進行操作,直至所有資料按要求完成排序
  • 如果有n個數據進行排序,總共需要比較n-1次
  • 每一次比較完畢,下一次的比較就會少一個數據參與

3.6 氣泡排序程式碼實現(理解)

  • 程式碼實現

    /* 
    		氣泡排序:
        		一種排序的方式,對要進行排序的資料中相鄰的資料進行兩兩比較,將較大的資料放在後面,
            依次對所有的資料進行操作,直至所有資料按要求完成排序
      	*/ 
    public class ArrayDemo {
      public static void main(String[] args) {
        //定義一個數組
        int[] arr = {24, 69, 80, 57, 13};
        System.out.println("排序前:" + arrayToString(arr));
        
        // 這裡減1,是控制每輪比較的次數
        for (int x = 0; x < arr.length-1; x++) {
          // -1是為了避免索引越界,-x是為了調高比較效率
          for (int i = 0; i < arr.length - 1 - x; i++) {
            if (arr[i] > arr[i + 1]) {
              int temp = arr[i];
              arr[i] = arr[i + 1];
              arr[i + 1] = temp;
            }
          }
        }
        System.out.println("排序後:" + arrayToString(arr));
      }
      //把陣列中的元素按照指定的規則組成一個字串:[元素1, 元素2, ...]
      public static String arrayToString(int[] arr) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
          if (i == arr.length - 1) {
            sb.append(arr[i]);
          } else {
            sb.append(arr[i]).append(", ");
          }
        }
        sb.append("]");
        String s = sb.toString();
        return s;
      }
    }
    

3.7 Arrays(應用)

  • Arrays的常用方法

    方法名 說明
    public static String toString(int[] a) 返回指定陣列的內容的字串表示形式
    public static void sort(int[] a) 按照數字順序排列指定的陣列
  • 工具類設計思想

    1、構造方法用 private 修飾

    2、成員用 public static 修飾