Java 抽象类和接口

目录

1️⃣什么是抽象类?

注意事项

抽象类的使用场景

特征和注意事项

final和abstract是什么关系?

2️⃣接口的定义与特点

接口的用法

接口和接口的关系

接口多继承的作用

接口的注意事项

3️⃣抽象类和接口区别

4️⃣抽象类和接口的共同点


1️⃣什么是抽象类?

​在Java中abstract是抽象的意思,可以修饰类、成员方法

abstract修饰类,这个类就是抽象类;abstract修饰方法,这个方法就是抽象方法。

注意事项

  • 抽象方法只有方法签名,不能声明方法体
  • 一个类中如果定义了抽象方法,这个类必须声明成抽象类,否则会报错。

抽象类的使用场景

  • 抽象类可以理解成不完整的设计图,一般作为父类,让子类来继承
  • 当父类知道子类一定要完成某些行为,但是每个子类该行为的实现又不同,于是该父类就把该行为定义成抽象方法的形式,具体实现交给子类去完成。此时这个类就可以声明成抽象类。

特征和注意事项

  1. 一个类只能继承一个抽象类
  2. 修饰符不能是private(因为要被继承)
  3. 类拥有的成员(如:成员变量、方法、构造器),抽象类也都具备
  4. 抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类
  5. 一个类继承了抽象类,就必须重写抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
  6. 不能用abstract修饰变量、代码块、构造器
  7. 最重要的特征:抽象类虽然得到了抽象方法,但是失去了创建对象的能力 【即:不能用来实例化对象,所以抽象类必须被继承才能被使用,其他的功能和普通类相同】

为什么抽象类不能创建对象呢?

可以用反证法来验证,假设抽象类可以创建对象,但是在调用方法时就会报错,因为调用的方法连方法体都没有!因此抽象类不能创建对象

final和abstract是什么关系?

答案是互斥关系

原因主要有以下两个方面:

  • abstract定义的抽象类作为模板让子类继承,final定义的类不能被继承
  • 抽象方法定义通用功能让子类重写,final定义的方法子类不能重写。

2️⃣接口的定义与特点

接口的格式如下:

Java 抽象类和接口_第1张图片

  • JDK1.8之前接口中只能定义抽象方法常量,没有其他成分
  • 接口不能实例化
  • 接口是一种规范
  • 由于接口体现的是规范思想,规范默认都是公开的,所以接口中的成员都是public修饰的,也可以省略不写

接口中的变量默认用public static final修饰

接口中方法默认用public abstract修饰

接口的用法

接口是用来被实现(implements)的,实现接口的类称为实现类。实现类可以理解成所谓的子类。

接口可以被类单实现,也可以被类多实现。

接口和接口的关系

类和类的关系:单继承。

类和接口的关系:多实现。

接口和接口的关系:多继承,一个接口可以同时继承多个接口。

接口多继承的作用

规范合并,整合多个接口为同一个接口,便于子类实现。

即:在开发设计的过程中,一个类同时实现多个接口,看起来比较繁琐

因此就有了如下设计:

让一个接口A继承多个接口,然后再由类实现接口A就可以了

接口的注意事项

1.接口中所有的方法不能有具体的实现,即接口中的方法都是抽象方法。

2.接口必须通过类来实现它的抽象方法

3.接口不能创建对象

4.一个类实现多个接口,多个接口中有同样的静态方法时不冲突

【原因是:接口中的方法只能接口自己调用】

5.一个类继承了父类,同时又实现了接口,当父类中和接口中有同名方法时,默认用父类的

举个例子:

public class text4 {
    public static void main(String[] args) {
      Cat cat=new Cat();
      cat.eat();
    }
}
 class Animal{
    public void eat(){
        System.out.println("父类中的eat方法");
    }
}

interface  Food{
    default void eat(){//使用default修饰的接口方法,可以拥有方法体,实现类不需要重写,可以被实现类继承,该特性是Java8以后被提出
        System.out.println("接口中的eat方法");
    }
}
class Cat extends Animal implements Food {

}

运行结果:

Java 抽象类和接口_第2张图片  

3️⃣抽象类和接口区别

从语法层面来说:

1、抽象类可以提供成员方法的实现细节,而接口中只能存在抽象方法

2、抽象类中成员变量可以是多种类型,接口中成员变量必须用public static final修饰

3、一个类只能继承一个抽象类,但可以实现多个接口

4、抽象类中允许含有静态代码块和静态方法,接口不能

从设计层面而言:

1.抽象类是对整一个类的属性,行为等方面进行抽象,而接口则是对行为抽象。就好比飞机和鸟,抽象类抽象出的是飞行物类。而接口则是抽闲出飞行方法。

2.抽象类是一个模板式的设计,当在开发过程中出现需求更改的情况,只需要更改抽象类而不需要更改它的子类。

接口是一种辐射性设计,当接口的内容发生改变时,需要同时对实现它的子类进行相应的修改。

4️⃣抽象类和接口的共同点

接口和抽象类又很像,它们都具有如下共同的特征

  • 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。
  • 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

你可能感兴趣的:(Java,java,开发语言,抽象类,接口,implements)