Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分别拥有抽象类和接口的必要性是什么?_Java_Oop_Interface - Fatal编程技术网

Java 分别拥有抽象类和接口的必要性是什么?

Java 分别拥有抽象类和接口的必要性是什么?,java,oop,interface,Java,Oop,Interface,我对Java8的默认方法特性和接口有疑问。 意味着使用Java8,您可以为接口中的方法提供默认实现,这样实现类就不再需要重写该方法 现在接口也可以包含抽象方法以及与抽象类相同的具体方法。两者的行为方式相同。 讨论接口和抽象方法之间的区别可以确定如下- 1.一个类可以实现多个接口,但只能扩展一个类。 2.所有接口字段都是公共静态final,而对于抽象类,您可以控制字段和方法的访问修饰符 我的疑问是,究竟区别在哪里,我们应该选择抽象类还是接口? 将抽象类和接口分开的实际目的是什么?接口是完全抽象的类

我对Java8的默认方法特性和接口有疑问。 意味着使用Java8,您可以为接口中的方法提供默认实现,这样实现类就不再需要重写该方法

现在接口也可以包含抽象方法以及与抽象类相同的具体方法。两者的行为方式相同。 讨论接口和抽象方法之间的区别可以确定如下- 1.一个类可以实现多个接口,但只能扩展一个类。 2.所有接口字段都是公共静态final,而对于抽象类,您可以控制字段和方法的访问修饰符

我的疑问是,究竟区别在哪里,我们应该选择抽象类还是接口?
将抽象类和接口分开的实际目的是什么?

接口是完全抽象的类。Java需要两者。你可以在这里找到一些好信息。


你也可以看到这个问题

在Java8中,
抽象类
接口
之间的区别变得更加狭窄。但它们之间仍然存在差异。 我将试图指出这些区别。如果我错过了什么,请告诉我

  • 您可以使用抽象类创建任何类型的封装(公共、私有或受保护)和状态(最终或非最终)的属性。但接口中的属性必须是公共的和最终的
  • 您只能扩展一个抽象类,但可以实现多个接口
  • 您可以在抽象类中创建构造函数,但不能在接口中创建
  • 您可以将状态与抽象类相关联,在这种抽象类中,接口是无状态情况下的首选接口 您可以在此主题上找到oracle文档

    接口的
    虚拟扩展方法
    /
    默认方法
    /
    Defender方法
    是这种细微差别的主要原因。因此,我将尝试描述在Java8中引入这些类型方法的必要性

    在Java8中引入了lambda。为了充分利用lambda收集框架的优势,已对其进行了更新<代码>forEach
    方法已添加到Iterable接口中。在不破坏实现的情况下更改接口是不可行的。默认方法用于在不破坏实现的情况下添加功能

    @FunctionalInterface
    public interface Iterable<T> {
        Iterator<T> iterator();
    
        default void forEach(Consumer<? super T> action) {
            Objects.requireNonNull(action);
            for (T t : this) {
                action.accept(t);
            }
        }
    }
    
    @functioninterface
    公共接口可移植{
    迭代器迭代器();
    
    默认void forEach(ConsumerIn short:抽象类可以有字段,接口不能。您不能在答案中发布链接。.在注释中发布!