Javaにおけるオーバーライドとオーバーロード

イントロダクション

オーバーライドオーバーローディングは、Javaプログラミングにおける中核的な概念です。これらはJavaプログラムでポリモーフィズムを実装する方法です。ポリモーフィズムはOOPSコンセプトの一部です。

Screenshot of Java code with arrows pointing at instances where overloading and overriding are occurring.

メソッドのシグネチャ(名前とパラメータ)がスーパークラスと子クラスで同じ場合、それはオーバーライドと呼ばれます。同じクラス内の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.journaldev.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は、Processorクラスの子クラスでもオーバーライドされています。行11と行28:

public class Processor {

    public void process(int[] ints) { /* ... */ }

}

/* ... */

class MathProcessor extends Processor {

    @Override
    public void process(Object[] objs) { /* ... */ }

}

オーバーローディング

process()メソッドは、Processorクラスでオーバーロードされています。行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つ以上のメソッドが同じ名前を持ち、異なるパラメータを持つ場合に発生します。

Source:
https://www.digitalocean.com/community/tutorials/overriding-vs-overloading-in-java