接口和抽象类的区别

接口

什么是接口?
接口是java语言中的一个抽象类型,用于定义对象的公共行为。接口的创建使用的关键字是interface,在接口的实现中可以定义方法和常量,接口中的普通方法不能有方法体。在jdk8之后,接口中可以创建 static 和 default 方法,并且这两种方法可以有默认的方法实现,示例代码如下:
接口代码:

public interface InterfaceDemo1 {

    /**
     * 接口中定义的成员变量都是默认 static final修饰的静态常量
     */
    int COUNT = 1314;

    /**
     * 普通方法
     */
    void sayHello();

    /**
     * default方法(实现类可以重写此default方法,也可以不重写)
     */
    default void defaultMethod() {
        System.out.println("我是接口中的default方法,具有方法体");
    }

    /**
     * static方法
     */
    static void staticMethod() {
        System.out.println("我是接口中的static方法,具有方法体");
    }
}

上面接口的实现类:

public class InterfaceDemo1Impl implements InterfaceDemo1 {
    @Override
    public void sayHello() {
        System.out.println("你好呀");
    }

    /**
     * 注意:接口中的 default方法可以选择实现也可以选择不进行实现
     */
    @Override
    public void defaultMethod() {
        InterfaceDemo1.super.defaultMethod();
    }

    public static void main(String[] args) {
        // 对接口实现类的实例化
        InterfaceDemo1Impl impl = new InterfaceDemo1Impl();
        impl.sayHello();

        // 调用接口中的 static方法
        InterfaceDemo1.staticMethod();
        // 调用接口中的 常量
        System.out.println(InterfaceDemo1.COUNT);
        // 调用接口中的 default方法
        impl.defaultMethod();
    }
}

程序执行结果:
运行接口

**着重说一句:**接口中的普通方法实现类中必须进行重写,否则报错;接口中的default方法实现类可以选择进行重写也可以选择不进行重写,都可以的;对于static方法是没有办法进行重写的,只能通过接口名称进行调用。

接口的总结:

  1. jdk8中接口中可以定义 static 和 default 方法,并且这两种方法可以有具体的方法体。
  2. 类实现接口使用的关键字是 implements。
  3. 接口不能进行实例化,可以实例化接口的实现类。
  4. 接口中定义的成员变量默认为 public static final类型。
  5. 实现类可以选择性的重写或者不重写接口中的 default方法,不重写是不能进行调用的。
  6. 接口中的 static方法不能进行重写,可以通过接口的名称进行调用。

抽象类

什么是抽象类?
在java中被 abstract关键字修饰的类称为抽象类,被 abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,并没有方法体。抽象类和接口类似,也是用来定义对象的公共行为的,并且也不能被直接实例化。子类使用 extends关键字继承父类(抽象类)。
抽象类示例代码:

public abstract class AbstractDemo {
    /**
     * 定义普通成员变量
     */
    int count = 520;
    /**
     * 定义私有成员变量
     */
    private static final int TOTAL = 666;

    /**
     * 定义抽象方法
     */
    public abstract void abstractMethod();

    /**
     * 定义普通方法
     */
    public void normalMethod() {
        System.out.println("我是抽象类中的普通方法,我有方法体");
    }
}

子类示例代码:

public class AbstractDemoSon extends AbstractDemo {
    @Override
    public void abstractMethod() {
        System.out.println("在子类中重写了父类中的抽象方法");
    }

    public static void main(String[] args) {
        AbstractDemoSon sonClass = new AbstractDemoSon();
        // 给抽象类中的成员变量进行重写赋值
        sonClass.count = 1040;
        System.out.println(sonClass.count);

        // 调用抽象类中的抽象方法
        sonClass.abstractMethod();

        // 调用抽象类中的普通方法
        sonClass.normalMethod();
    }
}

程序运行结果:
运行结果

抽象类的总结:

  1. 抽象类使用 abstract关键字声明。
  2. 抽象类不能直接实例化。
  3. 抽象类可以包含普通方法和抽象方法,抽象方法不能有方法体。
  4. 子类需使用 extends关键字实现对父类的继承。
  5. 子类继承抽象类必须重写抽象类(父类)中的抽象方法,否则报错。
  6. 在子类中可以选择重写抽象类(父类)中的普通方法,也可以选择不重写。
  7. 抽象类中的属性访问修饰符无限制,可以定义private类型的属性。

区别

接口和抽象类的区别:

  1. 定义使用的关键字不同:接口使用关键字 interface来定义。抽象类使用关键字 abstract来定义。
  2. 继承或实现的关键字不同:接口使用 implements关键字定义具体实现。抽象类使用 extends关键字实现继承。
  3. 子类扩展的数量不同:一个类可以多实现,但只能单继承。
  4. 属性(变量)访问修饰符不同:接口中的属性修饰符只能是 public。抽象类中的属性访问修饰符无限制,可以为任意修饰符。
  5. 方法访问修饰符不同:接口中的方法默认修饰符是 public,并且不能定义为其他修饰符。抽象类中的方法修饰符无限制,但抽象方法不能使用 private修饰符。
  6. 方法实现不同:接口中普通方法不能有方法体。抽象类中普通方法必须有方法体。
  7. 静态代码块使用不同:接口中不能使用静态代码块。抽象类中可以使用静态代码块。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值