1、接口
接口,是Java语言中的一种引用类型,是方法的集合,如果说类的内部封装了成员变量,构造方法和成员方法,那么接口的内部主要就是封装了方法(功能),包含抽象方法(JDK及以前),默认方法和静态方法(JDK8)私有方法(JDK9)。
接口就是一种公共规范标准,只要符合规范,大家都可以用。
Java中的接口更多体现在对行为的抽象!
1>接口的基本概述:
接口的创建:
接口用关键字 interface 修饰
public interface 接口名{}
接口的使用:
接口是不能创建对象,必须有实现才能实现,类实现接口用implements表示
public class 类名 implements 接口名{}
//接口的实现类必须重写接口中的所有的抽象方法,要么该类也是抽象类
2>接口成员的特点:
成员变量:
只能是常量,默认修饰符:public static final
成员方法:
构造方法:
3>类与接口的关系:
类与类的关系:
抽象类与接口的关系:
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口与接口的关系:
4>抽象类和接口的区别:
成员区别:
抽象类:
变量,常量;有构造方法;有抽象方法,也有非抽象方法
接口:
常量;抽象方法
关系区别:
类与类:
继承,单继承
类与接口:
实现,可以单实现,也可以多实现
接口与接口:
继承,单继承,多继承
设计理念区别:
抽象类:
为了继承而来,让子类强制重写父类中抽象方法
接口:
对行为抽象,主要是行为
5>继承父类并实现多个接口:
class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {
// 重写接口中抽象方法【必须】
// 重写接口中默认方法【不重名时可选】
}
2、多态
1>什么是多态?
多态是继封装,继承之后,面向对象的第三大特性
定义:同一个对象,在不同时刻表现出来的形态是不同的
2>多态的前提
1、要有继承或这个实现关系
2、要有方法的重写
3、要由父类引用指向子类对象
3>多态的格式
父类 对象 = new 子类();
抽象类 对象名 = new 抽象类子类();
接口 抽象类 = new 接口实现类();
4>多态中的成员访问特点
成员变量:
编译看父类,运行看父类
成员方法:
编译看父类,运行看子类
5>多态的好处和弊端
好处:
提高程序的扩展性,定义方法的时候,使父类型作为参数,在使用的使用,使用具体的子类型参与操作
弊端:
不能使用子类的特有成员
6>多态中的转型
当调用多态方法时,如果父类没有该方法,则需要调用子类特有的方法,就必须要做向下转型
向上转型:
多态的本省就是子类类型向父类类型向上转换的过程,这个过程是默认的
父类类型 变量名 = new 子类类型();
如:Animal a = new Cat();
向下转型:
父类类型向子类类型向下转换的过程,这个过程是强制的
子类类型 变量名 = (子类类型) 父类变量名;
如:Cat c =(Cat) a;
7>转型的异常
public class Test {
public static void main(String[] args) {
// 向上转型
Animal a = new Cat();
a.eat(); // 调用的是 Cat 的 eat
// 向下转型
Dog d = (Dog)a;
d.watchHouse(); // 调用的是 Dog 的 watchHouse 【运行报错】
}
}
为避免转换过程的错误,提供关键字: instanceof
变量名 instanceof 数据类型
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。
instanceof 代码演示
public class Test {
public static void main(String[] args) {
// 向上转型
Animal a = new Cat();
a.eat(); // 调用的是 Cat 的 eat
// 向下转型
if (a instanceof Cat){
Cat c = (Cat)a;
c.catchMouse(); // 调用的是 Cat 的 catchMouse
} else if (a instanceof Dog){
Dog d = (Dog)a;
d.watchHouse(); // 调用的是 Dog 的 watchHouse
}
}
}