JAVA基础__接口、抽象类

一时失言乱红尘 2022-05-28 13:24 376阅读 0赞

前景

今天还看了java核心技术的接口部分,一点点,但是感觉这部分上面记载的东西有点不太懂,于是在网上找了个小练习来加深下自己的理解

接口

接口主要来描述类具有的功能。可以看做是一个抽象的类型

接口的特性

1、接口不能被实例化,这点和抽象类是一样的
2、接口的方法会被指定为public stract 接口里面的变量只能使用常量也就是public static final
3、接口中的抽象方法最终被实现接口的实际类来实现
4、接口可以弥补类无法实现多继承的缺陷
5、虽然不能构造接口的对象,但是能使用接口变量来引用实现接口的类的实例对象
6、接口也可以实现多态

小例子,模拟打印机

墨盒:黑色,彩色
纸张:A4,B5
打印机

墨盒接口

  1. package interfaces;
  2. /** * 墨盒接口 * @author dream * */
  3. public interface Ink {
  4. public void ink();
  5. }

纸张接口

  1. package interfaces;
  2. /** * 纸张接口 * @author dream * */
  3. public interface Paper {
  4. public void paper();
  5. }

彩色墨盒

  1. package interfaces;
  2. public class ColorfulInk implements Ink {
  3. @Override
  4. public void ink()
  5. {
  6. System.out.println("选择彩色墨盒");
  7. }
  8. }

黑白墨盒

  1. package interfaces;
  2. public class BlackInk implements Ink {
  3. @Override
  4. public void ink()
  5. {
  6. System.out.println("选择黑白墨盒");
  7. }
  8. }

A4

  1. package interfaces;
  2. public class A4Paper implements Paper {
  3. @Override
  4. public void paper() {
  5. System.out.println("放入A4纸");
  6. }
  7. }

B5

  1. package interfaces;
  2. public class B5Paper implements Paper {
  3. @Override
  4. public void paper()
  5. {
  6. System.out.println("放入B5纸");
  7. }
  8. }

Printer

  1. package interfaces;
  2. public class Printer
  3. {
  4. private Ink ink;
  5. private Paper paper;
  6. public Printer(Ink ink, Paper paper)
  7. {
  8. this.ink = ink;
  9. this.paper = paper;
  10. }
  11. public void print()
  12. {
  13. ink.ink();
  14. paper.paper();
  15. System.out.println("打印机开始工作");
  16. }
  17. }

Test

  1. package interfaces;
  2. public class Test {
  3. public static void main(String[] args)
  4. {
  5. ColorfulInk color = new ColorfulInk();
  6. A4Paper a4 = new A4Paper();
  7. Printer printer = new Printer(color, a4);
  8. printer.print();
  9. }
  10. }

运行结果

  1. 选择彩色墨盒
  2. 放入A4
  3. 打印机开始工作

小分析

这个例子简单是简单,却说明了几个小问题
1、接口定义的抽象方法由实现接口的类去实现
2、 接口变量能够去引用一个实现接口的类的实例对象,这就是为什么color这个彩色墨盒的对象能够传递给接口变量ink的原因,不是嘛QAQ
3、 接口的多态,接口变量引用了color对象,运行时候,自动执行的color对象的ink方法,而不是接口的方法。运行时多态也体现出来了

个人感觉在某种程度上确实和抽象类很像啊,下面就来探讨一下这两者的区别

抽象类和接口的区别

抽象类的几点特性

1、抽象类不能被实例化,实例化交给子类
2、抽象方法子类必须重写
3、抽象类中可以有抽象方法也可以有实例方法
4、子类的抽象方法不能与父类的抽象方法重名
5、abstract和final是天敌,final不能被继承,abstract必须被继承
6、abstract不能和private、static、final共同修饰一个方法。因为abstract是需要被子类继承然后重写的,private就不能被继承、static无法被子类重写、final无法被继承

区别:

语法结构

上抽象类中可以有成员数据,各种类型的都OK,也可以有自己的非抽象方法,接口中只能定义抽象方法,和publi static final(就是常量)看上去接口是抽象类的一个特例哈,一个类只能继承一个抽象类,但是可以实现多个接口

设计角度

  • 抽象程度:抽象类是从整体上对这个类进行抽象,抽象程度高,而接口只是抽象这个类的某一部分,可以看做是抽象它的一部分行为
  • 跨度:抽象类是一组具有相似的类之间,接口可以是没有关系之间的类,有点像python的鸭子类型,比如鸟可以实现飞这个接口,飞机也能实现飞这个接口,但是它们两个类之间可以认为没有多大的关系,但是抽象类就不一样了。
  • 设计层次:对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。比如我们只有一个猫类在这里,如果你这是就抽象成一个动物类,是不是设计有点儿过度?我们起码要有两个动物类,猫、狗在这里,我们在抽象他们的共同点形成动物抽象类吧!所以说抽象类往往都是通过重构而来的!但是接口就不同,比如说飞,我们根本就不知道会有什么东西来实现这个飞接口,怎么实现也不得而知,我们要做的就是事前定义好飞的行为接口。所以说抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。

总结

总的来说最重要的是掌握它们的设计理念虽然是两种抽象,但是,一个是is-a的关系一个是like-a的关系,都是概念,但是总结的已经非常清楚了!这个弄明白了,之后才能更好的学习~基础很重要啊!不敢图快,囫囵吞枣咯~不然以后还是很困难的

发表评论

表情:
评论列表 (有 0 条评论,376人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java基础(13)抽象接口

    抽象类是不能被实例化的类。它们通常被用作基类,在其中声明(或部分实现)子类应该遵循的通用方法和属性。抽象类允许你定义一些方法作为抽象方法,这些方法没有具体的实现,而是留给...

    相关 Java基础——抽象接口

    一、抽象类(强制子类覆写方法) 抽象类是普通类的“超集”,只是比普通类多了一些抽象方法而已(抽象方法个数:0-N) 抽象方法所在的类必须是抽象类,子类若是继承了抽象类,必须