一、接口
1. 接口的介绍
接口是Java中一种引用类型,是方法的集合。接口中主要封装了方法,包含抽象方法(JDK 1.7 之前),默认方法、静态方法(JDK 8),私有方法(JDK 9)。
2. 接口的使用
① 格式
public interface 接口名{
//抽象方法(JDK 1.7 之前)
//默认方法(JDK 8)
//静态方法(JDK 8)
//私有方法(JDK 9)
}
② 抽象方法(☆☆☆☆☆)
//与抽象类相似
public interface Inter{
public abstract void method();
}
② 默认方法
//主要用于升级接口,防止以前的实现类报错,新创建的实现类可以覆盖默认方法。
//接口中有多个默认方法是,实现类都可以继承使用。
public interface Inter{
public default void method(){
System.out.println("run···");
}
}
③ 静态方法
//直接使用接口已经完成的现成功能。
public interface Inter{
public static void method(){
System.out.println("run···");
}
}
④ 私有方法
//用于抽取接口中相同的代码块
//1.私有方法:只有默认方法可以调用
public default void methodA(){
method();
}
public default void methodB(){
method();
}
private void method() {
System.out.println("runA···");
System.out.println("runB···");
}
//2.私有静态方法:默认方法和静态方法都可以调用
public default void methodA(){
method();
}
public static void methodB(){
method();
}
private static void method() {
System.out.println("runA···");
System.out.println("runB···");
}
⑤ 注意
* 接口不能直接 new
* 调用接口原本的默认方法:接口名.super.默认方法名();
* 静态方法属于接口,只能通过:接口名.静态方法名() 调用。
3. 接口的多实现
① 格式
* 继承并实现
public class 类名 extends 抽象类 implement 接口名{
//方法体
}
* 多实现
public class 类名 [ extends Object ] implement 接口名1, 接口名2,··· ,接口名n {
//方法体
}
* 多继承
public interface 类名 extends 接口名1, 接口名2,··· ,接口名n {
//方法体
}
② 注意
* 如果抽象方法有重名,则只需要重写一次。
* 如果默认方法有重名,则必须重写。
* 那个接口在前则那个接口优先级高。
二、多态
1. 多态的介绍
* 多态是指同一种行为有多种不同的表现形式
2. 多态的使用
① 格式
* 父类引用指向子类对象;接口引用指向实现类对象。
* 父类 变量名 = new 子类(); 或 接口 变量名 = new 实现类();
例: Fu f = new Zi(); 或 Inter inter = new InterImpl();
② 注意
* 多态调用成员变量时:编译看左,运行看左。即:父类没有则不能使用
* 多态调用成员方法时:编译看左,运行看右。即:父类没有则不能通过编译
③ 类型转换
* 向上转型(默认):父类 变量名1 = new 子类();
例:Fu f = new Zi();
* 向下转型(强制):子类 变量名2 = ( 子类 ) 变量名1;
例:Zi z = (Zi) f;
* 为什么要向下转型:使用多态方式无法调用子类特有方法。
* 向下转型需要注意只有以前是这个类才能转。
例:Animal animal = new Cat();
Cat c = (Cat)animal;
* instanceof 用来判断向下转型时是否属于该类。
例:animal istanceof Cat
④ 多态的好处
* 实际开发中,父类类型作为方法形式参数,传递子类对象,更能体现多态的扩展性与便利性
* 示例
//父类
public abstract class Phone {
public abstract void price();
}
//子类,联想
public class LenovoPhone extends Phone{
public void price1() {
System.out.println("3999");
}
}
//子类,华为
public class HonorPhone extends Phone{
public void price2() {
System.out.println("6999");
}
}
//测试类
public class Test{
public static void main(String[] arg) {
//父类引用指向子类对象
Phone phone = new LenovoPhone();
method(phone);
}
//判断属于那个子类
public void method(phone phone) {
if(phone instanceof LenovoPhone) {
//向下强转
LenovoPhone lp = (LenovoPhone)phone;
//调用联想手机类独有方法
lp.price1();
System.out.println("这是联想手机");
}
if(phone instanceof HonorPhone) {
//向下强转
HonorPhone hp = (HonorPhone)phone;
//调用华为手机类独有方法
hp.price2();
System.out.println("这是华为手机");
}
}
}