初級問題 (9問)
メソッド基礎
- 引数なしメソッド: “Hello, World!”と表示する
greetメソッドを作成してください。 - 引数ありメソッド: 名前を受け取り、”Hello, [名前]!”と表示する
greetWithNameメソッドを作成してください。 - 戻り値ありメソッド: 2つの整数を受け取り、その和を返す
addメソッドを作成してください。 - メソッドのオーバーロード:
addメソッドを、double型にも対応できるようにオーバーロードしてください。 - voidメソッド: 受け取った数値が偶数か奇数かを表示する
checkEvenOddメソッドを作成してください。 - 複数引数メソッド: 3つの整数を受け取り、その平均を返す
averageメソッドを作成してください。 - 文字列操作メソッド: 文字列を受け取り、その長さを返す
getStringLengthメソッドを作成してください。 - ローカル変数: メソッド内でローカル変数を使用する例を作成してください。
- メソッド呼び出し: mainメソッドから他のメソッドを呼び出す例を作成してください。
中級問題 (15問)
クラス基礎
- クラス定義:
Personクラスを定義し、nameとageのフィールドを持たせてください。 - コンストラクタ:
Personクラスに、nameとageを初期化するコンストラクタを追加してください。 - ゲッター/セッター:
Personクラスに、nameとageのゲッターとセッターを追加してください。 - メソッド追加:
Personクラスに、自己紹介をするintroduceメソッドを追加してください。 - オブジェクト生成: mainメソッドで
Personクラスのインスタンスを生成し、メソッドを呼び出してください。 - 複数オブジェクト: 2つの
Personオブジェクトを生成し、それぞれ異なるデータを設定してください。 - staticメソッド:
MathUtilityクラスを作成し、円の面積を計算するstaticメソッドを追加してください。 - static変数:
Personクラスに生成されたインスタンスの数をカウントするstatic変数を追加してください。 - カプセル化:
BankAccountクラスを作成し、残高(balance)をprivateで宣言し、適切なアクセスメソッドを追加してください。 - thisキーワード: コンストラクタやメソッドで
thisキーワードを使用する例を作成してください。
問題20
Personオブジェクトを格納した配列を作成し、拡張for文(for-each)を使用して各オブジェクトのintroduce()メソッドを呼び出すプログラムを作成してください。以下の条件をすべて満たすこと。
条件
- 要素数3のPerson配列を作成すること。
- 配列の1番目の要素にnew Person(“山田”, 20)を代入すること。
- 配列の2番目の要素にnew Person(“佐藤”, 25)を代入すること。
- 配列の3番目の要素にnew Person(“田中”, 30)を代入すること。
- 拡張for文(for-each)を使用して、配列内のすべてのPersonオブジェクトに対してintroduce()メソッドを呼び出すこと。
※ Personクラスには、名前と年齢を受け取るコンストラクタPerson(String name, int age)と、自己紹介を表示するintroduce()メソッドが実装されているものとします。
問題21
整数配列の要素をすべて合計して返すsumArrayメソッドを作成してください。以下の条件をすべて満たすこと。
条件
- メソッド名はsumArrayとする。
- 引数はint[] numbersとする。
- 拡張for文(for-each)を使用して配列の全要素を順番に取り出すこと。
- すべての要素の合計を計算し、その結果をint型で返すこと。
実行例
int[] numbers = {10, 20, 30, 40};
System.out.println(sumArray(numbers));
実行結果
100
問題22
Personオブジェクトを格納した配列を返すcreatePeopleメソッドを作成してください。以下の条件をすべて満たすこと。
条件
- メソッド名はcreatePeopleとする。
- 戻り値の型はPerson[]とする。
- 要素数が2のPerson配列を作成すること。
- 1番目の要素にはnew Person(“Alice”, 25)を代入すること。
- 2番目の要素にはnew Person(“Bob”, 30)を代入すること。
- 作成した配列を返すこと。
※ Personクラスには、名前と年齢を受け取るコンストラクタPerson(String name, int age)が実装されているものとします。
実行例
Person[] people = createPeople();
System.out.println(people[0].getName());
System.out.println(people[1].getName());
実行結果
Alice
Bob
問題23
Personオブジェクトの情報を表示するprintPersonInfoメソッドを作成してください。以下の条件をすべて満たすこと。
条件
- メソッド名はprintPersonInfoとする。
- 引数はPerson personとする。
- 引数がnullの場合は、Personオブジェクトがnullですと表示し、メソッドの処理を終了すること。
- 引数がnullでない場合は、person.introduce()を呼び出すこと。
※ Personクラスにはintroduce()メソッドが実装されているものとします。
実行例
printPersonInfo(null);
実行結果
Personオブジェクトがnullです
問題24
変更できない学生情報を表すStudentクラスを作成してください。以下の条件をすべて満たすこと。
条件
- クラス名はStudentとし、継承できないようにfinalを付けること。
- 学生名を表すprivate final String nameフィールドを定義する。
- 学籍番号を表すprivate final int idフィールドを定義する。
- コンストラクタでnameとidを初期化すること。
- nameを取得するpublic String getName()メソッドを作成すること。
- idを取得するpublic int getId()メソッドを作成すること。
- フィールドの値を変更するためのsetterメソッドは作成しないこと。
実行例
Student student = new Student("田中", 1001);
System.out.println(student.getName());
System.out.println(student.getId());
/*
**実行結果**
田中
1001*/
上級問題 (6問)
問題25
整数の階乗を再帰処理で求めるfactorialメソッドを作成してください。以下の条件をすべて満たすこと。
条件
- メソッド名はfactorialとする。
- 引数はint nとする。
- nが1以下の場合は1を返すこと。
- nが2以上の場合は、再帰呼び出しを利用して階乗を求めること。
- 繰り返し文(for文やwhile文)は使用しないこと。
実行例
System.out.println(factorial(5));
System.out.println(factorial(3));
System.out.println(factorial(1));
*/
**実行結果**
120
6
1/*
問題26
riskyMethodメソッドを呼び出した際に発生する例外を処理するプログラムを作成してください。以下の条件をすべて満たすこと。
条件
- public static void riskyMethod() throws Exceptionメソッドを作成する。
- riskyMethod()内では、new Exception("何か問題が発生しました")をthrowして例外を発生させること。
- mainメソッドからriskyMethod()を呼び出すこと。
- mainメソッドではtry-catch文を使用し、発生した例外をcatchすること。
- catchブロックでは、e.getMessage()を利用して以下の形式でエラーメッセージを表示すること。
問題27
任意個の整数を受け取り、その平均値を返すaverageメソッドを作成してください。以下の条件をすべて満たすこと。
条件
- メソッド名はaverageとする。
- 引数には可変長引数(int... numbers)を使用する。
- 引数として受け取ったすべての整数の平均値をdouble型で返すこと。
- 引数が1つも渡されなかった場合は、0を返すこと。
実行例
System.out.println(average(10, 20, 30));
System.out.println(average(5, 10));
System.out.println(average());
/*
**実行結果**
20.0
7.5
0.0
*/
問題28
文字列を連結するMyStringBuilderクラスを作成してください。以下の条件をすべて満たすこと。
条件
- クラス名はMyStringBuilderとする。
- 文字列を保持するprivate String valueフィールドを定義する。
- コンストラクタではvalueを空文字("")で初期化する。
- public MyStringBuilder append(String str)メソッドを作成する。
- append()メソッドでは、引数で受け取った文字列をvalueの末尾に追加し、自分自身(this)を返すこと。
- public String toString()メソッドを作成し、現在保持している文字列を返すこと。
実行例
MyStringBuilder sb = new MyStringBuilder();
sb.append("Hello")
.append(" ")
.append("World");
System.out.println(sb.toString());
/*
**実行結果**
Hello World
*/
問題29
Productクラスを作成してください。以下の条件をすべて満たすこと。
条件
- クラス名はProductとする。
- 商品名を表すprivate String nameフィールドを定義する。
- 価格を表すprivate double priceフィールドを定義する。
- コンストラクタはprivateにして、外部から直接インスタンスを生成できないようにする。
- public static Product createProduct(String name, double price)メソッドを作成する。
- createProduct()メソッド内でProductのインスタンスを生成し、そのインスタンスを返すこと。
実行例
Product product = Product.createProduct("ノートPC", 98000);
このように、new Product(...)を使用せず、createProduct()メソッドからインスタンスを取得できるように実装してください。
問題30
Singletonクラスを作成してください。以下の条件をすべて満たすこと。
条件
- クラス名はSingletonとする。
- インスタンスを保持するためのprivate staticフィールドinstanceを定義する。
- コンストラクタはprivateにして、外部からnewできないようにする。
- public static Singleton getInstance()メソッドを作成する。
- getInstance()が初めて呼び出されたときだけSingletonのインスタンスを生成し、それ以降は同じインスタンスを返すこと(遅延初期化)。
実行例
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);
実行結果
true
Javaのメソッドとクラス基礎 解答例
初級問題の解答
- 引数なしメソッド
public static void greet() {
System.out.println("Hello, World!");
}
- 引数ありメソッド
public static void greetWithName(String name) {
System.out.println("Hello, " + name + "!");
}
- 戻り値ありメソッド
public static int add(int a, int b) {
return a + b;
}
- メソッドのオーバーロード
public static double add(double a, double b) {
return a + b;
}
- voidメソッド
public static void checkEvenOdd(int num) {
if (num % 2 == 0) {
System.out.println(num + "は偶数です");
} else {
System.out.println(num + "は奇数です");
}
}
- 複数引数メソッド
public static double average(int a, int b, int c) {
return (a + b + c) / 3.0;
}
- 文字列操作メソッド
public static int getStringLength(String str) {
return str.length();
}
- ローカル変数
public static void exampleMethod() {
int localVar = 10; // ローカル変数
System.out.println(localVar);
}
- メソッド呼び出し
public static void main(String[] args) {
greet();
greetWithName("Alice");
int sum = add(5, 3);
System.out.println("合計: " + sum);
}
中級問題の解答
- クラス定義
class Person {
String name;
int age;
}
- コンストラクタ
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
- ゲッター/セッター
class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- メソッド追加
class Person {
// ... 他のコード ...
public void introduce() {
System.out.println("こんにちは、私は" + name + "です。" + age + "歳です。");
}
}
- オブジェクト生成
public static void main(String[] args) {
Person person = new Person("田中", 25);
person.introduce();
}
- 複数オブジェクト
Person person1 = new Person("佐藤", 30);
Person person2 = new Person("鈴木", 22);
person1.introduce();
person2.introduce();
- staticメソッド
class MathUtility {
public static double calculateCircleArea(double radius) {
return Math.PI * radius * radius;
}
}
- static変数
class Person {
private static int count = 0;
public Person() {
count++;
}
public static int getCount() {
return count;
}
}
- カプセル化
class BankAccount {
private double balance;
public double getBalance() {
return balance;
}
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
}
}
}
- thisキーワード
class Person {
private String name;
public Person(String name) {
this.name = name; // thisでフィールドを参照
}
public void setName(String name) {
this.name = name;
}
}
- 配列とオブジェクト
Person[] people = new Person[3];
people[0] = new Person("山田", 20);
people[1] = new Person("佐藤", 25);
people[2] = new Person("田中", 30);
for (Person person : people) {
person.introduce();
}
- メソッド配列引数
public static int sumArray(int[] numbers) {
int sum = 0;
for (int num : numbers) {
sum += num;
}
return sum;
}
- オブジェクト配列戻り値
public static Person[] createPeople() {
Person[] people = new Person[2];
people[0] = new Person("Alice", 25);
people[1] = new Person("Bob", 30);
return people;
}
- nullチェック
public static void printPersonInfo(Person person) {
if (person == null) {
System.out.println("Personオブジェクトがnullです");
return;
}
person.introduce();
}
- 不変オブジェクト
final class Student {
private final String name;
private final int id;
public Student(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public int getId() {
return id;
}
}
上級問題の解答
- 再帰的メソッド
public static int factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
- 例外処理
public static void riskyMethod() throws Exception {
throw new Exception("何か問題が発生しました");
}
public static void main(String[] args) {
try {
riskyMethod();
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
- 可変長引数
public static double average(int... numbers) {
if (numbers.length == 0) return 0;
int sum = 0;
for (int num : numbers) {
sum += num;
}
return (double)sum / numbers.length;
}
- メソッドチェーン
class MyStringBuilder {
private String value;
public MyStringBuilder() {
value = "";
}
public MyStringBuilder append(String str) {
value += str;
return this;
}
public String toString() {
return value;
}
}
// 使用例
MyStringBuilder sb = new MyStringBuilder();
sb.append("Hello").append(" ").append("World");
System.out.println(sb.toString());
- ファクトリメソッド
class Product {
private String name;
private double price;
private Product(String name, double price) {
this.name = name;
this.price = price;
}
public static Product createProduct(String name, double price) {
return new Product(name, price);
}
}
- シングルトンパターン
class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}