马士兵java架构师

您现在的位置是:java学习笔记 >

java学习笔记

java匿名内部类是否有父类

2023-11-11 18:13:04java学习笔记 本文浏览次数:1 百度已收录

本 文 目 录

匿名内部类是可以有父类的,它可以继承一个父类或实现一个接口。

一. 匿名内部类的定义与特点

  • 匿名内部类是一种没有显式命名的类,它直接定义在另一个类或方法的内部。
  • 它通常是用来简化代码,特别是一次性使用的类。
class Animals {  
    public void eat() {  
        System.out.println("动物都要吃东西");  
    }  
}  

public class Demo {  
    public static void main(String[] args) {  
        // 10~14行用匿名内部类重写一种方法  
        new Animals() {  
            public void eat() {  
                System.out.println("我是匿名内部类");  
            }  
        }.eat();  

        // 从17~25行用一个普通类继承来重写一种方法  
        class Dog extends Animals {  
            public void eat() {  
                System.out.println("狗要吃肉");  
            }  
        }  
        Dog d = new Dog();  
        d.eat();  
    }  
}
输出的结果为:

我是匿名内部类  
狗要吃肉

这是因为在代码中,我们首先创建了一个匿名内部类并调用了它的eat方法,这个方法打印出“我是匿名内部类”。接着,我们创建了一个Dog对象并调用了它的eat方法,这个方法打印出“狗要吃肉”。

二. 匿名内部类与父类的关系

  • 1、匿名内部类与普通的类一样,它可以继承一个父类。当创建一个匿名内部类时,它是隐式地继承了一个父类。
  • 2、如果匿名内部类实现了某个接口,那么它同时也继承了该接口的默认方法(如果有的话)。

三. 匿名内部类的代码

案例1: 匿名内部类继承一个父类:

public class OuterClass {

    public class BaseClass {
        public void sayHello() {
            System.out.println("Hello from BaseClass!");
        }
    }

    public void test() {
        // 匿名内部类继承BaseClass
        BaseClass anonymous = new BaseClass() {
            @Override
            public void sayHello() {
                System.out.println("Hello from Anonymous Class!");
            }
        };

        anonymous.sayHello();  // 输出: Hello from Anonymous Class!
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.test();
    }
}
代码解释:Java代码定义了一个外部类`OuterClass`,一个内部类`BaseClass`,以及一个匿名内部类,它继承自`BaseClass`并重写了`sayHello`方法。
当你运行这段代码,它将会执行`main`方法,`main`方法又调用了`test`方法。在`test`方法中,创建了一个继承自`BaseClass`的匿名内部类的实例,并调用了这个实例的`sayHello`方法。

所以,这段代码的输出结果为:

Hello from Anonymous Class!

这个结果是因为匿名内部类重写了BaseClasssayHello方法,所以当你调用anonymous.sayHello()时,它会输出"Hello from Anonymous Class!"而不是"Hello from BaseClass!"。

案例2: 匿名内部类实现接口:

public class OuterClass {

    public interface Greeter {
        void sayHello();
    }

    public void test() {
        // 匿名内部类实现Greeter接口
        Greeter anonymous = new Greeter() {
            @Override
            public void sayHello() {
                System.out.println("Hello from Anonymous Class implementing Greeter!");
            }
        };

        anonymous.sayHello();  // 输出: Hello from Anonymous Class implementing Greeter!
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.test();
    }
}

该代码的输出结果为:

Hello from Anonymous Class implementing Greeter!

这是因为匿名内部类实现了Greeter接口,并重写了sayHello方法,所以调用anonymous.sayHello()时输出的是"Hello from Anonymous Class implementing Greeter!"。

通过这两个案例,我们可以看到匿名内部类是可以有父类的,它可以继承一个父类或实现一个接口。