JavaSE基础知识(十九)--Java接口(抽象类初步)

Java SE 是什么,包括哪些内容(十九)?

本文内容参考自Java8标准
再次感谢Java编程思想对本文的启发!
接口为我们提供了一种将接口与实现分离的更加结构化的方法
接口这种机制在编程语言中并不通用。例如,C++对这些概念只有间接的支持。但在Java中却有专门的关键字:interface,这表明了人们认为它是很重要的,以至于提供了对它的直接支持。
但是在了解接口之前,我们必须还要知道什么是抽象类,它是普通类接口之间的一种中庸之道。尽管在构建具有某些未实现方法的类时,你的第一想法可能是创建接口,但是抽象类仍旧是用于此目的的一种重要而必须的工具,因为你不可能总是使用纯接口。

简单描述普通类、抽象类、接口

1、普通类: 普通类就是一般的类,什么是一般的类?按照一般的逻辑,你在完成一个类的时候,这个类会有类变量,会有方法。实际上,重点就在方法,因为普通类中的每个方法你都必须给它确切的实现,也就是说,普通类中的每个方法都是有对应的用处的,都是有具体的实现的,都是可以被调用从而达到某种目的的。
或者换一个角度来理解,普通类都是代表了一种具体的对象(因为它是具体的数据类型,所有的类变量都将初始化为固定的值,所有的方法都将实现成那个具体对象的行为模式,符合它的行为特性),比如餐具中的小刀,餐叉,勺子等,或者是飞机中的战斗机、轰炸机,直升机等。
代码示例:

// 普通类
   class Spoon{
      //对应的类变量
      int length = 1;
      int height = 2;
      //...其他内容等,比如组合的对象。
      //...
      
      //对应行为模式的方法
      public void get(){
         //方法的具体实现
         //...
      }
      public String toString(){
         //方法的具体实现
         //...
      } 
      //...其他方法等... 
   }

2、抽象类: 抽象类其实很好理解,就是比普通类在某些方面更抽象一些,具体来说就是用关键字"abstract"修饰的类就是抽象类:
如图:
多了一个关键字abstract,就变成了抽象类。
抽象类普通类 有如下这么几个区别:
⑴、比普通类多了一个关键字"abstract"。
⑵、不能创建对象实例。
抽象类是不能通过关键字new创建对象实例的,因为是抽象类,它很抽象
如图:
抽象类不能创建对象实例
现在,我将关键字"abstract"去掉,其他内容不做任何改动,看下效果:
类First变成了一个普通类,可以正常使用
从图示中看出,将关键字"abstract"去掉,类First瞬间就变成了一个普通类,可以创建对象实例了。
⑶、抽象类可以拥有抽象方法(普通类不能有抽象方法)。
抽象方法和普通方法的区别是:1、抽象方法需要关键字abstract声明;2、抽象方法没有方法体,也就是没有{ }(就是没有任何的方法实现)
图示:
抽象方法没有方法体
有的书上会说,拥有抽象方法的类就是抽象类,我觉得逻辑是有问题的,因为本身它应该是先成为抽象类,然后才能在类里面去定义抽象方法,所以,我个人认为,有关键字abstract修饰的类就是抽象类。
那么,现在的问题是,为什么需要抽象类,这里简易说一下:
实际上,普通类是拥有完全实现,接口是根本没有任何实现,而抽象类只有部分实现,可以说它一半是接口(抽象方法声明就与接口的方法声明类似),一半是普通类(有实现的方法与普通类中的方法没任何区别),所以,当你想编制一个类,在这个类中的部分内容必须使用你的实现,必须和这个类捆绑在一起,但是又有另外一部分的内容允许子类去实现,那么你可以选择抽象类,将你的实现内容按照普通类的规则编写,将需要子类实现的内容声明为抽象方法,待子类继承后再实现。
实际上,抽象类的存在就是为了代码复用,它专门是留着被其它子类继承的。
目前,我能想到的抽象类可能使用的场景就是 某些类型产品的系列,比如手机,有iphoneX系列,有iphoneXS系列等等。那么普通类对应的就是iphoneX 白色 256G这样具体的手机,以及手机具体的功能。
3、接口: 接口实际上也是一个类,因为它确实是代表了一种类型,但是它的关键字不是"class",而是"interface"。
如图:
接口
从图示中可以看出,接口就只有方法的声明,是没有任何实现的。
接口有以下几个特点:
⑴、关键字是"interface",不是"class"
⑵、接口中不能有任何private修饰的变量(也就是字段),但是可以有public和没有任何访问权限修饰词的变量。
虽然没有明确声明,但是只要是接口中的变量,默认都是static final的,也就是说接口中的变量和对象没关系,然后一旦被初始化了就不能再被改变。
如图:
①、不能有private修饰的变量:
private修饰的变量报错
②、可以有public和没有任何访问权限修饰词的变量:
可以有public和没有任何访问权限修饰词的变量

⑶、接口不能创建对象实例。
⑷、接口是用来实现的,关键字不是extends,而是implements。
⑸、一旦一个类实现一个接口,就要实现接口中所有的方法。
一般来说,接口代表的是一类事物,比如,餐具、汽车、飞机、食品、建筑等等,它不指代具体的东西。都是比较泛类型的。
拿餐具来说,接口可以代表餐具,抽象类代表钢制的餐具、铁制餐具,塑料餐具,普通类代表了具体的某一件餐具。
拿汽车来说,接口可以代表汽车,抽象类代表跑车、家轿、公交车。普通类代表了丰田牌的家轿等等。

有很多的例子,在这里,我要提醒一句很重要的话:无论是抽象类还是接口,其实,它们的存在都和多态是紧密相关的。
PS:时间有限,有关Java SE的内容会持续更新!今天就先写这么多,如果有疑问或者有兴趣,可以加QQ:2649160693,并注明CSDN,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值