接口(interface)
1、接口是什么
就相当于同一个地区中的一个插座,开放了插口,只要有电器想要通电,都可以用它插头插入到插口中。接口,就相当于一个规范一样。
接口的核心作用:解耦合,将组件之间的耦合度降低。
原先,在团队开发中,如果要实现一个功能的话,需要指定一个开发者在某个指定的类写中一个方法来实现,然后需要调整的时候又要从头开头开始分析,会影响到当前开发者的工作。现在,需要实现一个功能很简单。按模块分开进行开发,每人负责一个内容,这个内容只需要某个工程师熟悉即可,实现功能之后提供接口给其他同事使用即可,如果有问题,只需要负责的工程师调试即可。其他人都不需要理会,只需要负责自己的业务逻辑即可。
2、 接口也是一种类型
与抽象类,几乎一样。但它比抽象类,还要抽象。接口是功能的集合,也可以看做是一种数据类型。
3、接口的使用方式
使用接口,需要提供一个接口类,使用 interface 修饰。 另外还需要提供一个实现类,用于实现接口。使用 implements 关键字实现指定的接口。接口中的方法,只提供方法声明,不提供方法的实现细节。即接口不能被实例化。为了安全,不向外提供方法实现,只需要返回对应结果即可。
4. 接口的好处
因为方法也可以认为是功能,功能的定义可以与实现进行分离。当功能的细节需要进行更改的时候,我们不需要去修改方法的定义。我们只需要去对应的实现中进行更新即可。
好处就是,方法的调用者不需要针对功能改变而改变方法的调用。
5、宗旨
一切事物都有功能(方法),每个功能都需要把定义和实现进行分离,也就是说,一切事物都有接口。
6、接口的初始化
因为接口中没有实现,new 了之后得不到需要的实现细节,所以不能 new。我们需要初始化实现类,然后可以使用接口类型的变量接收实例。
7. JDK9 接口的新特性
使用 default 关键字来修饰接口定义,可以设置默认值,可以不用强制在实现类中实现。如果需要覆盖默认值的话,重写方法即可。
8、接口的多个实现类
在前面,我们学习的继承,只能够是单继承,不能是多继承。
使用了接口,其实可以在一定情况下,弥补了不能多继承的缺点。
【可能出现的问题】在实现的时候,我们需要同时实现所有接口中必须要重写的方法。而且,要花很多精力来处理好不同接口之间方法的关系,和详细逻辑,调用的时候容易出现混乱。
【解决方案】尽量在继承父接口后的子类中,使用额外的方法体来处理整个需要获取的数据。做到整合使用。
步骤如下:
1. 需要重写方法,没有关系,直接重写即可。
2. 最好添加一些容易识别的方法,共调用者使用,获取对应的数据即可。
9 、 接口和抽象类的区别
狗: 宠物狗、缉毒犬、导盲犬 ---> 狗类(叫、咬、吃)abstract
当某些事物有许多共同属性的时候,我们可以使用抽象类。
当某些事物有独特的行为、额外的功能的时候,我们可以使用接口。
相同点:
1)都是跟继承有联系的,位于继承的顶端,主要是给其他类实现或者继承。
2)都不能够进行实例化。抽象类的子类来实例化,接口的实现类来实例化。
3)都可以包含抽象方法,子类在使用的时候,都需要去重写(覆盖)这些声明出来的方法。
不同点:
1)抽象类为部分方法提供实现,避免子类重复去实现这些方法,可以提高代码的重用性。 接口只能是包含抽象方法的定义。
2)一个类可以继承一个父类(抽象类),但我们可以实现多个接口,接口可以用来弥补 Java 的单继承缺点。
3)抽象类主要是指一个事物中应该要有的内容,比如是 is..a 关系。
4)接口主要是指一个事物中额外的内容,比如是 like..a 关系。
如何选择使用:
1)通过实际工作的效率上分析,要多用接口,少用抽象类。
2)当需要定义子类的行为,还要为子类提供共有性能的时候,才选用抽象类。
多态:
多态的特点:
1)最终的多态体现在父类引用变量可以指向子类对象。
Person person = new Son();
2)多态的前提是必须要有子父类关系或者类实现接口关系,否则不能完成多态建设。
3)在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
eat(); 细嚼慢咽
大林 --- 狼吞虎咽 √
person.eat();
语法格式:
父类类型 变量名 = new 子类类型();
1. 普通类型多态定义
2. 抽象类多态定义
3. 接口多态定义
同一个父类的方法可以给多个不同的子类进行重写,在调用方法的时候,都是调用各个不同子类中重写后的方法。
多态的成员变量
当子类和父类中都出现同名的成员变量,多态在使用成员变量的时候有两个时期赋值:编译时、运行时。
1)编译时:当我们的引用类型变量所对应的类中没有被调用的成员变量,则会编译失败。
2)运行时:调用的是引用类型变量所对应的类中的成员变量的值。
也就是说,如果在调用成员变量的时候,需要看赋值符号左边到底是哪个类?就需要用这个类中的成员变量。
多态的成员方法
1)编译时:当父类中定义的方法,子类中必须要重写。否则编译不通过,报错。
2)运行时:看赋值符号右边到底实例化的是哪一个类?就用哪一个类中的成员方法。
总结:成员变量看赋值符号左边,成员方法看赋值符号右边。
多态的向上和向下转型:
向上转型的话,其实是把子类对象赋值给一个直接父类的引用。这个过程是一个向上转型。
如果我们直接 new 直接一个父类,没有办法实现向下转型。
向上转型的使用注意点:
动物类:Animal 子类:Dog、Cat
向上转型的好处就是可以隐藏子类类型,提供了代码的扩展性。
不好的地方,就是只能使用父类中共有的内容,如果想要使用子类中独有的内容时,需要额外向下转型才行。
1)什么时候用向上转型?
当我们不需要面对之类类型进行操作的时候,为了提供扩展性,或者使用父类功能就可以完成对应的操作就可以考虑
使用向上转型。
2)什么时候用向下转型?
当要使用子类独有的功能时,必须要向下转型。
另外,在进行转化的时候,需要留意时候会包 ClassCastException 异常。
面向对象中三大特性的主要目的:
封装:把对象的属性和方法的实现细节隐藏起来,可以对外提供一些公共方法进行访问。public 共有的, private 私有的
继承:希望子类拥有父类中所有能用的功能,然后还可以在子类中进行增强。当需要注意,Java 只有单继承。
多态:结合继承和方法的重写来提高代码的复用性和功能增强(扩展性)。
构造器:
构造器(构造函数、构造方法)
每一个类都有一个隐藏的无参构造器,主要是用来初始类的实例的。
配合 new 关键字来使用,当开始 new 的时候,构造器就会被执行,会在堆内存中开辟一个空间存储对象实例。
如果我们直接使用无参的构造器,所得到的实例是空的,没有任何值的。
如果一个类中,出现一个有参构造器,则会默认覆盖无参构造器。
如果还要用到无参构造器,需要我们手动添加出来才行。
如何理解?
无参构造器:就相当于你老妈生你一样 —— 什么都没没有,只会哭。
有参构造器:就相当于哪吒老妈生他一样 —— 生出来就会有风火轮、圈圈、枪。
构造器的总结:
1. 构造器没有返回值,也不用去添加。
2. 主要用来构造对象,创建完对象之后,就结束了,只执行一次。
3. 构造器的名字,必须要和类名一致。
4. 一个类中可以存在多个构造器,主要是以重载的形式存在。
5. 可以使用 private 进行修饰,但修饰之后其他地方不能调用了。
网友评论