java面试:接口和抽象类有什么共同点和区别?

在Java中,接口(Interface)和抽象类(Abstract Class)都是用于实现抽象化的工具,它们有一些共同点,但也存在显著的区别。以下是它们的共同点和区别:

共同点

不能实例化
无论是接口还是抽象类,都不能直接实例化。它们只能被其他类实现或继承。

用于抽象化
接口和抽象类都用于定义一组方法,这些方法可以在具体的子类中实现。它们提供了一种抽象的方式来描述对象的行为。

可以包含抽象方法
两者都可以包含抽象方法,即没有实现的方法,子类必须实现这些方法。

区别

定义方式

接口:使用interface关键字定义,所有方法默认是publicabstract,所有字段默认是public static final

抽象类:使用abstract class关键字定义,可以包含具体方法(有实现)和抽象方法。

interface MyInterface {  

    void myMethod(); // 默认是 public abstract  

}  

abstract class MyAbstractClass {  

    abstract void myAbstractMethod(); // 抽象方法  

    void myConcreteMethod() { // 具体方法  

        // 实现  

    }  

}  

多重继承

接口:一个类可以实现多个接口,支持多重继承。

抽象类:一个类只能继承一个抽象类,不支持多重继承。

class MyClass extends MyAbstractClass implements MyInterface, AnotherInterface {  

    // 实现方法  

}  

构造方法

接口:不能有构造方法,因为接口不能被实例化。

抽象类:可以有构造方法,子类可以通过调用父类的构造方法来初始化。

字段

接口:只能包含public static final字段,不能包含实例字段。

抽象类:可以包含实例字段和任何访问修饰符的字段。

默认方法和静态方法

接口:从Java 8开始,接口可以包含默认方法(default)和静态方法。

抽象类:可以包含任何类型的方法,包括静态方法和实例方法。

选择使用的场景

使用接口

当你希望定义一个可以被多个类实现的行为时,使用接口。

当你需要支持多重继承时,使用接口。

使用抽象类

当你希望提供一些通用的实现,并且希望子类共享这些实现时,使用抽象类。

当你需要定义一些状态(字段)时,使用抽象类。

示例代码

interface Animal {  

    void makeSound(); // 抽象方法  

}  

abstract class Mammal {  

    abstract void walk(); // 抽象方法  



    void breathe() { // 具体方法  

        System.out.println("Breathing...");  

    }  

}  

class Dog extends Mammal implements Animal {  

    @Override  

    public void makeSound() {  

        System.out.println("Bark");  

    }  



    @Override  

    void walk() {  

        System.out.println("Dog is walking");  

    }  

}  

综上所述,接口和抽象类在Java中都用于实现抽象化,但它们在定义、继承、构造方法、字段等方面存在显著的区别。选择使用哪种方式取决于具体的设计需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值