Java-04 接口(Interface)&多态

2020-06-12  本文已影响0人  哆啦_

接口

接口的英文是Interface,作为开发者应该都很熟悉这个单词,比如常常说的API就是(Application Programming Interface)应用编程接口,提供给开发者调用的一组功能,无需提供源码

java中的接口就是一系列方法声明的集合,用来定义规范、标准

接口中可以定义的内容

public interface Waiter {
  int AGE = 10;
  // 跟上一行代码完全等价
  // public static final int AGE = 10;
  public abstract void cleanUp();
  public abstract void cook();
}

接口细节

抽象类与接口对比

抽象类和接口的用途还是有些相似的,该如何选择?

接口的升级

当对接口进行升级时(比如,增加了接口中的方法),那么之前实现了该接口的类都需要进行修改(因为需要实现接口中定义的所有方法),java8之后提供了两种不需要改动其他类就对接口进行升级的方法

  1. 默认方法(Default Mehod)
  2. 静态方法
默认方法的使用

默认方法是以defalut修饰的实例方法,且默认方法需要有方法实现

// 默认方法需要有方法实现 
  default void test() {

  }
默认方法的细节

静态方法

public interface Waiter {
  static void eat(){
    System.out.println("接口的静态方法");
  }
}
// 通过接口名来调用静态方法
Waiter.eat();

多态

跟OC中类似

类方法的调用细节

public class Animal {
  public static void run() {
    System.out.println("Animal -- run");
  }
}

public class Dog extends Animal {
  public static void run(){
    System.out.println("Dog -- run");
  }
}

    Animal.run();// Animal -- run
    Dog.run();// Dog -- run

    Dog dog = new Dog();
    // 实例也能调用类方法 但会有警告
    dog.run();// Dog -- run

    Animal dog2 = new Dog();
    // 这里调用的是Animal的类方法
    dog2.run();// Animal -- run

我们可能以为dog2会打印Dog的方法,其实不然,因为类方法跟对象实例无关,只跟类型有关,dog2调用run方法时会看dog2的类型,这里是Animal,所以会调用Animal的类方法

而且,Dog并不是重写了Animal的方法,因为在Java中只有实例方法才有重写/覆盖的概念,但是这里Dog和Animal中都是类方法,不存在重写

成员变量的访问细节

public class Person {
  public int age = 1;
  public int getPAge(){
    return age;
  }
}

public class Teacher extends Person {
  public int age = 3;
  @Override
  public int getPAge() {
    return age;
  }
  public int getTAge(){
    return age;
  }
}


Teacher tea1 = new Teacher();
System.out.println(tea1.age);// 3
System.out.println(tea1.getPAge());// 3
System.out.println(tea1.getTAge());// 3

Person tea2 = new Teacher();
// 这里访问的是Person的成员变量
System.out.println(tea2.age);// 1
System.out.println(tea2.getPAge());// 3

多态表现在实例方法的调用上,对于成员变量来说,会在其声明类型中查找,所以tea2的age会打印1

上一篇下一篇

猜你喜欢

热点阅读