18#面向对象特征:多态

18.1接口

18.1.1接口的概念

  • 接口是功能的集合,比抽象类更抽象,是一个实现类。
  • 只描述所应具备的方法,没有具体实现,由接口的实现类来完成。
  • 将定义和实现进行了分离

18.1.2接口的定义

public interface 接口名 {
   /*
    * 接口中只能定义常量;
    * static代表被类名.调用,final最终固定住变量的值
    * pubic static final可以省略不写,也可以选择性书写
    */
   public static final int a = 1;
   变量2;
   变量3;
   /*
    * public abstract修饰符可不写,也可以选择性书写
    */
   public abstract 返回值类型 方法名字(参数列表); 
   抽象方法2;
   抽象方法3;
}
  • 接口编译后仍为从.java到.class文件
  • 接口中的方法都是公共访问的抽象方法
  • 接口中无法定义普通的成员变量,只能定义常量

18.1.3类实现接口

class 类 implements 接口 {
   重写接口中的方法
}
  • 实现类实现接口但是没有全部重写抽象方法,这个实现类是一个抽象类

18.1.4类实现多接口

class 类 impelements Inter1, Inter2 {
   ... ...
}
  • 多实现没有安全隐患,关键在于接口中的方法都是抽象方法,没有主体
  • 多实现解决了单继承的局限性

18.1.5重复定义

public interface A {
   public abstract void a();
} 

public interface B {
   public abstract int a();
} 

public class C implements A,B {
   public void a() {
      ......
   }
   public int a() {
      ......
   }
}
  • 避免出现以上情况
  • 这不是方法的重载 

 

18.1.6类继承类的同时实现接口

18.1.7接口的多继承

  • 类没有多继承,接口有多继承
interface D extends A,B,C {
   ......
}

18.1.8接口的好处(面向接口编程)

  • 接口的出现扩张了功能
  • 接口其实就是暴露出来的规则
  • 接口的出现降低了耦合性,设备与设备之间实现了解耦

18.1.9接口与抽象类的区别

  • 抽象类为部分方法提供了实现,避免了子类重复实现这些方法,提高了代码的复用性。接口只能包含抽象方法。
  • 一个类只能继承一个直接父类,却可以实现多个接口。
  • 抽象类中是你应当具备的内容,继承体系类似于is...a 
  • 接口是这个事物的额外功能,继承体系类似于like...a
  • 优先用接口,因为耦合性低
  • 需要定义子类的行为又要为子类提供共性功能时才选用抽象类

18.2多态

18.2.1多态的概述

  • 同一对象可以有多种形态,多态的前提是继承。
  • 体现:父类引用指向子类对象。
  • 分类:类的多态,接口的多态。
  • 在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
public static void main(String[] args) {
   Student s = new Student();
   Person p = new Student();
}

18.2.2多态的定义和使用格式

  • 普通多态的定义格式
class Fu {}
class Zi extends Fu {}
main () {
   Fu fu = new Zi();
}
  • 抽象类多态定义的格式
  • 接口多态定义的格式

18.2.3多态-成员的特点

class Fu { int a = 1}
class Zi { int a = 2}
main() {
   Fu f = new zi;
   f.a; // a = 1;
}
  • 对于成员变量和成员方法而言,在编译的时候,参考父类有没有这个变量或方法
  • 在运行的时候,调用的变量运行的是父类中的变量
  • 在运行的时候,调用的方法运行的是父类中的方法
  • 总结:(方法)编译看左边运行看子类;(变量)编译运行都看左边;

18.2.4instanceof关键字

  • 比较引用数据类型:一个引用数据类型的变量是不是这个类型的对象
  • instanceof关键字用于有继承关系的两个类
boolean b = p instanceof Student;

18.2.5多态中的转型

  • 向上转型(可以调用子类父类的公共属性,但是不能调用子类特有的方法)
Fu f = new Zi(); //范围小的子类向上转型提升为范围大的父类
  • 向下转型(可以调用子类特有的方法)
Student stu = (Student)p; //变量p指向Student对象;

猜你喜欢

转载自blog.csdn.net/weixin_43660263/article/details/86535494