1-匿名内部类入门
0
Word Count: 1.8k(words)
Read Count: 8(minutes)
匿名内部类
综合性强:1继承 2 多态 3 动态绑定 4内部类
what?
- 本质还是类
- 属于内部类
- 该类没有名字
- ==同时还是一个对象== —-> 在创建过程中使用了 new xxx()。类似创建对象的方法
位置:外部类的==局部位置==,比如方法中。
why?
一个需求:
//1.如果想使用 IA 接口。
2.传统方式 :创建一个 class 实现这个接口,然后再创建对象。
3.使用匿名内部类 直接 IA ia = new IA(){
} 就完成了一个 实现了接口的类的对象实例。
老韩的需求是 Tiger/Dog 类只是使用一次,后面不再使用。
–>.使用匿名内部类来简化 开发
How?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| new 类或接口(参数列表){ 类体。 }
package com.hspedu.innerclass;
public class AnonymousInnerClass { public static void main(String[] args) { Outer04 outer04 = new Outer04(); outer04.method(); } } class Outer04 { private int n1 = 10; public void method() {
演示基于接口的匿名内部类。 IA tiger = new IA() { @Override public void cry() { System.out.println("老虎叫唤..."); } }; System.out.println("tiger 的运行类型=" + tiger.getClass()); tiger.cry(); tiger.cry(); tiger.cry();
演示基于类的匿名内部类
Father father = new Father("jack"){ @Override public void test() { System.out.println("匿名内部类重写了 test 方法"); } }; System.out.println("father 对象的运行类型=" + father.getClass()); father.test(); 基于抽象类的匿名内部类 Animal animal = new Animal(){ @Override void eat() { System.out.println("小狗吃骨头..."); } }; animal.eat(); } } interface IA { public void cry(); }
class Father { public Father(String name) { System.out.println("接收到 name=" + name); } public void test() { } } abstract class Animal { abstract void eat(); }
|
一、接口的匿名内部类使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class AnnoymouslnnerClass { public static void main(String[] args) { tiger tiger = new tiger(); tiger.cry();
IA tigger=new IA() { @Override public void cry() { System.out.println("tigger"); } }; tigger.cry(); System.out.println("tigger的运行类型"+tigger.getClass()); } }
|
二、类的匿名内部类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| 基于类的匿名内部类
Father father = new Father("hello") { @Override public void test() { System.out.println("匿名内部类重写了 test 方法"); };
基于抽闲类的匿名内部类 Animal animal = new Animal() { @Override void eat() {
} };
abstract class Animal{ abstract void eat(); }
|
二、匿名内部类的细节。
- 匿名内部类是一个对象。—> 创建的过程中也有 new xx的操作。
- 创建的内部类 为 ==extend 了该类的 一个子类==。
- 使用的过程中遵循多态的特点。
可以访问外部类的所有成员。包括私有的
不能==添加访问修饰符==,它的堤围就是一个局部变量。
作用域:仅仅在定义它的方法或代码块中,且只能使用一次。—> 即 new 的那个操作。
如果外部内的成员和匿名内部类的成员重名时,匿名内部类遵循==就近原则==,如果想访问外部类的成员,则可以使用==(外部类名.this.成员)==
外部类名.this 就是调用 ==匿名内部类所在方法==的 对象。
三、案例
1)接口参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| 做实参直接传递,简洁高效。 InnerClassExercise01.java package com.hspedu.innerclass; import com.hspedu.abstract_.AA; public class InnerClassExercise01 { public static void main(String[] args) {
f1(new IL() { @Override public void show() { System.out.println("这是一副名画~~..."); } });
f1(new Picture()); }
public static void f1(IL il) { il.show(); } }
interface IL { void show(); }
类->实现 IL => 编程领域 (硬编码) class Picture implements IL { @Override public void show() { System.out.println("这是一副名画 XX..."); } }
|
2)类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| package com.hspedu.innerclass; public class InnerClassExercise02 { public static void main(String[] args) {
CellPhone cellPhone = new CellPhone();
cellPhone.alarmClock(new Bell() { @Override public void ring() { System.out.println("懒猪起床了"); } }); cellPhone.alarmClock(new Bell() { @Override public void ring() { System.out.println("小伙伴上课了"); } }); } } interface Bell{ void ring(); } class CellPhone{ public void alarmClock(Bell bell){ System.out.println(bell.getClass()); bell.ring(); } }
|