接口
概述:
- 是java语言中的一种引用类型,是方法的集合,接口内部封装了方法,包含抽象方法(JDK7),默认方法和静态方法(JDK8),私有方法(JDK9)。接口也会被编译成.class文件,但是它不是类,是引用数据类型。
格式:
-
public interface 接口名{ //抽象方法:供子类实现使用 public abstract void method1(); //默认方法,default不可省略,供子类调用或者重写 public default void mothod2(); //静态方法,供接口直接调用 public static void mothod3(); //私有方法、私有静态方法,供接口中的默认方法或者静态方法使用 private void mothod4() { //... } }
接口的实现类与接口的关系为实现关系,即类实现接口,该类称为接口的实现类,也可以称为接口的子类。实现使用implement关键字。
非抽象子类实现
- 必须重写接口中的所有抽象方法
- 继承了接口中的默认方法,既可以直接调用,也可以重写
格式
-
class 类名 implement 接口名 { //重写抽象方法.. //重写默认方法时,default关键字不保留 }
接口的多实现
- 一个类是可以实现多个接口的,称为接口的多实现,并且一个类可以继承一个父类,同时实现多个接口。
-
class 子类名 [extends 父类名] implement 接口1,接口2,接口3...{ // 重写接口中的抽象方法.... }
- 父类方法与接口中的默认方法重名时,子类会就近执行父类中的方法
接口的多继承
- 接口是可以继承多个接口的,接口的继承用extends关键字修饰。如果父接口有默认方法重名,子接口必须重写一次,并且default关键字要保留。
其他特点
- 接口中无法定义成员变量,但是可以定义常量,默认使用public static final修饰(后面的常量名最好使用大写,并用下划线分隔单词)
- 接口中没有构造方法,所以无法创建对象
- 接口中没有静态代码块
多态
定义:
- 是指同一种行为,有多种不同的表现形式
多态的格式体现
- 父类引用指向子类对象
-
父类类型 变量名 = new 子类类型(); Fu z = new Zi();
- 当多态方式调用方法时,首先检查父类中是否有该方法,如果无,编译报错,如果有,则执行子类的重写方法。
多态的好处
- 在实际开发过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展性和便利。
引用数据类型转换
-
向上转型:多态本身是子类类型向父类类型转换的过程,这个过程是默认的
- 向下转型:父类类型向子类类型转换的过程。
-
子类类型 变量名 = (子类类型) 父类变量名; Cat c = (cat) a;
- 向下转型的意义:使用多态调用方法时,不能调用子类拥有但是父类中没有的方法,所以如果想调用子类特有的方法,需要向下转型。
-
// 定义类 public abstract class Animal{ public abstract void eat(); } public class Cat extends Animal { @Override public void eat() { System.out.println("吃鱼"); } public void catchMouse() { System.out.println("抓老鼠"); } } public class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void watchHouse() { System.out.println("看家"); } } //定义测试类 public class Test { public static void main(String[] args) { // 向上转型 Animal a = new Cat(); a.eat(); // 调用的是 Cat 的 eat // 向下转型 Cat c = (Cat)a; c.catchMouse(); // 调用的是 Cat 的 catchMouse } }
类型转换异常
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 【运行报错】
}
}
- 因为创建的是Cat对象,所以不能转为Dog对象。为避免ClassCastException的发生,可以使用instanceof关键字
-
/* 变量名 instanceof 数据类型 如果变量属于该类型,返回true,否则返回false */ 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 } } }