匿名對象
阿新 • • 發佈:2018-01-19
method 傳遞 graph ace 在外 nts tro nim height
匿名對象
顧名思義就是沒有名字的對象,這種對象創建直接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(); } }
運行結果:
內部類中同名成員變量的調用具體演示如下:
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(); } }
運行結果:
局部內部類:定義在外部類方法中的內部類,具體代碼演示如下:
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(); } }
運行結果:
註意:局部內部類中的方法調用需要在外部類的方法中創建內部類的對象,然後再在主方法中創建外部類的對象才能調用局部內部類中的方法。
匿名內部類:就是將實現接口的實現類,重寫接口方法,創建實現類的對象,調用實現類的方法這些步驟簡化。
定義匿名內部類的格式:
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(); } }
匿名對象