匿名内部类:
没有类名的类。
匿名内部类一般是用于实参传递。
匿名内部类的好处:
- 用于实参传递简化书写。
匿名内部类的使用前提:
必须存在继承或者实现的关系才能使用。
当匿名内部类中存在特有方法的时候,就不能使用匿名内部类了,只能使用局部内部类。
继承关系下的匿名内部类:
- 注意:当存在特有方法时,就不能使用匿名内部类了,只能使用局部内部类。
/*
继承关系下的匿名内部类:
*/
abstract class Animal{
public abstract Animal run();
public abstract void sleep();
}
class Outer{
public void print(){
//需求: 在方法内部定义一个类继承Animal类,然后调用run方法与sleep()。
/*
//局部内部类
class Dog extends Animal{
public void run(){
System.out.println("狗在跑..");
}
public void sleep(){
System.out.println("狗趴在睁开眼睛睡..");
}
}
//创建对象
Dog d = new Dog();
d.run();
d.sleep();
*/
//匿名内部类 :匿名内部类只是没有类名,其他的一概成员都是具备的。
// 匿名内部类与Animal是继承 的关系。 目前是创建Animal子类的对象.
Animal a = new Animal(){ //注意:变量a ,类型Animal。多态的体现。
//匿名内部的成员
public Animal run(){
System.out.println("狗在跑..");
return this;//返回当前对象
}
public void sleep(){
System.out.println("狗趴在睁开眼睛睡..");
}
// //注意:当存在特有方法的时候!就不能使用匿名内部类了因
//为没有类名无法进行类型转换。
//特有的方法
// public void bite(){
// System.out.println("狗在咬人..");
// }
};
a.run();
a.sleep();
}
}
class Demo6
{
public static void main(String[] args)
{
//System.out.println("Hello World!");
Outer outer = new Outer();
outer.print();
}
}
实现关系下的匿名内部类:
//实现关系下匿名内部类
interface Dao{
public void add();
}
class Outer{
public void print(){
//创建一个匿名内部类的对象
new Dao(){ //不是接口不能创建对象吗?怎么现在又可以了?
//因为:创建的是接口实现类的对象,这个实现类是匿名的内部类对象(只是借用了接口的名字)。
public void add(){
System.out.println("添加成功");
}
}.add();
}
}
class Demo7
{
public static void main(String[] args)
{
test(new Dao(){
public void add(){
System.out.println("添加员工成功");
}
});
}
/*
* 匿名内部类一般是用于实参。
*/
//调用这个方法...
public static void test(Dao d){ //形参类型是一个接口引用..只能传接口的实现类进来
d.add();
}
}