匿名内部类和内部类
1.匿名内部类定义格式:new 类名/接口/抽象类(){\n
//继承的方法\n
}
代码实例
第一种:“继承”父类
public class Anonymous {
public static void main(String[] args) {
/*
匿名类是一个表达式,匿名类的语法就类似于调用一个类的构建函数
new Animals(),除些之外,还包含了一个代码块,在代码块中完成类的定义
*/
Animals a = new Animals(){
public void eat(){
System.out.println("匿名内部类");
}
};
a.eat();//调用匿名内部类的方法
}
}
abstract class Animals{
public abstract void eat();
}
输出结果就是:匿名内部类
作用:可以节约一个类代码的定义(也就是直接把子类的代码放入父类中了)
第二种:接口“继承”
同理,接口也可以继承:
interface Animals{
public void eat();
}
把刚刚的Animal类注掉,新建一个接口Animals,匿名内部类内容和上面的一致,完整代码如下:
// Animals.java
public interface Animals {
public void eat();
}
// Anonymous.java
public class Anonymous {
public static void main(String[] args) {
/*
匿名类是一个表达式,匿名类的语法就类似于调用一个类的构建函数
new Animals(),除些之外,还包含了一个代码块,在代码块中完成类的定义
*/
Animals a = new Animals(){
public void eat(){
System.out.println("匿名内部类");
}
};
a.eat();//调用匿名内部类的方法
}
}
本部分引用:https://www.cnblogs.com/dabuliu/p/14457793.html
2.使用注意点
2.1 匿名内部类只能使用一次
2.2 匿名内部类要继承类或实现接口,但二者不可兼得,具体实现形式已在 1 中指出
2.3 匿名内部类不能定义构造函数,因为没命名
2.4 匿名内部类不能有静态变量和方法
2.5 匿名内部类不能是抽象的,因为他自己本身就是用于实现抽象类或接口的
2.6 匿名内部类引用外部类的变量时只能引用类变量、实例变量和final修饰的局部变量
3.作用:简化代码编写
4.应用场景:不想多定义一个类来继承或实现抽象类或接口,且该实现类或子类只使用一次时,可使用匿名内部类来实现