搜索
写经验 领红包

比较抽象类和接口的异同(java抽象类和接口的区别是什么)

导语:Java:比较抽象类与接口的异同

一.抽象类(一)概念

在继承的层次结构中,每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追溯,类就会变得更通用、更加不明确。类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类(abstract class)。在类的头部使用 abstract 修饰符表示该类为抽象类。

(二)抽象类和抽象方法

同样用 abstract 声明抽象方法。抽象方法(abstract method)只定义成员方法的接口形式,而没有具体操作。只有派生类对抽象成员方法的重定义才能真正实现与该派生类相关的操作。在各子类继承了父类的抽象方法之后,再分别用不同的语句和方法体来重新定义它,形成若干个名字相同、返回值相同、参数列表相同、目的一致但是具体实现有一定差别的方法。抽象类中定义抽象方法的目的是实现一个接口,即所有的子类对外都呈现一个相同名字的方法。

1.一个包含抽象方法的类必须声明为抽象类

几点说明:

抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类。即使子类的父类是具体的,这个子类也可以是抽象的。当父类的方法实现在子类中变得无效时,子类可以重写父类的方法并将它定义为抽象的。

2.抽象方法只有定义而没有实现,它的实现由子类提供

下面定义了一个抽象类Object类:

public abstract class Object {

public abstract double getArea();

public abstract double getPerimeter();

}

Object类是多个子类的父类,由于在多个子类中都要用到getArea()方法和getPermeter()方法,所以在父类中定义比较好;由于计算面积和周长的getArea()方法和getPermeter()方法在不同子类里的实现方式不同,所以Object类中定义的这两个方法的实现只能由子类提供。

3.抽象类无法被直接实例化,可以让子类继承然后实例化子类

通过一个例子来说明:

public abstract class Person {

//定义一个抽象方法

public abstract void isSmoke();

}

//学生类

class Students extends Person{

//继承抽象类后抽象类中的抽象方法必须在子类中实现

public void isSmoke() {

System.out.print(&39;t smoke.&34;Teachers can smoke.&34;吸烟有害健康&34;Students can&34;);

}

public static void main(String[] args) {

Student h=new Student();

h.isSmoke();

System.out.println(txt);

}

}

3.接口的继承

子接口可以对父接口的方法和常量进行重写。例如:

// 接口 Student 继承 Human

public interface Student extends Human {

// 重写父接口中的txt

String txt = &34;;

// 重写父接口中的isSmoke()方法

void isSmoke();

}

注意: 在Java中,类的多继承是不合法的,但接口允许多继承。

public interface C extends A, B

三.比较抽象类与接口Q: 为什么有了抽象类还要接口?

看起来抽象类除了多继承以外,完全可以完成接口所作的事情,为什么还需要定义接口呢?

避免java单继承的局限避免多继承带来的复杂性和低效性面向接口编程带来的优势。降低程序间的耦合,易扩展,易维护Q: 如何确定在什么情况下应该使用接口,什么情况下应该使用类呢?

抽象类和接口都是用来指定多个对象的共同特征的。那么如何确定在什么情况下应该使用接口,什么情况下应该使用类呢?一般来说,清晰描述父子关系的强的“是......的一种”关系应该用类建模。弱的“是..的一种”关系也称为类属关系,它表明对象拥有某种属性,可以用接口来建模。

本文内容由小德整理编辑!