abstract class 和 interface 有什么区别

发布时间 2023-11-15 10:49:55作者: 芊嵛

abstract class 和 interface 有什么区别

1.抽象类

抽象类:声明方法的存在而不实现的类,如果一个类中没有包含足够的信息来描绘一个具体的对象,它只能被继承,派生出子类,这样的父类就是抽象类。

1.1抽象类的格式

[public] abstract class 类名 [extends父类] [implements接口列表]
{
    //属性声明及初始化;
    //抽象方法的声明;
    //非抽象方法声明及方法体;
}

1.2抽象类注意事项

1.修饰抽象类的修饰符有public和默认修饰符两种;

2.抽象类中可以有抽象方法,也可以有非抽象的方法;

3.抽象方法是无方法体的方法。

4.定义抽象类时,要在关键字class的前面添加abstract。

5.抽象类不能被实例化;

6.其包含的抽象方法必须在其子类中被实现,否则该子类只能声明为abstract;

7.抽象方法不能为static;

8.在下列情况下,一个类必须声明为抽象类:

  1. 当一个类的一个或多个方法是抽象方法时;
  2. 当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;
  3. 当一个类实现一个接口,并且不能为全部抽象方法都提供实现时;

2.接口

由于类的多继承能够导致方法调用的冲突,所以Java中的类只能单继承。但是很多时候还是需要多继承的,Java中的接口就可以实现多继承,接口中不存在具体方法,不会引起方法调用的冲突。instanceof运算符可以用来决定某对象的类是否实现了接口

2.1接口的格式

[public] interface 接口名 [extends 父接口列表]{
     // 属性声明,不写也是公共常量
     [public] [static] [final] 属性类型属性名 = 常量值 ;
     // 方法声明
     [public] [abstract] 返回值类型方法名 ( 参数列表 ) ;
}

1.接口中只包含常量和抽象方法,而没有变量和方法的实现,接口对类来说是一套规范,是一套行为协议。
2.接口不是一个类,不能实例化。
3.接口规定了类的共同行为。
4.在Java中,接口的声明采用interface关键字,接口不是一个类,没有构造方法,不能被实例化。
5.修饰接口的修饰符只有public和默认修饰符两种,不写也是public的
6.接口可以是多继承,接口只能继承接口,不能继承类。
7.属性必须是常量(有初值),方法必须是抽象的(无方法体)。

2.2接口可以多继承

//B,C也是接口
public interface A extends B,C {
}

2.3接口的实现(implements)

如果一个类要实现一个接口,那么这个类就必须实现接口中所有抽象方法。否则这个类只能声明为抽象类,多个无关的类可以实现一个接口,一个类可以实现多个无关的接口,一个类可以在继承一个父类的同时,实现一个或多个接口。

class 类名 [extends 父类] [implements 接口列表]
{
 覆盖所有接口中定义的方法;
}

3.异同

相同:子类必须实现它门的抽象方法,抽象类与接口都不能创建自己的对象
不同:继承使用extends,接口的实现用implements
抽象类可以没有抽象方法,接口中方法都是抽象的
抽象类可以有自己构造器及普通方法,接口中没有构造器
子类只能继承一个抽象类,但可以实现多个接口
抽象类主要通过共享的属性,接口主要提供共享的方法