Java 基础 --- 接口与抽象类

1 为什么要有抽象类

一般类里定义的方法,子类也可以覆盖,为什么要定义抽象类呢?

首先,一个类如果被定义成抽象类,那说明,每个子类都有自己独特的实例化方法,父类定义的方法没有任何作用。没有任何作用还要定义,就不符合代码设计的 简洁性的思想,应该抽取的更简洁一点

其次,最重要的是,定义成抽象类,会有一个 提示性 作用
当我们看到一个类是抽象的,我们会很关心它的抽象方法。我们知道它的子类一定会重写它,而且,我们会去找到抽象类的引用,它一定会有多态性的体现。
但是,如果没有这么做,别人会以为在其他地方,我们会实例化这个类的实例,其实并没有。

父类不用抽象类的时候

/*
父类不是抽象类, class Animal, 我们会觉得,在其他地方,会实例化 Animal这个实例,但是并没有
一个好的设计思想和代码,应该尽可能的封装,抽取,提取到最简洁,方便扩展,复用,修改,阅读
*/
class Animal{
    public void run(){
        System.out.println("行走方式未知");
    }
}

// 子类
class Fish extends Animal{
   public void run(){
    System.out.println("行走方式:游泳");
   }
 }

class Bird extends Animal{
   public void run(){
    System.out.println("行走方式:飞行");
   }
 }

父类用抽象类的时候

/*
父类定义成抽象的,让读者一看,就知道,子类要实现这个功能,具有提示作用
并且,增加了代码的简洁性和可读性
*/
abstract class Animal{   //抽象类 
      abstract public void run(); //抽象方法
}

// 子类
class Fish extends Animal{
   public void run(){
    System.out.println("行走方式:游泳");
   }
}

class Bird extends Animal{
   public void run(){
    System.out.println("行走方式:飞行");
   }
}

2 有了抽象类,为什么还需要接口

Java 不支持多继承,只支持单继承,接口是为了解决多继承而出现的
在 Java 中,使用抽象类,表示通用属性存在这样一个问题:每个类只能扩展一个类,如果 类A 继承了 类B ,那么它就不能继承 类C 了。
class A extends B,C // Error

但是每个每个类可以实现多个接口:
class A extends B implements C

3 有了接口,为什么还要抽象类

这部分是转载的 [别人的],感谢作者(https://blog.csdn.net/xinqing5130/article/details/72844273)

接口是 implements, 一个类可以实现多个接口,并且要实现接口里,所有的抽象方法。这样,接口就有了一个天生的短板 — 当多个类实现同一个接口时,如果有共同的操作,那怎么封装?接口里是不能有实例方法的。

比如说,有接口 A,类B1, B2, B3 实现A,但是 类B1, B2, B3 里面都有一个共同的操作:
比如是 查询所有用户,保存到一个 map中,然后判断当前新增用户,是否存在 map 中
我们是不能把这个方法写在 接口A 里面的,因为 接口A 不能有实例方法,这就需要我们在 类B1, B2, B3 里面都写这个方法,但是这种做法,明显不符合,代码重用的规则
正确的做法是,另写一个抽象类C,将查询数据写在 C中,然后让 类B1, B2, B3 实现A 的同时,继承C。
B1 extends C implements A
这样就做到了 封装

抽象类可以多重继承,接口也可以多重实现,但是
抽象类可以将具体的方法做成封装
这样就扩展了程序功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值