Java中抽象类和接口的区别

Java中抽象类与接口的区别

抽象类

什么是抽象类?

在继承时,许多的子类方法才会比较具体,但我们在父类中只能给出比较通用的定义,比如说计算面积,对于不同的派生类会有不同的实现方法,比如三角形和矩形的面积计算公式就是不一样的,子类派生出后才能使得类的方法变得具体,这时含有没有具体定义的方法的父类就是抽象类(abstract class)。当一个父类是抽象类时,它没有具体的实例。

定义格式

在class前加上abstract关键字,就定义了一个抽象类

/*例如*/ public abstract class Base {}

抽象类中的方法成员

  1. 抽象类的构造方法应该定义为protected,因为其不应该被实例化对象且构造方法需要被子类调用
  2. 抽象类的方法可以是抽象方法也可以是普通方法
  3. 如果一个类有抽象方法,那必须定义为抽象类
  4. 抽象方法必须定义为protected或public,默认是public

抽象类的属性成员

​ 抽象类中的属性和普通类没有区别,但他只能被子类调用

注意事项

1. 子类继承抽象类时如果想要把子类实例化,那就必须把抽象类中的抽象方法全部重写,否则必须在子类前加abstract,使他成为抽象类

2. 抽象类不能被实例化,不能作为对象的实际类型
3. 但是抽象类可以作为对象的声明类型来实现多态
public abstract class Shaped{
    protected Shaped(){}
    public abstract double getArea();
}
class Circle extends Shaped{

    @Override
    double getArea() {
        return 34;
    }
}

上面我们简单的定义了一个抽象类和他的子类

我们不能实例化一个抽象类,但我们可以用他来进行多态的实现(可以把它作为声明类型,但不能把它作为实际类型)

Shaped shape = new Circle();
System.out.println("The area of the circle is " + shape.getArea());

还可以利用数组一样的方式创建一连串的引用类型变量

Shaped[] s = new Shaped[10];
for (int i = 0; i < 10; i++) {
	s[i] = new Circle();
}

需要注意的是抽象类只能被普通类和抽象类继承

接口

什么是接口?

接口在许多方面与抽象类相似,但是接口的目的是指明相关与不相关类的多个对象的共同行为,也就是说,是指明功能,而不是类。

定义格式

public interface 接口名 {}

接口方法

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

接口属性

接口中的变量会被隐式地指定为public static final变量(并且只能public static final变量,用private修饰会报编译错误)

implements

格式:class Son implements Father

多继承

接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题。

默认方法

JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰,定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法。

静态方法

JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用。

格式:接口名.静态方法名

抽象类和接口比较

相同点

  1. 不能被实例化

  2. 抽象方法都必须被子类重写才能实例化

不同点

参数 抽象类 接口
默认构造函数 有默认构造方法 不存在构造方法
定义 class abstract interface
继承 extends,由抽象类和普通类继承,只能单继承 能被接口和普通类继承,可以多继承,也可以被抽象类实现
添加新方法 只需要在抽象类中添加方法 必须将全部子方法重写

应用场景

  1. 抽象类

    如果你拥有一些方法并且想让它们中的一些有默认实现,那么可以使用抽象类

    如果基本功能在不断改变,那么就需要使用抽象类

  2. 接口

    如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。

    如果方法不需要一直改变,你可以使用接口

posted @   Wint_x19  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示