接口和抽象类的区别

转载至:
https://www.jianshu.com/p/970a9be47542

1 抽象类

在这里插入图片描述
这里有一个重点就是:抽象方法必须为public或者protected
如果是private,则不能被子类继承,子类无法实现这个方法。
默认情况下是public;

我们写一个test类进行比较:

在这里插入图片描述
显而易见的是 我们这里爆红!
提示,显示让我们把这个类定义成抽象类。
所以含有抽象方法的类既是抽象类。

在这里插入图片描述
然后我们定义为抽象类之后,看是否能够添加普通的方法。

一开始想到的是 是否像接口一样只要写方法 不用实现就可以了。
在这里插入图片描述
不行,发现还是报错。 我们把这个方法体实现 看是否可行。
成功 , 所以在抽象类中是可以写其他的方法的, 但是要实现成功。
在这里插入图片描述
然后我们写一个子类去继承抽象类(父类)
创建出来就发现爆红:
在这里插入图片描述
提示,我们有两种方法。

  • 第一种是 实现方法;
  • 第二种是 使当前类为抽象类
    在这里插入图片描述
    我们看一下第一个方法,实现方法。
    我们之前是有两个方法的。
    但是它只弹出了 去实现抽象类。
    所以子类去继承父类抽象类是必须要实现抽象方法的。
    在这里插入图片描述
    在这里插入图片描述

第二种,我们把子类定义成抽象类 发现是OK的。

在这里插入图片描述

2 接口

在这里插入图片描述

接口的话
所有的变量默认的修饰都是public static final变量
所有的方法默认的修饰都是public abstract

接口就是最高级的抽象类,抽象类能实现功能嘛? 能
那接口能实现功能嘛? 不能
即 接口就是更抽象的高级抽象类。
所以方法就是 public abstract的。

同时接口不是类,尤其不能用使用new来实例化一个接口。
尽管不能构造接口的对象,却能声明接口的变量。

//Comparable 是一个接口
//声明接口变量
Comparable x;

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

//Employee是实现了Comparable接口的实现类
x = new Employee(...)

在这里插入图片描述
在这里插入图片描述

提问

那么接口变量引用实现了接口的类的对象的好处是什么?为什么这么做呢?
我们经常在创建集合的时候,能看到这种写法吧?

List list = new ArrayList<String>();
//或者
Map<?,?> map = new  HashMap<?,?>

我们都十分清楚,List和Map都是接口,ArrayList和HashMap都是前两者的实现类?
那么接口变量引用实现了接口的类的对象的好吃在哪?为什么这么做呢?

我们直接进行如下操作不好嘛?

ArrayList<String> al = new ArrayList<String>();
//或者

这其实是Java中多态的一种表现

接口的实现类可以有很多个,如 LinkedList或者Vector等等,如果使用这种方式,List list = new ArrayList(); 以后不想用ArrayList了,直接改为你想用的实现类,如List list = new LinkedList(); 这样,虽然修改了实现类,但相关list调用方法的代码是不用修改的;如果是ArrayList list = new ArrayList();这种写法,那就有可能要修改非常多代码了,因为,原本list调用了ArrayList中的方法来实现某个功能,再修改实现类过后,list原本调用的方法在LinkedList中不存在,则还要修改对应调用的方法;因此:

两种方式其实都能实现同一种效果,只是接口的引用指向实现类对象这一方法,是用接口来规范了实现的方法,这样子写的化就很清楚的知道哪些方法有,哪些方法没有。

总结:java在利用接口变量调用其实现类的对象的方法时,该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。

接口的灵活性就在于“规定一个类必须做什么,而不管你如何做”。

我们可以定义一个接口类型的引用变量来引用实现接口的类的实例,当这个引用调用方法时,它会根据实际引用的类的实例来判断具体调用哪个方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值