🐈
Java Silver 勉強④
【出題項目の例】
- Javaの基本データ型と文字列の操作
- 演算子と制御構造
- 配列の操作
- クラスの宣言とインスタンスの使用
- メソッドの作成と使用
- カプセル化の適用
- 継承による実装の再利用
- インタフェースによる抽象化
- 例外処理
- モジュール・システム
クラスの宣言とインスタンスの使用
1. クラスの基本構造
public class Sample {
// フィールド (メンバ変数)
int num;
String text;
// コンストラクタ
public Sample(int num, String text) {
this.num = num;
this.text = text;
}
// メソッド
public void show() {
System.out.println("num: " + num + ", text: " + text);
}
}
ポイント
- クラス名は
PascalCase
(例:SampleClass
) - フィールド、メソッドは
camelCase
(例:sampleMethod
) -
this
はインスタンスのフィールドと引数を区別するために使用
2. インスタンスの作成
public class Main {
public static void main(String[] args) {
// インスタンスの生成
Sample sample = new Sample(10, "Hello");
// メソッドの呼び出し
sample.show();
}
}
ポイント
-
new
を使ってインスタンスを生成 - コンストラクタの引数を渡してフィールドを初期化
-
インスタンス名.メソッド名()
でメソッドを呼び出す
3. コンストラクタのオーバーロード
public class Sample {
int num;
String text;
// 引数なしコンストラクタ
public Sample() {
this(0, "Default");
}
// 引数ありコンストラクタ
public Sample(int num, String text) {
this.num = num;
this.text = text;
}
public void show() {
System.out.println("num: " + num + ", text: " + text);
}
}
public class Main {
public static void main(String[] args) {
Sample s1 = new Sample(); // デフォルト値が設定される
Sample s2 = new Sample(20, "Java");
s1.show();
s2.show();
}
}
ポイント
- コンストラクタを複数定義(オーバーロード)できる
-
this(引数)
を使って、他のコンストラクタを呼び出せる
4. フィールドのアクセス修飾子
public class Sample {
private int num; // privateなので外部から直接アクセス不可
public Sample(int num) {
this.num = num;
}
// getterメソッド
public int getNum() {
return num;
}
// setterメソッド
public void setNum(int num) {
this.num = num;
}
}
ポイント
-
private
フィールドは直接アクセス不可(カプセル化) -
getter
/setter
を使ってアクセス
5. staticメンバ
public class Sample {
static int count = 0; // クラス変数
public Sample() {
count++; // インスタンスが作られるたびに増加
}
public static void showCount() {
System.out.println("Total instances: " + count);
}
}
public class Main {
public static void main(String[] args) {
new Sample();
new Sample();
Sample.showCount(); // Total instances: 2
}
}
ポイント
-
static
フィールドは クラスに属する変数(全インスタンスで共有) -
static
メソッドは インスタンスを生成せずに呼び出せる -
インスタンス名.メソッド名()
ではなく、クラス名.メソッド名()
で呼び出す
==
vs equals
)
6. オブジェクトの比較 (public class Main {
public static void main(String[] args) {
String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1 == s2); // false (参照が異なる)
System.out.println(s1.equals(s2)); // true (内容が同じ)
}
}
ポイント
-
==
→ 参照アドレスを比較 -
.equals()
→ **値(内容)**を比較
7. まとめ
概念 | 説明 |
---|---|
クラスの宣言 |
class クラス名 { } で定義 |
インスタンス生成 |
new クラス名() でオブジェクト作成 |
コンストラクタ | インスタンスの初期化に使用 |
フィールド |
private で隠蔽し、getter / setter を使う |
static |
クラス変数・クラスメソッドとして共有 |
== vs .equals()
|
== は参照比較、.equals() は値比較 |
メソッドの作成と使用
1. メソッドの基本構造
メソッドは、再利用可能な処理(ロジック)のまとまりで、以下の要素で構成される。
[アクセス修飾子] 戻り値の型 メソッド名(引数リスト) {
// メソッド本体
return 戻り値; // 戻り値がvoidの場合は不要
}
例:
public int add(int a, int b) {
return a + b;
}
ポイント
-
アクセス修飾子:
public
、private
、protected
などでアクセス範囲を指定 -
戻り値の型: メソッドが返す値の型。返さない場合は
void
を指定 -
メソッド名: 命名規則は
camelCase
で記述(例:calculateSum
) - 引数リスト: メソッドに渡す値を定義。複数ある場合はカンマ区切り
2. メソッドの呼び出し
定義したメソッドは、メソッド名(引数) の形で呼び出す。
- インスタンスメソッドの場合:オブジェクトを生成してから呼び出す
- staticメソッドの場合:クラス名を指定して直接呼び出す
例:
// インスタンスメソッドの呼び出し
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
}
}
// staticメソッドの呼び出し
public class MathUtil {
public static int multiply(int a, int b) {
return a * b;
}
}
public class Main {
public static void main(String[] args) {
int product = MathUtil.multiply(3, 4);
System.out.println("Product: " + product); // 出力: Product: 12
}
}
3. メソッドのオーバーロード
同一クラス内で、メソッド名は同じだが、引数リストが異なる複数のメソッドを定義することができる。
※ 戻り値の型だけが異なる場合はオーバーロードとはならない。
例:
public class Printer {
public void print(String message) {
System.out.println(message);
}
// 引数の型・数が異なるのでオーバーロード
public void print(int number) {
System.out.println(number);
}
}
4. 戻り値とvoidメソッド
-
戻り値ありのメソッド:処理結果を返すため、
return
文を使用する - voidメソッド:値を返さず、処理のみ実行する
例:
// 戻り値あり
public String getGreeting(String name) {
return "Hello, " + name;
}
// voidメソッド
public void printGreeting(String name) {
System.out.println("Hello, " + name);
}
5. 引数とメソッド内のスコープ
- 引数はメソッドの呼び出し時に渡され、メソッド内でのみ利用できるローカル変数として扱われる
- ローカル変数も同様に、宣言されたブロック内でのみ有効
例:
public void displayValue(int value) {
int doubled = value * 2; // ローカル変数
System.out.println("Doubled: " + doubled);
}
6. staticメソッドとインスタンスメソッドの違い
- staticメソッド:クラスに属し、インスタンス生成なしで利用可能
- インスタンスメソッド:オブジェクトごとに異なる状態(フィールド)にアクセス可能
判断基準:
「処理がオブジェクトの状態に依存するか否か」を考える。
→ 状態に依存しなければstatic
、依存する場合はインスタンスメソッドとする。
7.まとめ
項目 | ポイント |
---|---|
メソッド宣言 | アクセス修飾子、戻り値の型、メソッド名、引数リスト、メソッド本体 |
メソッド呼び出し | インスタンスメソッドはオブジェクト経由、staticメソッドはクラス名経由 |
戻り値とvoid | 戻り値あり:return 文、void:値を返さず処理のみ実行 |
オーバーロード | 同一クラス内でメソッド名は同じでも、引数リストが異なれば可能 |
引数のスコープ | メソッド内でのみ有効。ローカル変数と同様に扱われる |
staticの使いどころ | インスタンスに依存しない共通処理、ユーティリティメソッドなど |
スコープとは?
「スコープ」とは、プログラム内で変数やメソッドが有効となり、参照できる範囲のことです。
-
ローカル変数のスコープ
メソッド内やブロック(例えば、if文やfor文の中)で宣言された変数は、そのブロック内でのみ使用可能です。ブロックの外では参照できません。public void sampleMethod() { int localVar = 10; // この変数はsampleMethod()の中だけで有効 if (localVar > 5) { int blockVar = 20; // この変数はifブロック内だけで有効 System.out.println(blockVar); } // System.out.println(blockVar); // コンパイルエラー:blockVarはここでは見えない }
-
インスタンス変数(フィールド)のスコープ
クラス内で宣言されたフィールドは、クラス全体(インスタンス全体)で有効です。クラスのどのメソッドからでもアクセスできます。public class Sample { private int instanceVar = 5; // クラス全体で有効 public void display() { System.out.println(instanceVar); // 有効 } }
-
クラス変数(staticフィールド)のスコープ
staticで宣言された変数は、クラスに属し、どのインスタンスからも共有され、クラス内のどこでもアクセスできます。public class Sample { public static int staticVar = 100; public static void displayStatic() { System.out.println(staticVar); // 有効 } }
まとめ
- ローカル変数は、宣言されたブロック内でのみ有効。
- フィールドは、クラス全体で有効。
- static変数は、クラスレベルで共有され、どこからでもアクセス可能です。
この概念は、プログラムの構造を整理し、意図しない変数の参照や上書きを防ぐために非常に重要です。
Discussion