Javaにおけるオーバーライドとオーバーロード
はじめに
オーバーライドとオーバーロードは、Javaプログラミングの中核的な概念です。これらは、Javaプログラムにおいてポリモーフィズムを実現する方法です。ポリモーフィズムは、OOPSの概念の一つです。
スーパークラスと子クラスでメソッドのシグネチャ(名前とパラメータ)が同じ場合、それはオーバーライドと呼ばれます。同じクラス内の2つ以上のメソッドが同じ名前で異なるパラメータを持っている場合、それはオーバーロードと呼ばれます。
オーバーライドとオーバーロードを比較する
Overriding | Overloading |
---|---|
Implements “runtime polymorphism” | Implements “compile time polymorphism” |
The method call is determined at runtime based on the object type | The method call is determined at compile time |
Occurs between superclass and subclass | Occurs between the methods in the same class |
Have the same signature (name and method arguments) | Have the same name, but the parameters are different |
On error, the effect will be visible at runtime | On error, it can be caught at compile time |
オーバーライドとオーバーロードの例
以下には、Javaプログラム内でのオーバーロードとオーバーライドの例があります。
package com.scdev.examples;
import java.util.Arrays;
public class Processor {
public void process(int i, int j) {
System.out.printf("Processing two integers:%d, %d", i, j);
}
public void process(int[] ints) {
System.out.println("Adding integer array:" + Arrays.toString(ints));
}
public void process(Object[] objs) {
System.out.println("Adding integer array:" + Arrays.toString(objs));
}
}
class MathProcessor extends Processor {
@Override
public void process(int i, int j) {
System.out.println("Sum of integers is " + (i + j));
}
@Override
public void process(int[] ints) {
int sum = 0;
for (int i : ints) {
sum += i;
}
System.out.println("Sum of integer array elements is " + sum);
}
}
オーバーライド
プロセッサのprocess()メソッドとint i、int jパラメーターは、子クラスのMathProcessorでオーバーライドされています。7行目と23行目。
public class Processor {
public void process(int i, int j) { /* ... */ }
}
/* ... */
class MathProcessor extends Processor {
@Override
public void process(int i, int j) { /* ... */ }
}
そして、子クラスでもprocess()メソッドとint[] intsはオーバーライドされます。ライン11とライン28。
public class Processor {
public void process(int[] ints) { /* ... */ }
}
/* ... */
class MathProcessor extends Processor {
@Override
public void process(Object[] objs) { /* ... */ }
}
オーバーローディング
Processorクラスでprocess()メソッドがオーバーロードされています。7行目、11行目、15行目:
public class Processor {
public void process(int i, int j) { /* ... */ }
public void process(int[] ints) { /* ... */ }
public void process(Object[] objs) { /* ... */ }
}
結論
この記事では、Javaにおけるオーバーライドとオーバーロードについて説明しました。オーバーライドは、スーパークラスとサブクラスでメソッドの署名が同じ場合に発生します。オーバーロードは、同じクラス内の2つ以上のメソッドが同じ名前を持っているが、パラメータが異なる場合に発生します。