Java--面向对象--抽象类和接口

目录

1.抽象类

1.1什么是抽象类

1.2如何定义一个抽象类

1.3抽象类的作用

2.接口

2.1接口的概念

2.2接口的使用

2.3多接口的使用

2.4接口之间的继承

3.抽象类和接口的区别


1.抽象类

1.1什么是抽象类

抽象类顾名思义,就是比较抽象的类,它不像之前我们见到的一些类可以具体到某个对象。比如动物类,当你看见这个类时你并不知道这是一个什么东西,只能确定它是一个动物。类似于这种一个类中没有包含足够的信息来描绘一个具体的对象类,这就是抽象类。

1.2如何定义一个抽象类

定义一个抽象类需要用到abstract关键字,如下:

抽象类的特点

  • 抽象类内被abstract 修饰的方法称为抽象方法,因为不同的动物做一个相同的动作可能会是不同的表现,所以抽象方法不用去具体实现,只需要给出一个声明就行(抽象方法不能是 private 的)。
  • 因为抽象类描述的是比较模糊的,不容易让人联想到一个具体的对象,所以在语法上抽象类不能实例化对象,如果用抽象类去实例化对象编译器就会报错。
  • 抽象类的作用就是被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰
  • 抽象类和抽象方法不能被final和static修饰,因为抽象方法要被子类重写
  • 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
  • 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
  • 如果一个抽象类A,继承了抽象类B则不用重写B中的抽象方法,如果又有一个类C继承了类A,就要重写类A和类B的方法

1.3抽象类的作用

说了这么多好像也没感觉到抽象类有什么太明显的作用,既然刚刚说抽象类是为了被继承,那么普通类也是可以被继承的呀,还要抽象类干嘛?

既然抽象类存在,就肯定有它存在的意义,比如当我们要用子类对象完成一个工作时,却误用成了父类对象这时,如果是抽象类就会报错,如果是普通类就发现不了这个错误,又或者当父类中有一个方法是必须要重写的,如果用普通类程序员忘记重写也不会报错,但在抽象类中子类必须重写父类抽象方法,就可以保证不会出现忘记重写这样的问题。

很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不 就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们. 充分利用编译器的校验, 在实际开发中是非常有意义的.

2.接口

2.1接口的概念

接口可以看作是一种特殊的抽象类,又或者说它是一种比抽象类还抽象的类,它里面都是有全局变量和公共抽象方法组成

现在我们来定义一个接口:

定义的方法就是把class换成interface 并且其内部的成员类型是默认的

//上面代码注释有一处不对,成员变量应该默认为是 public static final

  • 创建接口时, 接口的命名一般以大写字母 I 开头.
  •  接口的命名一般使用 "形容词" 词性的单词.
  • 子类重写抽象方法,必须是public修饰
  • 接口当中不能有静态代码块和构造方法
  • jdk8中:接口中还可以包含default方法
  • 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性.

2.2接口的使用

接口和抽象类一样不能被实例化,那么你是不是就会想需要子类继承,其实差不多不过有一点不一样,接口不用extend而是implements关键字,就像普通类实现实现抽象类一样,一个类实现某个接口则必须实现该接口中的抽象方法,否则该类必须被定义为抽象类。

我们来举一个例子:

USB.Java

TestUSB.java

2.3多接口的使用

接口的类还有一个不同的是,一个类只能继承一个类,但是一个类却可以继承多个接口,这也间接解决了Java中类不能多继承的问题

我们先举一个例子(定义一个动物类并实现一些运动接口):

我们可以发现接口和继承的区别,继承是is a的含义比如狗is a动物,而接口是否并没有这层关系,只要这个东西具有这个特性就可以实现这个接口,接口这样设计的好处就是不必关注类型只要这个对象具有这个特性就行,比如在上面的例子中再加机器人类它不是动物,但是它仍然可以跑可以跳。

2.4接口之间的继承

在Java中类和类之间只能实现单继承,但是接口和接口之间却可以实现多继承(和类一样使用extends关键字)比如我们现在来定义一个两栖类(frog)

接口间的继承相当于把多个接口合并在一起,通过接口的继承就可以更加方便的实现一个对象同时表现多个特性。

3.抽象类和接口的区别

在了解到抽象类和接口之后,我想你可能会有疑惑,感觉抽象类和接口很像,确实抽象类和接口存在的意义本质就是被继承。不过他俩还是有很大不同的,认清他俩的区别(面试可能会有)在实际使用时是一个很重要的知识点。

相同点

  • 都不能被直接实例化 ,接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化
  • 都可以实现多态

不同点

  • 接口创建使用interface关键字,实现使用implements关键字,抽象类创建使用abstract关键字继承使用extends关键字
  • 核心区别:抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中 不能包含普通方法, 子类必须重写所有的抽象方法.
  • 一个类可以实现多个接口,但只能继承一个抽象类
  • 抽象类中可以有构造方法已经实现方法,接口中没有构造方法并且只能定义方法不能实现
  • 抽象类重写权限可以是各种,接口只能是public
  • 抽象类继承要有所属关系,接口的实现只需要有这个特性就行
  • 接口的成员变量默认是public static final类型必须赋初值,而抽象类默认是default而且可以在子类中被重新赋值

以上就是博主对抽象类和接口的理解如果有不正确的地方也请小伙伴们多多指正,希望可以和大家共同进步呀!!我们下一篇再见了!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值