Java中的抽象类和接口

声明:此篇内容源自书籍<Java编程思想>

一、抽象类:    如果一个类包含一个或多个抽象方法,该类必须被定义为抽象的。

简单的抽象类如下:

public abstract class day01_5 {
    public abstract void f();
}

如果我们想继承一个抽象类,并想创建一个新类,那么就必须为基类中的所有抽象方法提供方法定义,如果不这样做,

那么导出类便也是抽象类,并且编译器会强制让我们用abstract关键字修饰该类

像这样。

class impl extends day01_5{

    @Override
    public void f() {
        System.out.println("impl f");
    }
}

可以看出,抽象类就是为了继承才出现的。

包含抽象方法的类是抽象类,但并不是抽象类里不可以有普通方法,抽象类可以有自己的普通方法,自己的域。

public abstract class day01_5 {
    public String name = "abstract";
    
    public void fun(){
        System.out.println("fun");
    }
    
    public abstract void f();
}

上述代码中,抽象类不仅有普通方法,还有属性。

所以抽象类和普通类到底有哪些不同呢。

    1、抽象类不可以实例化

    2、继承抽象类的导出类必须将抽象类的抽象方法进行定义,不然导出类也是抽象类

二、下面我们来说一说接口。

    首先接口并不是类,而是对类的一组需求描述。

    接口中的方法自动属于public,如果你用private或者protected修饰,则会报错。

    

    接口不是类,所以也不能用new关键字去实例化一个接口,但是你可以声明一个接口的变量

    接口变量必须引用实现了接口的类对象

    接口中不能包含实例域或静态方法,但可以包含常量,也就是说你定的在接口中的域会被自动设为public static final。

如果你读了上述内容,你就有可能去想,为什么Java中已经有了抽类类,为什么还要引入接口呢?

    很抱歉,使用抽象类存在这样一个问题,每个类只能扩展一个类。

    但每个类可以实现多个接口,这样可以避免多继承的复杂性和低效性。

最后补充一点,在Java SE8中,允许在接口中增加静态方法和default方法。

interface Collection{
    public int size();

    default boolean isEmpty(){
        return size() == 0;
    }

    public static void fun(){
        System.out.println("123");
    }
}

三、抽象类与接口的区别

    1、抽象类中的普通方法可以提供方法细节,而接口中不行,除非是default或者static方法

    2、抽象类中可以有自己的成员变量,而接口中没有,只能定义public static final的常量

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值