面试:抽象类和接口

【基础】Java抽象类与接口的区别与使用场合_Amos-Chen的博客-CSDN博客

 Java 抽象类和接口,看这一篇就够了 - 沉默王二博客

抽象类与接口的区别

  • 最重要的区别是,接口的方法不可以有实现,并且是绝对的抽象方法。抽象类可以有实例方法用来实现默认行为。
  • 接口中的变量申明默认是final, 而抽象类中变量申明可以是非final。
  • 接口中的成员默认是public修饰,而抽象类中成员可以是private, protected等等。
  • 接口通过关键字implements被其他类实现,而抽象类则是通过extends关键字被其他类扩展.
  • 接口可以扩展(extends)另外一个/或多個接口,抽象类可以扩展(extends)另一个Java类并(或)实现(implements)多个Java接口.
  • Java类可以实现多个接口但是只能扩展一个抽象类.
  • 接口是绝对抽象而且无法实例化,抽象类也无法实例化但是如果类中有main()方法是可以被调用的。
  • 与抽象类相比,接口更慢,因为它需要额外的间接寻址。

何时用抽象类何时用接口

接口用来定义契约行为,也可作为两个系统间的契约进行交互。

而抽象类主要用来为子类定义默认行为,也就是说所有的继承子类都需要运行相同的功能。

何时使用抽象类

抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。

包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法,抽象类和普通类的区别:

  • 抽象方法必须为 public 或者 protected(因为如果为 private,则不能被子类继承,子类便无法实现该方法),默认情况下默认为 public。
  • 抽象类不能用来创建对象;
  • 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为 abstract 类。

其他方面,抽象类和普通没有区别,一般抽象类用于继承中提高扩展性。

  • 如果我们使用继承概念,那么抽象类是个不错的选择。因为它为派生类提供了一个通用基类实现。
  • 如果想为组件的所有实现中提供公共的且已实现的功能,那么使用抽象类,它允许我们部分实现类。而接口不为任何成员提供任何实现。

接口

接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。

从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。

java8新特性 - 接口中可以定义默认实现方法和静态方法

Java8 之后 在接口中可以使用default和static关键字来修饰接口中定义的普通方法

public interface Interface {
    default  String getName(){
        return "zhangsan";
    }

    static String getName2(){
        return "zhangsan";
    }
}

Java8以后,抽象类和接口该怎么选?

Java8以后,抽象类和接口该怎么选?

扫描二维码关注公众号,回复: 14555937 查看本文章

抽象类在设计上的主要目标之一是复用,子类作为父类的子集,从而可以复用父类的某些逻辑,包括属性(或者说状态)和行为。个人觉得抽象类不是一个很必要的东东。只有当开发者特别在意代码质量与架构设计、希望尽量少地向下级用户暴露封装好的信息时,抽象类才能起到关键的作用。

单单从语法角度来看,java8以后,接口和抽象类越来越像了!但是当我们思考一个抽象方法该放在抽象类还是接口中时,那么只要简单判断这个抽象方法是否会被子类用多态来调用,就可以简单分类。牢记文章中的实例,不同的门,开门的方式是不同的,所以门应该设计为抽象类而不是接口!

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/128064708