Java進階 --內部類

引用數據類型作爲方法的形參和返回值

  • 普通類:
    作爲形參:傳遞的是類或者子類對象,也即是將new 出來的對象傳遞給方法。
    作爲返回值:返回的也是類或者子類的對象。
  • 抽象類:
    作爲形參:傳遞的是子類的對象。
    作爲返回值:返回的也是子類的對象。
  • 接口:
    作爲形參:傳遞的是實現類的對象。
    作爲返回值:返回的也是實現類的對象。
/*
	定義了一個內部類Outer和一個外部類Inner
*/
public class Outer {

    // 私有成員內部類
    private class Inner implements Inter {
        @Override
        public void innerShow() {
            System.out.println("Inner內部類的innerShow方法被實現");
        }
    }

    // 外部類成員方法,返回一個內部類對象,採用接口多肽的形式返回
    public Inter getInner() {
        return new Inner();
    }

    // 公有成員內部類
    public class Inner2 {
        public void inner2Show() {
            System.out.println("Inner2內部類的inner2Show方法被訪問");
        }
    }

    // 公有靜態成員內部類
    public static class Inner3 {
        public static void inner3Show() {
            System.out.println("Inner3內部類的inner3Show方法被訪問");
        }
    }
}
/*
	接口,主要用途是採用接口多肽的方式來返回內部類對象的
*/
public interface Inter {
    void innerShow();
}
/*
	測試類
*/
public class OuterDemo {
    public static void main(String[] args) {
        // 創建一個Outer對象
        Outer o = new Outer();

        Inter i = o.getInner();
        i.innerShow();

        // 創建對象
        Outer.Inner2 i2 = new Outer().new Inner2();
        i2.inner2Show();

        // 直接用類名就可以訪問公有靜態內部類的方法
        Outer.Inner3.inner3Show();
    }
}
  • 總結:
    1. 如果形參或者返回值是普通類類型,傳遞或者返回的就是該類或其子類對象。
    2. 如果形參或者返回值是抽象類類型,傳遞或者返回的就是它子類對象。
    3. 如果形參或者返回值是接口類型,傳遞或者返回的就是它實現類對象。

內部類

  • 概念:在一個類內部定義的類就叫做內部類。內部類可以分爲:成員內部類、局部內部類、匿名內部類。

  • 內部類的目的:一般只需要在當前類中使用某個類的對象,那麼這個類就可以定義成內部類,而且被private修飾,外面無法直接訪問。

  • 成員內部類:在類中方法外定義的內部類就是成員內部類。

    注意:

  1. 如果成員內部類是public修飾的,那麼外界可以直接訪問。
    外部類.內部類 對象名=new 外部類().new 內部類();
  2. 如果成員內部類是public static 修飾的,外界也可以直接訪問。
    外部類.內部類 對象名=new 外部類.內部類();
  3. 如果成員內部類是private修飾的,那麼外界無法直接方法,只能在內部類所在的外部類創建該內部類對象。
  • 局部內部類:在方法內部創建的類就是局部內部類。

  • 匿名內部類:一般在開發中使用匿名內部類的形式創建抽象類的子類對象或者接口的實現類對象。僅僅只是簡化書寫子類或者實現類的過程。

常見用法:作爲方法的參數值傳遞

			//創建飼養員類,讓動物喫東西
            AnimalOperator operator=new AnimalOperator();
            //調用useAnimal方法操作動物喫東西
            operator.useAnimal(new Animal() {
                @Override
                public void eat() {
                    System.out.println("?喫骨頭");
                }
            });

案例:

```java
/*
    抽象類
 */
public abstract class Animal {
    public abstract void eat();
}
/*
    接口
 */
public interface Jumpping {
    void jump();
}
/*
	飼養員操作類
*/
public class AnimalOperator {
    public void userAnimal(Animal a) {
        a.eat();
    }
}
public class Demo {
    public static void main(String[] args) {
        // 使用匿名內部類的方式創建抽象類Animal對象
        Animal a=new Animal(){
            @Override
            public void eat() {
                System.out.println("貓喫魚");
            }
        };

        // a爲匿名內部類的對象名,並且調用匿名內部類中的方法
        a.eat();

        // // 使用匿名內部類的方式創建接口Jumpping對象
        Jumpping j=new Jumpping(){
            @Override
            public void jump() {
                System.out.println("猴子跳高");
            }
        };

        // // j爲匿名內部類的對象名,並且調用匿名內部類中的方法
        j.jump();

        AnimalOperator ao = new AnimalOperator();
        ao.userAnimal(new Animal() {
            @Override
            public void eat() {
                System.out.println("我是老虎,喜歡喫肉");
            }
        });

        ao.userAnimal(new Animal() {
            @Override
            public void eat() {
                System.out.println("我是萊恩,放大專喫人");
            }
        });
    }
}

### 常用api:(知道每個類是幹什麼用的,會查api文檔即可)
- Math:跟數學運算相關的對象
            `public static double ceil​(double a):向上取整`
           ` public static double floor​(double a):向下取整
`
- System:
            `static long	currentTimeMillis​() :獲取系統當前時間的毫秒值。`
            毫秒值:比秒還小一級的時間單位,1秒=1000毫秒。這裏獲取的毫秒值是距離1970年1月1日0點0分0秒0的值

- Object:所有的類的父類(超類、基類)。所有類都直接或者間接繼承了Object類:
            `String	toString​():返回對象的字符串表示形式`
所有對象都可以調用toString方法,如果該類重寫了toString方法(Alt+Insert/ins生成),那麼返回的結果就是成員變量的內容。如果沒有重寫toString方法,那麼返回的是該對象的地址值。

 ps:System.out.println(對象名);實際上會調用對象的toString方法。

` boolean	equals​(Object obj):指示一些其他對象是否等於此。`
        
所有對象都可以調用equals方法,如果該類沒有重寫equals方法,那麼比較的是對象的地址值。如果需要比較對象的內容,那麼就需要重寫
該方法(Alt+Insert/ins生成)。
ps:String類就重寫了equals方法,所以比較字符串的時候使用的是equals方法而不是==比較。

例如:
   
```java
public 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) {
        if (this == o) return true;
        //if (o == null || getClass() != o.getClass()) return false;

        if (o == null || !(o instanceof Student)) return false;

        Student student = (Student) o;

        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 stu1 = new Student("ldl", 26);

        Student stu2 = new Student("ldl", 26);

        boolean result = stu1.equals(stu2);
        System.out.println("result = " + result); // true


    }
}
  • Arrays:該類包含用於操作數組的各種方法(如排序和搜索)
    static void sort​(int[] a):排序方法,從小到大排序

static String toString​(任意類型數組):將數組中的內容以字符串的形式輸出,如果數組是對象類型的數組,那麼會調用每個對象的toString方法

  • 類似於Math、Arrays類,它們不需要創建對象,方法都是靜態方法,這種類我們可以把它稱作工具類。
    1、構造方法都被private修飾
    2、方法都是public static修飾的。
    3、有的工具類還會被final修飾,不能被繼承。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章