对 Java 的匿名内部类理解
Posted miantiao312
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对 Java 的匿名内部类理解相关的知识,希望对你有一定的参考价值。
对 Java 的匿名内部类理解
JAVA面向对象三大特性:封装、继承、多态。
多态:可以理解为大千世界中的对象在不同的环境下可能会有多种形态。
Java中多态存在的前提:必须存在继承、父类的引用指向子类的对象。
匿名内部类:就是没有名字的内部类,所以匿名内部类只能使用一次。
通常使用匿名内部类来简化代码编写,但使用匿名内部类有个前提条件:必须继承一个父类或实现一个接口。
案例1:不使用匿名内部类来实现抽象方法
/**
* @ Author: LightningLi
* @ Date: 18/12/23 10:04
* @ Description: 不使用匿名内部类来实现抽象方法
*/
public class Demo {
public static void main(String[] args) {
Person p=new Child();
p.eat();
}
}
abstract class Person{
public abstract void eat();
}
class Child extends Person{
@Override
public void eat() {
System.out.println("吃东西");
}
}
运行结果:吃东西。
可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用,而Child类就是我们在匿名内部类中隐藏的类;如果此处的Child类只使用一次,而将其编写为独立的一个类岂不是很麻烦?
当然我们可以使用匿名内部类解决。
案例2:匿名内部类的基本实现
/**
* @ Author: LightningLi
* @ Date: 18/12/23 10:54
* @ Description: 匿名内部类的基本实现
*/
public class Demo2 {
public static void main(String[] args) {
People people=new People() {
@Override
public void play() {
System.out.println("玩耍耍");
}
};
people.play();
}
}
abstract class People{
public abstract void play();
}
运行结果:玩耍耍。
可以看到,我们直接将抽象类Person中的方法在大括号中实现了,这样便可以省略一个类的书写。匿名内部类还能用于接口上。
案例3:在接口上使用匿名内部类
/**
* @ Author: LightningLi
* @ Date: 18/12/23 11:01
* @ Description:在接口上使用匿名内部类
*/
public class Demo3 {
public static void main(String[] args) {
Man m=new Man() {
@Override
public void sleep() {
System.out.println("睡觉觉");
}
};
m.sleep();
}
}
interface Man{
public void sleep();
}
运行结果:睡觉觉。
由上面的例子可以得出结论,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现。
最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。
案例4:Thread类的匿名内部类实现
/**
* @ Author: LightningLi
* @ Date: 18/12/23 11:06
* @ Description:Thread类的匿名内部类实现
*/
public class Demo4 {
public static void main(String[] args) {
Thread t=new Thread(){
public void run(){
for (int i=0;i<=5;i++){
System.out.print(i);
}
}
};
t.start();
}
}
案例5:Runnable接口的匿名内部类实现
/**
* @ Author: LightningLi
* @ Date: 18/12/23 11:09
* @ Description:Runnable接口的匿名内部类实现
*/
public class Demo5 {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
Thread t = new Thread(r);
t.start();
}
}
可以参考这篇文章有关于匿名内部类中多态的理解:http://blog.csdn.net/zahngjialiang/article/details/68946631
以上是关于对 Java 的匿名内部类理解的主要内容,如果未能解决你的问题,请参考以下文章