Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ private修飾子 | クラス応用
Javaクラスとコアメカニクス

bookprivate修飾子

メニューを表示するにはスワイプしてください

他のクラスからフィールドやメソッドを隠す方法

アクセス修飾子は、Javaにおいて変数やメソッドの可視性とアクセス性を制御するために使用される。これにより、クラスの特定のメンバーへのスコープやアクセス制限を定義できる。

アクセス修飾子については前のセクションですでに説明した。ここでは、最も一般的に使用されるアクセス修飾子であるprivateについて詳しく見ていく。

ご存知の通り、privateアクセス修飾子を使うと、そのフィールドやメソッドは定義されたクラス内からのみアクセスできる。private修飾子の使用例を見てみよう。

例えば、あるクラスの変数を他のクラスから見えないように、またはアクセスできないようにしたい場合、privateアクセス修飾子を使用する。

Main.java

Main.java

copy
123456789101112131415
package com.example; public class Main { public static void main(String[] args) { Person bob = new Person(); bob.name = "Bob"; System.out.println(bob.name); } } class Person { private String name; private int age; private String gender; }

Personクラスのフィールドはprivateとして宣言されている。フィールドを直接初期化しようとすると、エラーが発生し、nameフィールドがprivateアクセス修飾子を持っているため、mainメソッド内で呼び出したり変更したりできないことが示される。

プライベートフィールドの初期化方法

この保護を回避する最も簡単な方法は、コンストラクタによる初期化を利用すること。ただし、この方法ではオブジェクトのフィールドを初期化することはできるが、そのフィールドにアクセスすることはできない。 例を見てみよう:

Main.java

Main.java

copy
123456789101112131415161718
package com.example; public class Main { public static void main(String[] args) { Person bob = new Person("Bob"); System.out.println(bob.name); } } class Person { private String name; private int age; private String gender; public Person(String name) { this.name = name; } }

コンストラクタを通じてnameフィールドを初期化することはできましたが、このフィールドにアクセスしてSystem.out.println()で出力することはできません。この制限を回避するために、オーバーライドしてtoString()メソッドを定義すると、System.out.println(bob);を呼び出した際にフィールドの情報が表示されるようになります。 例を見てみましょう:

Main.java

Main.java

copy
1234567891011121314151617181920212223
package com.example; public class Main { public static void main(String[] args) { Person bob = new Person("Bob"); System.out.println(bob); } } class Person { private String name; private int age; private String gender; public Person(String name) { this.name = name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } }

最終的に、name オブジェクトの bob フィールドの値を表示することができました。これは、オーバーライドされた toString() メソッドを使用し、その中で name を表示するロジックを実装することで実現しました。

それでは、これほど多くの追加コードを書く必要があるのに、なぜこのアクセス修飾子が必要なのでしょうか?

異なるクラスで同じ名前の変数が存在する場合があり、そのような場合には他のクラスが不要なフィールドにアクセスできないように、これらのクラスの変数を隠す必要があります。どのフィールドがどのクラスに属しているかを理解できるため、コードを書く際の利便性が大幅に向上します。

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 5.  3

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 5.  3
some-alt