【Java】匿名對象和內部類

匿名對象

匿名對象的概念

匿名對象是指創建對象時,只有創建對象的語句,卻沒有把對象地址值賦值給某個變量。
例如:存在一個Person類
創建一個普通對象

Person p = new Person();

創建一個匿名對象

new Person();

匿名對象的特點

  • 創建匿名對象直接使用,沒有變量名。
new Person().eat()  //eat方法被一個沒有名字的Person對象調用了。
  • 匿名對象在沒有指定其引用變量時,只能使用一次。
new Person().eat(); 創建一個匿名對象,調用eat方法
new Person().eat(); 想再次調用eat方法,重新創建了一個匿名對象
  • 匿名對象可以作爲方法接收的參數、方法返回值使用
class Demo {
    public static Person getPerson(){
        //普通方式
        //Person p = new Person();  
        //return p;

        //匿名對象作爲方法返回值
        return new Person(); 
    }

    public static void method(Person p){}
}

class Test {
    public static void main(String[] args) {
        //調用getPerson方法,得到一個Person對象
        Person person = Demo.getPerson();

        //調用method方法
        Demo.method(person);
        //匿名對象作爲方法接收的參數
        Demo.method(new Person());
    }
}

內部類

內部類概念

將類寫在其他類的內部,可以寫在其他類的成員位置和局部位置,這時寫在其他類內部的類就稱爲內部類。其他類也稱爲外部類。

什麼時候使用內部類呢?
在描述事物時,若一個事物內部還包含其他可能包含的事物,比如在描述汽車時,汽車中還包含這發動機,這時發動機就可以使用內部類來描述。

class 汽車 { //外部類
    class 發動機 { //內部類
}
}

內部類的分類:
內部類分爲成員內部類與局部內部類。
我們定義內部類時,就是一個正常定義類的過程,同樣包含各種修飾符、繼承與實現關係等。在內部類中可以直接訪問外部類的所有成員。

成員內部類

成員內部類,定義在外部類中的成員位置。與類中的成員變量相似,可通過外部類對象進行訪問
1、定義格式

class 外部類 { 
    修飾符 class 內部類 {
        //其他代碼
}
}

2、訪問方式

外部類名.內部類名 變量名 = new 外部類名().new 內部類名();

3、成員內部類代碼
定義成員內部類:

class Body {//外部類,身體
    private boolean life= true; //生命狀態
    public class Heart { //內部類,心臟
        public void jump() {
             System.out.println("心臟噗通噗通的跳")
             System.out.println("生命狀態" + life); //訪問外部類成員變量
        }
    }
}

訪問內部類:

public static void main(String[] args) {
    //創建內部類對象
    Body.Heart bh = new Body().new Heart();
    //調用內部類中的方法
    bh.jump();
}

關於成員內部類的同名調用

代碼:

//定義類
public class Outer{
    int i=1;
    class Inner{
        int i=2;
        public void inner(){
            int i=3;
            System.out.println(i);//打印 3
            System.out.println(this.i);//打印 2
            System.out.println(Outer.this.i);//打印 1
    }
   }
}
//測試類
public class Test{
    public static void main(String[] args){
        Outer.Inner in = new Outer().new Inner();
        in.inner();
    }
}

局部內部類

局部內部類,定義在外部類方法中的局部位置。與訪問方法中的局部變量相似,可通過調用方法進行訪問

  • 定義格式
class 外部類 { 
    修飾符 返回值類型 方法名(參數) {
    class 內部類 {
        //其他代碼
    }
  }
}
  • 訪問方式
在外部類方法中,創建內部類對象,進行訪問
  • 局部內部類代碼
    定義局部內部類
class Party {//外部類,聚會
    public void puffBall(){// 吹氣球方法
        class Ball {// 內部類,氣球
              public void puff(){
                 System.out.println("氣球膨脹了");
              }
        }
        //創建內部類對象,調用puff方法
        new Ball().puff();
    }
}

//訪問內部類
public static void main(String[] args) {
    //創建外部類對象
    Party p = new Party();
    //調用外部類中的puffBall方法
    p.puffBall();
}

內部類的實際使用-匿名內部類

匿名內部類概念

  1. 臨時定義某一指定類型的子類
  2. 定義後即刻創建剛剛定義的這個子類的對象

匿名內部類的作用和格式

作用:匿名內部類是創建某個類型子類對象的快捷方式。
格式:

new 父類或接口(){
    //進行方法重寫
};

代碼展示:

//已經存在的父類:
public abstract class Person{
    public abstract void eat();
}
//定義並創建該父類的子類對象,並用多態的方式賦值給父類引用變量
Person  p = new Person(){
    public void eat() {
        System.out.println(“我吃了”);
    }
};
//調用eat方法
p.eat();

使用匿名對象的方式,將定義子類與創建子類對象兩個步驟由一個格式一次完成。雖然是兩個步驟,但是兩個步驟是連在一起完成的。

匿名內部類如果不定義變量引用,則也是匿名對象,例如:

new Person(){
    public void eat() {
        System.out.println(“我吃了”);
}
}.eat();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章