0%

一般方法覆盖

一、基本概念

“覆盖”针对“一般方法”而言。
覆盖一般方法须满足以下两个条件:

  • 覆盖方法所在类须继承被覆盖方法所在类,覆盖方法所在类须可继承被覆盖方法
  • 覆盖方法与被覆盖方法方法声明完全一致或者变种一致

接下来着重介绍“变种一致”的所有情形。

二、变种一致

2.1、修饰符

2.1.1、abstract修饰符

被覆盖方法额外具有“abstract”修饰符。

package chapter8;

abstract class Parent {

  abstract int f();
}

public class Child extends Parent {

  int f() {
    return 10;
  }
}

2.1.2、synchronized修饰符

被覆盖方法或者覆盖方法额外具有“synchronized”修饰符。

package chapter8;

class Parent {

  synchronized int f() {
    return 20;
  }
}

public class Child extends Parent {

  int f() {
    return 10;
  }
}
package chapter8;

class Parent {

  int f() {
    return 20;
  }
}

public class Child extends Parent {

  synchronized int f() {
    return 10;
  }
}

2.1.3、final修饰符

覆盖方法额外具有“final”修饰符。

package chapter8;

class Parent {

  int f() {
    return 20;
  }
}

public class Child extends Parent {

  final int f() {
    return 10;
  }
}

2.1.4、访问权限控制符

覆盖方法的访问权限控制符权限大于被覆盖方法的访问权限控制符。

package chapter8;

class Parent {

  int f() {
    return 20;
  }
}

public class Child extends Parent {

  public int f() {
    return 10;
  }
}

2.1.5、native修饰符

被覆盖方法或者覆盖方法额外具有“native”修饰符。

package chapter8;

class Parent {

  int f() {
    return 20;
  }
}

public class Child extends Parent {

  native int f();
}
package chapter8;

class Parent {

  native int f();
}

public class Child extends Parent {

  int f() {
    return 20;
  }
}

2.2、返回结果

Java SE5中添加了协变返回类型,覆盖方法可以返回被覆盖方法返回类型的某种导出类型。

package chapter8;

class Grain {

  public String toString() {
    return "Grain";
  }

}

class Wheat extends Grain {

  public String toString() {
    return "Wheat";
  }
}

class Mill {

  Grain process() {
    return new Grain();
  }
}

class WheatMill extends Mill {

  Wheat process() {
    return new Wheat();
  }
}

public class CovariantReturn {

  public static void main(String[] args) {
    Mill m = new Mill();
    Grain g = m.process();
    System.out.println(g);
    m = new WheatMill();
    g = m.process();
    System.out.println(g);
  }
}
您的支持将鼓励我继续分享!