JAVA_SE基礎——52.匿名內部類

電信的電箱燒了,害我斷了2天網,真拿命,耽誤了發火html


Java匿名內部類的總結:java

沒有名字的內部類。就是內部類的簡化形式。通常只用一次就能夠用這種形式。匿名內部類其實就是一個匿名子類對象。想要定義匿名內部類:須要前提,內部類必須繼承一個類或者實現接口。this


實例1:不使用匿名內部類來實現抽象方法

package day10;

abstract class Fu {
    public abstract void run();
}
 
class Zi extends Fu {
    public void run() {
        System.out.println("run....");
    }
}
 
public class AnonymousClass01 {
    public static void main(String[] args) {
        Zi p = new Zi();
        p.run();
    }
}
運行結果:
run....

能夠看到,咱們用Zi類繼承了Fu類,而後實現了Zi的一個實例,若是此處的Zi類只使用一次,那麼將其編寫爲獨立的一個類豈不是很麻煩?
這個時候就引入了匿名內部類




實例2:匿名內部類的基本實現
package day10;

abstract class Fu {
    public abstract void run();
}
 
public class AnonymousClass01 {
    public static void main(String[] args) {
      new Fu(){
    	  public void run(){
    		  System.out.println("run....");
    	  }
      }.run();
    }
}
運行結果:
run....

能夠看到咱們直接將抽象類Fu中的方法在大括號中實現了
這樣能夠省略一個類的書寫
而且,匿名內部類還能夠應用在接口上


實例3:在接口上使用匿名內部類
package day10;

interface Fu {
    public abstract void run();
}
 
public class AnonymousClass01 {
    public static void main(String[] args) {
      new Fu(){
    	  public void run(){
    		  System.out.println("run....");
    	  }
      }.run();
    }
}
運行結果:
run....

由上面的例子能夠看出,只要一個類是抽象的或是一個接口,那麼其子類中的方法均可以使用匿名內部類來實現


實例4:調用匿名內部類中的2個方法(2種方法)
方法一:
<span style="font-size:18px;">package day10;

interface Fu {
    public abstract void run();
    public abstract void sleep();
}
 
public class AnonymousClass01 {
    public static void main(String[] args) {
     Fu x = new Fu(){
    	  public void run(){
    		  System.out.println("run....");
    	  }
    	  public void sleep(){
    		  System.out.println("sleep....");
    	  }
		
      };
      x.run();
      x.sleep();
    }
}</span>
運行結果:
run....
sleep....

引用指向對象 分別調用run()和sleep()方法!


方法二:
package day10;

interface Fu {
    public abstract Fu run();
    public abstract void sleep();
}
 
public class AnonymousClass01 {
    

	public static void main(String[] args) {
     new Fu(){
    	  public Fu run(){
    		  System.out.println("run....");	  
    		  return this;
    	  }
    	  public void sleep(){
    		  System.out.println("sleep....");
    	  }
		
      }.run().sleep();
      
    }
}
運行結果:
run....
sleep....

run()方法執行完畢後 返回Fu類對象   讓匿名對象最後面的.run() 變成對象 而後再.sleep()      就是Fu.sleep()的意思。
上面的兩種方法 在繼承狀態下一樣能夠使用
相關文章
相關標籤/搜索