1,匿名内部类
(1) 就是内部类的简化写法
(2) 前提
存在一个类或者接口,并且有方法重写(这里的类可以是具体的类也可以是抽象类)
(3) 格式
new 类名或者接口名(){方法重写};
(4)本质:是一个继承了类或者实现了接口的子类匿名对象
2,如何调用匿名内部类的成员方法呢
(1) 法一:每一种格式调用一个
(2) 法二:用类或者接口接受该子类的对象。多肽思想
3,匿名内部类在开发过程中的使用场景合与只使用一次的场景,用完就销毁了,不像具名类一样长期存在。多使用于安卓方面,因为手机内存小,运行速度较快,用完就销毁,不占内存,速度也快
例如:
public abstract class Animal {
//成员变量
private String name;
private String color;
private int age;
//抽象类中可以存在构造方法
public Animal(String name, String color, int age) {
this.name = name;
this.color = color;
this.age = age;
}
public Animal() {
}
//成员方法
public abstract void eat();
public abstract void sleep();
//非抽象方法
public Animal show(){
return this;
}
}
++++++++++++++++++++++++++++++++++++++++++++++
public interface ITraining {
void iump();
}
++++++++++++++++++++++++++++++++++++++++++++++
public class AnimalDemo {
public static void main(String[] args){
//定义一个匿名的,并且是main()内部的类,所以叫匿名内部类
//调用匿名内部类的成员方法一,每种格式调用一个
new Animal(){
@Override
public void eat() {
}
@Override
public void sleep() {
}
}.eat();
new Animal(){
@Override
public void eat() {
}
@Override
public void sleep() {
}
}.sleep();
System.out.println("================");
//调用匿名内部类的成员方法二,用类或者接口接收该子类对象,多态思想
// 父类的引用指向了子类对象 多态
Animal animal=new Animal(){
@Override
public void eat() {
}
@Override
public void sleep() {
}
};
animal.sleep();
animal.eat();
System.out.println("================");
//匿名内部类的使用场景合与只使用一次的场景,用完就销毁了,不像具名类一样长期存在。
//使用与安卓方面,因为手机内存小,运行速度较快,用完就销毁,不占内存,速度也快
method3(new ITraining() {
@Override
public void iump() {
System.out.println("匿名的接口中的jump()");
}
});
}
public static void method3(ITraining it){
it.iump();
}
}
4,匿名内部类的面试题
/**
- 要求控制台输出 Hello World
*/
interface Inter {
void show();
}
class OuterOne{
//补全代码
public static Inter method(){
return new Inter(){
@Override
public void show() {
}
};
}
}
class OuterDemo{
public static void main(String[] args){
OuterOne.method().show();
}
}