?专栏【Java基础】
?喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。
?音乐分享【The truth that you leave】
大一同学小吉,欢迎并且感谢大家指出我的问题?
目录
?什么是匿名内部类
?为什么要使用匿名内部类
?详细解释
?️?不使用匿名内部类
?️?使用匿名内部类
?书写匿名内部类的格式
?方法一
?方法二
?匿名内部类的应用例子
?题目1
?方法一
?方法二
?题目2
?什么是匿名内部类
匿名内部类是 Java 编程语言中一种特殊的类,它没有显式地定义类名,而是在创建对象时通过传递实现了某个接口或继承了某个类的代码块来定义类。通常,我们使用它来简化代码、减少类的数量和更高效地编写事件处理程序等。
?为什么要使用匿名内部类
在实际开发中,我们常常遇到这样的情况:一个接口/类的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类/子类去实现/重写。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码。
?详细解释
?️?不使用匿名内部类
比如下面的代码,定义了一个接口,接口里面有一个show方法
public interface Interface01 { void show();}
为了使用该接口的show方法,我们需要去创建一个实现类,同时书写show方法的具体实现方式
public class Interface01Impl implements Interface01{ @Override public void show() { System.out.println("奋斗5天,期末考试我要过Java"); }}
在上面的代码中,实现类Interface01全程只使用一次,为了这一次的使用要去创建一个类,未免太过麻烦。那么我们可以使用匿名内部类。
?️?使用匿名内部类
public static void main(String[] args) { Interface01 interface01 = new Interface01() { @Override public void show() { System.out.println("奋斗5天,期末考试我要过Java"); } }; //调用接口方法 interface01.show();}
?书写匿名内部类的格式
?方法一
这种方法和之前的多态基本上没有区别
new 接口/类名(参数1, 参数2...){ 实现方法1(){ } 实现方法2(){ } ......};
?方法二
new Thread(new Runnable() { @Override public void run() { System.out.println("奋斗5天,期末考试我要过Java"); }}).start();
?匿名内部类的应用例子
?题目1
在程序的show()方法里面定义Father类的匿名子类,重写Father类的method()方法,并在合适的位置调用method()方法
?方法一
abstract class Father { int num; public Father(int num) { this.num = num; } public abstract void method();}class Niming { public void show() { Father father = new Father(10) { // 定义 Father 类的匿名子类 @Override public void method() { // 重写 Father 类的 method() 方法 System.out.println("Father 类的匿名子类重写了 method() 方法"); System.out.println("num 的值为:" + num); } }; father.method(); // 在合适的位置调用 method() 方法 }}public class InnerClasssDemo5 { public static void main(String[] args) { Niming niming = new Niming(); niming.show(); }}
运行结果
Father 类的匿名子类重写了 method() 方法
num 的值为:10
?方法二
interface InterFace1 { int num = 100; void method();}class Niming2 { public void show() { InterFace1 interFace1 = new InterFace1() { // 定义实现了 InterFace1 接口的匿名内部类 @Override public void method() { // 重写 InterFace1 接口中的 method() 方法 System.out.println("InterFace1 接口的匿名内部类重写了 method() 方法"); System.out.println("num 的值为:" + num); } }; interFace1.method(); // 在合适的位置调用 method() 方法 }}public class InnerClassDemo6 { public static void main(String[] args) { Niming2 niming2 = new Niming2(); niming2.show(); }}
运行结果
InterFace1 接口的匿名内部类重写了 method() 方法
num 的值为:100
?题目2
在InnnerClassDemo7类的main()方法中使用PersonDemo类的pd对象调用method(Person p)方法,向person接口变量p传递一个匿名子类对象,重写Person接口的study()方法,
package cn.num07;interface Person { void study();}class PersonDemo { public void method(Person p) { p.study(); }}public class InnerClassDemo7 { public static void main(String[] args) { PersonDemo pd = new PersonDemo(); pd.method(new Person() { // 向 person 接口变量 p 传递一个匿名子类对象 @Override public void study() { // 重写 Person 接口的 study() 方法 System.out.println("我正在学习Java编程语言"); } }); }}
运行结果
我正在学习Java编程语言
?如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正?