接口
一. 接口概念
二.接口的代码体现
在代码体现中,接口的更为抽象表现为其内的所有方法均为抽象方法,同时不定义普通的成员变量(可以定义静态常量,在后边介绍)。
如同抽象类,接口在使用时同样不能创建对象。
类与接口的关系为实现关系,即类实现接口。实现的动作类似继承,只是关键字不同,实现使用implements。
其他类(实现类)实现接口后,就相当于声明:”我应该具备这个接口中的功能”。实现类仍然需要重写方法以实现具体的功能。
三.接口定义
a) 定义关键字
与定义类的class不同,接口定义时需要使用interface关键字。
定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件。这点可以让我们将接口看做是一种只包含了功能声明的特殊类。
b) 定义格式
使用interface代替了原来的class,其他步骤与定义类相同:
方法均为公共访问的抽象方法
无法定义普通的成员变量
public interface 接口名 {
抽象方法1;
抽象方法2;
抽象方法3;
}
如:
public interface Careable {
public abstract void carCare();
}
四. 接口使用
a) 类实现接口
我们使用实现来表示一个类与一个接口之间的关系,这是最常用的使用方法。
实现的关键字为implements。
格式:
Class类 implements接口 {
重写接口中方法
}
在实现后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑。
则:
接口中定义功能,一切类需要具有该功能时均可以实现该接口,只声明了应该具备该方法,是功能的生命。
具体实现类中重写方法,实现功能,是方法的具体实现。
于是,通过以上两个动作将功能的声明与实现便分开了。(此时请重新思考:类是现实事物的描述,接口是功能的集合。)
a) 接口继承接口
如同类继承类后便拥有了父类的成员,可以使用父类的非私有成员。A接口继承B接口后,A接口便拥有了A、B两个接口中所有的抽象方法。
b) 定义接口变量使用多态
接口经常参与多态。在后边多态时,我们详细讲解。
这里我们需要清楚,接口也是一种特殊的数据类型,就可以定义变量、作为参数声明、作为返回值声明、作为成员变量声明。
五.接口注意事项
Java支持一个类同时实现多个接口。
Java支持一个接口同时继承多个接口。
类可以在继承一个类的同时,实现多个接口。
接口与父类的功能可以重复,均代表要具备某种功能,并不冲突。
接口中的成员是有固定修饰符的,如果没有写,也会自动加入:
“变量”修饰符为:public static final
方法修饰符为:public abstract(所以依据方法重写的访问权限注意事项,重写接口方法时,必须使用public)
当一个类实现了接口时,必须实现其所有的方法,否则这个类会保留一些抽象方法,此时,该类包含了抽象方法,便必须定义为一个抽象类。
六.接口与抽象类的辨析
1. 概念辨析
当"我是你的一种时",子类继承父类,即代表了类与类之间的关系,该体系的类都应该具备父类的成员。
当"我应该像你一样具备这些功能时",类实现接口,即代表类与功能的关系,将功能的声明与实现分离。并不是该体系内所有类都需要的额外功能。
2 .使用辨析
类继承类extends,只能单继承
接口继承接口extends可以多继承
类实现接口implements可以多实现
接口不可以继承类!
抽象类中可以有非抽象方法
接口中全部为抽象方法
抽象类具有成员变量
接口没有普通的成员变量
抽象类中的成员无固定修饰符
接口中的成员有固定修饰符
多态
一.多态概述
多态是继封装、继承之后面向对象的第三大特性。
现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态。
Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
二. 多态概念
Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。
如Student类可以为Person类的子类。那么一个Student对象既可以赋值给一个Student类型的引用,也可以赋值给一个Person类型的引用。
最终多态体现为父类引用变量可以指向子类对象。
多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。
多态优点:
配合继承与方法重写提高了代码的复用性与扩展性,如果没有方法重写,则多态同样没有意义。
三. 多态的定义与使用格式
父类引用指向子类对象就是多态的定义格式。同一个父类的方法会被不同的子类重写为各自的具体实现。在调用方法时,调用的为各个子类重写后的方法。
父类类型 变量名 = new 子类类型();
变量名.方法名();
当变量名指向不同的子类对象时,由于每个子类重写父类方法的内容不同,所以会调用不同的方法。
四. instanceof关键字
我们可以通过instanceof关键字来判断某个对象是否属于某种数据类型。如学生的对象属于学生类,学生的对象也属于人类。
使用格式:
boolean b = 对象 instanceof 数据类型
五.向上转型与向下转型
向上转型:当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,这个过程是向下转型。如果是直接创建父类对象,是无法向下转型的!
六. 多态细节规则
编译时,检查父类引用变量的数据类型是否包含对应的成员方法与成员变量。
运行时,成员方法调用子类重写方法,没有用private修饰的成员变量访问时,访问的为父类类型的。
或简单记忆:只有在调用方法时,调用的时子类重写方法,其他一切表现均为父类类型。
七.多态的使用场景
我们一般在以下场景当中使用多态:
成员变量赋值、局部变量赋值
方法传参
返回值返回值