匿名對象


匿名對象

顧名思義就是沒有名字的對象,這種對象創建直接new 就可以了,具體的實例如下:

l  Person

package cn.itcast.AnonymousObject;
 
public class Person {
   //定義一個方法,用於對象的調用
   public static void eat(){
      System.out.println("人會吃飯");
   }
}


l  測試類

package cn.itcast.AnonymousObject;
 
public class Test {
   public static void main(String[] args) {
      //創建有名對象
      Person p = new Person();
      p.eat();
      //創建匿名對象
      new Person().eat();
      //調用方法,作爲參數進行傳遞
      method(new Person());
      //調用method空參方法,用Person類型的參數進行接收
      Person p1 = method();
      p1.eat();
   }
   //對象創建寫進方法中,進行調用
   public static Person method(){
//    Person p = new Person();
//    return p;
      return new Person();
      
   }
   //匿名對象可以作爲參數進行傳遞
   public static void method(Person p){
      p.eat();
   }
}


匿名對象的特點:

1. 有名對象可以用引用變量隨時進行調用,而匿名對象只能調用一次,還想調用,繼續創建匿名對象進行調用,這樣做浪費資源,不建議多次調用時使用。

2. 匿名對象可以當做參數進行傳遞調用。

內部類

顧名思義就是類內部包含的類,就是內部類。一個事物內部還包含更深層次的事物,這個事物就是內部類,比如描述汽車類,它的內部還有發動機類,發動機類就是內部類。

內部類的定義格式:

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

         變量名.方法名();

外部類內部類成員調用規則:內部類調用外部類中的成員直接調用即可,外部類調用內部類中的成員需要創建外部類內部類的對象(如上內部類的創建格式)。

內部類的定義如下代碼演示:

package cn.itcast.NestedClass內部類;
//外部類
public class Outer {
   //定義一個成員變量
   private int a = 1;
   //內部類,定義在外部類的成員位置,可以加pubic private static
   class Inner{
      //定義一個方法
      public void show(){
         //內部類可以使用外部類中的成員
         System.out.println("內部類方法"+a);
      }
   }
}


l  測試類

package cn.itcast.NestedClass內部類;
 
public class Test {
   public static void main(String[] args) {
      //創建對象,調用內部類方法
      Outer.Inner n = new Outer().new Inner();
      n.show();
   }
}

運行結果:內部類.jpg                                              

內部類中同名成員變量的調用具體演示如下:

package cn.itcast.NestedClass內部類成員變量;
/*
 * 外部類、內部類成員變量的調用
 */
public class Outer {
   //外部類成員變量
   int i = 1;
   //內部類
   class Inner{
      //內部類成員變量
      int i = 2;
      public void show(){
         //局部變量
         int i = 3;
         //調用方法內局部變量
         System.out.println("方法內局部變量i的值:"+i);
         //調用內部類i的值
         System.out.println("內部類中i的值:"+this.i);
         //調用外部類中i的值
         System.out.println("外部類中i的值:"+Outer.this.i);
      }
   }
}


l  測試類

package cn.itcast.NestedClass內部類成員變量;
/*
 * 測試類
 */
public class Test {
   public static void main(String[] args) {
      //創建內部類的對象
      Outer.Inner in = new Outer().new Inner();
      in.show();
   }
}

運行結果:內部類中成員變量的調用.jpg

局部內部類:定義在外部類方法中的內部類,具體代碼演示如下:

package cn.itcast.NestedClass局部內部類;
 
public class Outer {
   //外部類的方法
   public void out(){
      //局部內部類,定義在外部類方法中成員位置的內部類
      class Inner{
         //內部類中的方法
         public void inner(){
            System.out.println("內部類中的方法");
         }
      }
         //創建內部類的對象
         Inner in = new Inner();
         in.inner();
   }
}


l  測試類

package cn.itcast.NestedClass局部內部類;
 
public class Test {
   public static void main(String[] args) {
      //創建外部類對象。調用內部類方法
      Outer o = new Outer();
      o.out();
   }
}


運行結果:局部內部類.jpg

注意:局部內部類中的方法調用需要在外部類的方法中創建內部類的對象,然後再在主方法中創建外部類的對象才能調用局部內部類中的方法。

匿名內部類:就是將實現接口的實現類,重寫接口方法,創建實現類的對象,調用實現類的方法這些步驟簡化。

定義匿名內部類的格式:

new 接口類的類名(){

         重寫後的方法

}.方法名();

具體的代碼演示如下:

package cn.itcast.NestedClass匿名內部類;
 
//接口類
public interface Inner {
   public abstract void smoking();
}
/*
   實現接口的實現類
   public class Inter implements Inner{
      //重寫抽象方法
      public void smoking(){
      
      }
   }
   //創建實現類的對象
   Inner x = new Inner();
   x.smoking();
   Inner i = new Inter();
   i.smoking();
 */


l  測試類

package cn.itcast.NestedClass匿名內部類;
 
public class Test {
   public static void main(String[] args) {
      //匿名內部類:將定義實現類,重寫抽象方法,創建實現類的對象進行簡化
      new Inner(){
         public void smoking(){
            System.out.println("人在抽菸");
         }
      }.smoking();
   }
}


代碼演示二:

package cn.itcast.NestedClass匿名內部類;
//抽象類
public abstract class Animal {
   public abstract void show();
   public abstract void sleep();
}


l  測試類

package cn.itcast.NestedClass匿名內部類;
 
public class Test2 {
   public static void main(String[] args) {
      //創建匿名內部類,這種方法只能調用一次方法,不能同時調用兩次方法
      /*new Animal(){
         //重寫抽象方法
         public void show(){
            System.out.println("吃飯");
         }
         public void sleep(){
            System.out.println("睡覺");
         }
      }.show();*/
      Animal a = new Animal(){
         //重寫抽象方法
         public void show(){
            System.out.println("吃飯");
         }
         public void sleep(){
            System.out.println("睡覺");
         }
      };
      a.show();
      a.sleep();
   }
}


 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章