1、接口

接口,是Java语言中的一种引用类型,是方法的集合,如果说类的内部封装了成员变量,构造方法和成员方法,那么接口的内部主要就是封装了方法(功能),包含抽象方法(JDK及以前),默认方法和静态方法(JDK8)私有方法(JDK9)。
接口就是一种公共规范标准,只要符合规范,大家都可以用。
Java中的接口更多体现在对行为的抽象!

1>接口的基本概述:

接口的创建:

接口用关键字 interface 修饰

  1. public interface 接口名{}

接口的使用:

接口是不能创建对象,必须有实现才能实现,类实现接口用implements表示

  1. public class 类名 implements 接口名{}
  2. //接口的实现类必须重写接口中的所有的抽象方法,要么该类也是抽象类

2>接口成员的特点:

成员变量:

只能是常量,默认修饰符:public static final

成员方法:

只能是抽象方法,默认修饰符:public abstract

构造方法:

没有,接口主要是扩展功能的,而没有具体存在

3>类与接口的关系:

类与类的关系:

继承关系,只能是单继承,但可以多层继承

抽象类与接口的关系:

实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

接口与接口的关系:

继承关系,可以单继承,也可以多继承

4>抽象类和接口的区别:

成员区别:

抽象类:
变量,常量;有构造方法;有抽象方法,也有非抽象方法
接口:
常量;抽象方法

关系区别:

类与类:
继承,单继承
类与接口:
实现,可以单实现,也可以多实现
接口与接口:
继承,单继承,多继承

设计理念区别:

抽象类:
为了继承而来,让子类强制重写父类中抽象方法
接口:
对行为抽象,主要是行为

5>继承父类并实现多个接口:

  1. class 类名 [extends 父类名] implements 接口名1,接口名2,接口名3... {
  2. // 重写接口中抽象方法【必须】
  3. // 重写接口中默认方法【不重名时可选】
  4. }

2、多态

1>什么是多态?

多态是继封装,继承之后,面向对象的第三大特性
定义:同一个对象,在不同时刻表现出来的形态是不同的

2>多态的前提

1、要有继承或这个实现关系
2、要有方法的重写
3、要由父类引用指向子类对象

3>多态的格式

父类 对象 = new 子类();
抽象类 对象名 = new 抽象类子类();
接口 抽象类 = new 接口实现类();

4>多态中的成员访问特点

成员变量:
编译看父类,运行看父类
成员方法:
编译看父类,运行看子类

5>多态的好处和弊端

好处:
提高程序的扩展性,定义方法的时候,使父类型作为参数,在使用的使用,使用具体的子类型参与操作
弊端:
不能使用子类的特有成员

6>多态中的转型

当调用多态方法时,如果父类没有该方法,则需要调用子类特有的方法,就必须要做向下转型
向上转型:
多态的本省就是子类类型向父类类型向上转换的过程,这个过程是默认的

  1. 父类类型 变量名 = new 子类类型();
  2. 如:Animal a = new Cat();

向下转型:
父类类型向子类类型向下转换的过程,这个过程是强制的

  1. 子类类型 变量名 = (子类类型) 父类变量名;
  2. 如:Cat c =(Cat) a;

7>转型的异常

  1. public class Test {
  2. public static void main(String[] args) {
  3. // 向上转型
  4. Animal a = new Cat();
  5. a.eat(); // 调用的是 Cat 的 eat
  6. // 向下转型
  7. Dog d = (Dog)a;
  8. d.watchHouse(); // 调用的是 Dog 的 watchHouse 【运行报错】
  9. }
  10. }

为避免转换过程的错误,提供关键字: instanceof

  1. 变量名 instanceof 数据类型
  2. 如果变量属于该数据类型,返回true
  3. 如果变量不属于该数据类型,返回false

instanceof 代码演示

  1. public class Test {
  2. public static void main(String[] args) {
  3. // 向上转型
  4. Animal a = new Cat();
  5. a.eat(); // 调用的是 Cat 的 eat
  6. // 向下转型
  7. if (a instanceof Cat){
  8. Cat c = (Cat)a;
  9. c.catchMouse(); // 调用的是 Cat 的 catchMouse
  10. } else if (a instanceof Dog){
  11. Dog d = (Dog)a;
  12. d.watchHouse(); // 调用的是 Dog 的 watchHouse
  13. }
  14. }
  15. }