Java类实现某个接口后,是否需要实现接口中的所有方法?

1.结论

    并不是所有的类实现接口后都必须实现接口的所有方法!

2.特殊情况

    当Java抽象类实现某个接口后没必要实现所有的方法。

3.注意点

    当Java普通类实现接口后必须实现接口中的所有方法。

4.原因

  • 为什么抽象类不需要实现所有方法?

         因为抽象类本身是具有抽象性的,它的方法也大多不需要进行实现,只需要声明,其他实现的过程多交给继承它的子类。而接口本身就更为抽象的一种形式,所以如果让一个本来抽象的类去实现一个更为抽象的接口的所有方法是没有必要的,除非对于抽象类本身而言需要接口的一些方法来完善自身。而没有实现的其他方法完全可以交给它的派生类去实现

  • 为什么普通类需要实现所有方法?

        普通类中的所有方法都需要有方法体,即使是空方法。当一个普通类实现了一个接口后就必须要实现其所有的方法,如果有任何一个方法没有实现,在类向接口向上转型的时候就会因为丢失数据(因为此时普通类中没有接口的完整数据)导致转型失败,这样显然是不允许的。

5.同时使用抽象类和接口有什么好处?

      如果一个普通类想要实现接口的某些方法,此时需要借助抽象类,可以让抽象类先实现接口中的部分方法,然后普通类通过继承抽象类后再去实现自己需要的接口中的方法。


  • 34
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要获取某个接口下所有的实现,可以使用反射机制来实现。以下是一个示例代码: ```java import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; public class InterfaceImplFinder { public static List<Class<?>> getImplementations(Class<?> interfaceClass) { List<Class<?>> implementations = new ArrayList<>(); // 获取当前ClassLoader加载的所有 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); try { Class<?>[] allClasses = getAllClasses(classLoader); // 遍历所有,找出实现了指定接口 for (Class<?> clazz : allClasses) { if (interfaceClass.isAssignableFrom(clazz) && !Modifier.isAbstract(clazz.getModifiers())) { implementations.add(clazz); } } } catch (Exception e) { e.printStackTrace(); } return implementations; } private static Class<?>[] getAllClasses(ClassLoader classLoader) throws Exception { // 获取ClassLoader加载器字段 Class<?> classLoaderClass = classLoader.getClass(); while (classLoaderClass != ClassLoader.class) { classLoaderClass = classLoaderClass.getSuperclass(); } java.lang.reflect.Field classesField = classLoaderClass.getDeclaredField("classes"); classesField.setAccessible(true); // 通过反射获取ClassLoader的所有 Vector<Class<?>> classes = (Vector<Class<?>>) classesField.get(classLoader); return classes.toArray(new Class[classes.size()]); } public static void main(String[] args) { List<Class<?>> implementations = getImplementations(Runnable.class); for (Class<?> clazz : implementations) { System.out.println(clazz.getName()); } } } ``` 在上面的示例代码,`getImplementations` 方法接受一个接口的 `Class` 对象作为参数,然后使用反射遍历所有,找出实现了该接口且非抽象的,并将它们添加到一个列表返回。你可以将你想要获取实现接口替换 `Runnable.class`,然后运行 `main` 方法查看结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值