Javaのメソッド呼び出しとシグニチャを徹底解説!初心者でもわかる基本ルール
生徒
「Javaでメソッドを呼び出すときに、エラーになることがあるんですけど、どうすればいいんですか?」
先生
「それは、呼び出し先のメソッドのシグニチャが合っていない場合が考えられます。メソッドの仕組みと注意点を詳しく見ていきましょう!」
1. メソッド呼び出しの基本
Javaでは、メソッドを呼び出す際に「名前」と「引数のリスト(シグニチャ)」を一致させる必要があります。メソッド名(引数1, 引数2, ...)の形式で記述し、定義されたメソッドと一致するものがない場合、コンパイルエラーになります。
以下のコードで基本を確認しましょう:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
int result = calc.add(5, 10); // 正しい呼び出し
System.out.println("Result: " + result);
}
}
実行結果:
Result: 15
このコードでは、addメソッドは引数として2つのint型の値を受け取ると定義されています。calc.add(5, 10)は正しいシグニチャで呼び出されているため、正常に動作します。
2. シグニチャとは?
シグニチャは、メソッド名と引数リストの組み合わせのことを指します。同じ名前のメソッドが複数存在する場合でも、シグニチャが異なれば別のメソッドとして扱われます。この機能を「オーバーロード」と呼びます。
次の例を見てみましょう:
public class OverloadExample {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
public static void main(String[] args) {
OverloadExample example = new OverloadExample();
System.out.println(example.add(5, 10)); // int型のaddメソッドを呼び出す
System.out.println(example.add(5.5, 10.5)); // double型のaddメソッドを呼び出す
}
}
実行結果:
15
16.0
この例では、addメソッドが異なる引数型で定義されています。呼び出し時に渡す引数の型に応じて、適切なメソッドが選ばれます。
3. エラーになるケース
メソッド呼び出しでエラーが発生するのは、次のような場合です:
- 指定したメソッドが存在しない。
- 引数の数や型が定義と一致しない。
- アクセス修飾子の制限により、メソッドが使用できない。
以下のコードはエラーの例です:
public class Sample {
public int multiply(int a, int b) {
return a * b;
}
}
public class Main {
public static void main(String[] args) {
Sample sample = new Sample();
System.out.println(sample.multiply(10)); // コンパイルエラー: 引数が1つしかない
}
}
この場合、multiplyメソッドは2つの引数を受け取るように定義されていますが、呼び出し側で1つの引数しか渡していないため、コンパイルエラーが発生します。
4. 試験対策:メソッド呼び出しの確認ポイント
メソッド呼び出しに関連する試験問題を解く際には、以下の点に注意してください:
- シグニチャが正しいか確認する:メソッド名と引数リストが一致しているかを確認。
- インスタンスが必要か確認する:インスタンスメソッドの場合は、
newを使ってインスタンスを生成。 - アクセス修飾子に注意:対象のメソッドが利用可能な範囲にあるか確認。
次のコードで復習しましょう:
public class Validator {
public boolean isValid(String input) {
return input != null && !input.isEmpty();
}
}
public class Main {
public static void main(String[] args) {
Validator validator = new Validator();
System.out.println(validator.isValid("Java")); // 正しい呼び出し
// System.out.println(validator.isValid()); // コンパイルエラー: 引数が不足
}
}
このコードでは、引数を正しく指定している場合にのみ正常に動作します。試験問題でもシグニチャの確認を徹底しましょう。
5. メソッドのシグニチャに含まれないもの
「シグニチャ」について学習する際、初心者が最も間違いやすいポイントが、戻り値の型はシグニチャに含まれないというルールです。Javaがどのメソッドを呼び出すか判断する基準は、あくまで「名前」と「引数の並び」だけです。
例えば、次のような2つのメソッドを同じクラス内に定義することはできません。
public class SignatureError {
// 引数の構成が同じで、戻り値だけが違う場合は定義不可
public int calculate(int x) { return x * 2; }
// public double calculate(int x) { return x * 2.0; } // コンパイルエラー!
}
もし戻り値だけで区別できてしまうと、calculate(10); とだけ書かれたときに、Javaはどちらのメソッドを実行して良いか分からなくなってしまいます。アクセス修飾子(publicやprivateなど)も同様にシグニチャには含まれません。
6. 引数の型による暗黙の型変換(プロモーション)
メソッドを呼び出す際、引数の型が完全に一致していなくても、より大きな型へ自動的に変換できる場合はエラーにならずに呼び出せることがあります。これを数値のプロモーション(格上げ)と呼びます。
public class PromotionExample {
public void printNumber(double n) {
System.out.println("値は: " + n);
}
public static void main(String[] args) {
PromotionExample ex = new PromotionExample();
int myInt = 100;
ex.printNumber(myInt); // intからdoubleへ自動変換して呼び出せる
}
}
値は: 100.0
このように、int を double を受け取るメソッドに渡すことは可能ですが、逆(double を int のメソッドに渡す)はデータの欠落が発生するため、明示的なキャストがない限りコンパイルエラーになります。
7. staticメソッドとインスタンスメソッドの呼び出し分け
メソッド呼び出しのルールには、もう一つ重要な「static(静的)」かどうかの区別があります。これによって、呼び出し時の書き方が大きく変わります。
- インスタンスメソッド:
newでオブジェクトを作ってから、変数名を使って呼び出す。 - staticメソッド: オブジェクトを作らずに、
クラス名.メソッド名()で直接呼び出す。
public class Tools {
public static void sayHello() {
System.out.println("Hello!");
}
}
public class Main {
public static void main(String[] args) {
// staticメソッドは new しなくても呼び出せる
Tools.sayHello();
}
}
もし static が付いていないメソッドを Tools.method() のように呼び出そうとすると、コンパイルエラーになります。呼び出したいメソッドの定義をしっかり見て、どちらの形式が必要か判断する習慣をつけましょう。
まとめ
Javaにおけるメソッド呼び出しの基本ルールとエラーになりやすいポイントについて学びました。メソッドは、名前だけでなくシグニチャ(引数の数や型)によって区別されます。特に、引数が不足していたり型が一致しない場合にはコンパイルエラーが発生するため、事前に正しいシグニチャを確認することが重要です。また、オーバーロードを活用することで、同じ名前でも異なる引数リストを持つメソッドを実装できることも確認しました。
以下のコードで復習しましょう:
public class Example {
public int multiply(int a, int b) {
return a * b;
}
public double multiply(double a, double b) {
return a * b;
}
public static void main(String[] args) {
Example example = new Example();
System.out.println(example.multiply(5, 10)); // 正しい呼び出し: int型
System.out.println(example.multiply(5.5, 10.5)); // 正しい呼び出し: double型
// System.out.println(example.multiply(5)); // コンパイルエラー: 引数不足
}
}
上記のコードでは、正しいシグニチャで呼び出す場合には正常に動作しますが、引数不足や型の不一致がある場合にはエラーになります。このように、シグニチャの確認を徹底することで、エラーを回避しやすくなります。
生徒
「シグニチャの確認が重要だと分かりましたが、オーバーロードを使う場合に注意すべき点は何ですか?」
先生
「オーバーロードを使う場合、引数の型や順序を明確にしておくことが大切です。また、同じ型の引数が複数あると曖昧さが生じることがあるので、場合によっては明示的なキャストを使うと安全です。」
生徒
「なるほど!これからはメソッドを定義するときにシグニチャを意識するようにします!」