匿名内部类
● 匿名内部类,就是没有名字的一种嵌套类。一种内部类的简化写法。它的本质是 带具体实现的父类或者父接口的匿名的子类对象。
● 如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那我们没有必要单独为其创建一个类来实现,而造成资源空间的浪费。
● 匿名内部类的前提必须是类和接口
● 格式
new 类名/接口名(){
重写抽象方法
}
●匿名内部类性质
● 可以直接访问外部类的所有成员,包含私有的
● 不能添加访问修饰符,因为它的地位就是一个局部变量
● 作用域:仅仅在定义它的方法或代码块中
● 匿名内部类–访问–>外部类成员
● 外部其它类—不能访问—>匿名内部类(匿名内部类的地位是一个局部变量)
● 如果外部类和匿名内部类的成员重名时,默认遵循就近原则,如果想访问外部类地位成员,可以使用(外部类名.this.成员)去访问
匿名内部类的三种实现方法
- 不用特地写一个类或者方法去实现接口中的方法,在实例化时实现接口中的方法。
这样必须在创建实例对象时实现接口中方法。因为接口的实现方法默 认为抽象方法,实现类必须重写接口中所有的抽象方法
interface Cal{
int add(int a,int b);
}
public class test1 {
public static void main(String[] args) {
Cal c1=new Cal() {
@Override
public int add(int a, int b) {
return a+b;
}
};
int c=c1.add(1,2);
System.out.println(c);
}
}
- 当接口作为参数放在方法体里的时候,用new接口()的方式来实例独享,匿名内部类必须实现这个方法。
在方法体内部定义实现接口方法的方法来传入接口实现接口中的方法。
interface Cal{
int add(int a,int b);
}
public class test1 {
public static void main(String[] args) {
System.out.println(Caladd(new Cal() {
public int add(int a,int b) {
return a+b;
}
}));
}
public static int Caladd(Cal a) {
return a.add(1, 2);
}
}
直接另外创建一个类,在类中定义接口方法的方法,在主类中传入接口实现接口的方法。
该方法只用扩展思路,同样创建了一个额外的类用来实现匿名内部类,造成存储空间浪费,不提倡使用。
interface Cal{
int add(int a,int b);
}
class Program{
public int Caladd(Cal a) {
return a.add(1, 2);
}
}
public class test1 {
public static void main(String[] args) {
Program p=new Program();
System.out.println(p.Caladd(new Cal() {
public int add(int a,int b) {
return a+b;
}
}));
}
}
- 也可以用启动线程的方式实现匿名内部类。
interface Cal{
int add(int a,int b);
}
public class test1 {
public static void main(String[] args) {
System.out.println(
new Cal() {
public int add(int a,int b) {
return a+b;
}
}.add(1, 2));
}
}