java抽象类和接口使用及区别
Posted 爱敲代码的三毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java抽象类和接口使用及区别相关的知识,希望对你有一定的参考价值。
文章目录
前言
接上一篇博客Java面向对象三大特性(封装、继承、多态)来了解一下什么是抽象类和接口。
一、抽象类
1.抽象类的概念
我们知道一个普通的类可以有构造方法、普通方法和静态方法,普通成员变量和静态成员变量等,而抽象类是指包含抽象方法的类,就叫做抽象类。
2.抽象类的定义
在java当中我们用关键字 abstract 来定义一个抽象类
如果一个方法没有具体的实现就可以用 abstract 来修饰,且包含抽象方法的类也一定要用 abstract 来修饰。
3.抽象类的注意事项
1.抽象类是不能被实例化的
2.在抽象类当中可以包含抽象方法也可以包含非抽象方法
3.当一个普通的类,继承了一个抽象类,那么这个普通类一定要 重写 抽象类当中的抽象方法 ,或者用abstract修饰
4.当一个普通类继承了一个,没有重写抽象方法且带有一个抽象方法的类,又继承了一个带有抽象方法的的类。那么这个普通方法就要重写这两个类的抽象方法了。
5.抽象类不能被 final 修饰,因为抽象类本来就是用来继承的,所以不能被 final 修饰。
6.抽象方法是为了重写的,也不能 final 修饰。且抽象方法不能用 private 修饰的
7.父类的普通方法,在类外也可以被调用,但是需要让父类引用去引用子类对象(也就是向上转型),或者在子类中通过 super 关键字访问父类(抽象类)的成员变量或者成员方法。
运行结果
4.抽象类的意义
抽象类存在的最大意义就是为了被继承.
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法
使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了,
使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.
二、接口
1.接口概念
接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含 静态常量。
1.接口的定义
在 java 中用 interface 定义一个接口
注意:
- 我们创建接口的时候, 接口的命名一般以大写字母 I 开头.
- 接口的命名一般使用 “形容词” 词性的单词.
- 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性
2.接口中的方法和成员变量
1.接口当中的方法,默认都是抽象方法。public abstract
2.接口当中,可以定义成员变量。public static final
注意:
1.接口中的方法前面的修饰符写或不写,默认都是 public abstract 也就是抽象方法
2.接口当中的成员变量,也是一样,默认就是 public static final
3.default关键字
接口当中的方法都是没有具体实现的,但从 jdk 1.8开始,接口中的方法可以有具体实现,但是这个给方法必须是 default 修饰的
4.接口的使用
接口也是不可以被实例化的
接口的使用通过 implements
关键字 类名 implements 接口
使用 implements 继承接口. 此时表达的含义不再是 “扩展”, 而是 “实现”
接口也是可以发生向上转型和动态绑定的。
运行结果
且接口中的普通方法调用也类似
运行结果:
5.实现多个接口
有的时候我们需要让一个类同时继承自多个父类. 这件事情在有些编程语言通过 多继承 的方式来实现的.
然而 Java 中只支持单继承, 一个类只能 extends 一个父类. 但是可以同时实现多个接口, 也能达到多继承类似的效果.
一个类可以实现多个接口,通过关键字 implements 。
注意:如果实现了多个接口,一定要重写每个接口里面的方法
注意事项:如果两个接口,方法名相同,此时在类当中,只需要重写一个方法就好了,但最终调用的就是这一个方法。但并不建议这么做,接口都不一样就不要写同样的方法了。
运行结果
6.接口的拓展
一个类可以拓展多个接口,通过关键字 extends 来拓展多个接口,也就说可以让一个接口具备另外几个接口的功能。
注意:一但有一个普通类实现了这拓展的接口,那么这个类就要重写这个个接口的抽象方法了。
7.接口使用示例
为了更好理解接口的好处,我们来看一个例子
我们定义了一个 Animal 类来描述动物,三个接口,分别代表 飞、跑、游。再定义了一个Cat类继承了Animal 类,并且实现了 跑 这个接口
运行结果:
这里就发生了动态绑定
再来看一下一个类实现多个接口,我们又定义了一只鸟和一只鸭子实现了多个接口。
给每个接口都写了一个对应方法来实现动态绑定。
运行结果
我们发现接口是非常灵活的,我们不用管传过去的是什么,只要传过去的对象只要实现了对应的接口,都可以调用这个方法,发生向下转型和动态绑定。
当然如果这个对象没有实现这个接口i就会报错
时刻牢记多态的好处, 让程序猿忘记类型. 有了接口之后, 类的使用者就不必关注具体类型, 而 只关注某个类是否具备某种能力.
三、抽象类和接口的区别
1.成员变量
抽象类当中:成员变量和普通的成员变量的定义没有区别
接口当中:成员变量默认是:public static final
2.成员方法
抽象类当中:成员方法可以有普通的方法也可以有抽象方法
接口当中:默认是 public abstract(抽象方法)
3.实现方式
抽象类:不能被实例化,所以只能被子类使用 extends关键字继承,且只能继承一个
接口:不能被实例化,只能用 implements 来实现,同时可以实现多个接口,一个接口可以使用 extends 扩展多个接口的功能呢。
总结
1.抽象类存在的最大意义就是为了被继承
2.Java 中只支持单继承, 一个类只能 extends 一个父类. 但是可以同时实现多个接口也能达到多继承类似的效果
3.时刻牢记多态的好处, 让程序猿忘记类型. 有了接口之后, 类的使用者就不必关注具体类型, 而只关注某个类是否具备某种能力.
4.抽象类和接口的核心区别:
抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法.
完!
创作不易,记得点赞!
以上是关于java抽象类和接口使用及区别的主要内容,如果未能解决你的问题,请参考以下文章