【Java】アクセス修飾子と非アクセス修飾子を解説します!
Javaには、アクセス修飾子と非アクセス修飾子の2種類の修飾子があります。
Javaのアクセス修飾子は、フィールド、メソッド、コンストラクタ、クラスのアクセシビリティ、スコープを指定します。アクセス修飾子を適用することで、フィールド、コンストラクタ、メソッド、クラスのアクセスレベルを変更できます。
アクセス修飾子 -アクセスレベルを制御します
非アクセス修飾子 -アクセスレベルを制御しませんが、他の機能を提供します
Javaの非アクセス修飾子
クラスの場合は、finalかabstractを使用できます
装飾子 | 説明 |
---|---|
final | finalクラスは他のクラスから継承できません。クラスにfinal修飾子を付けた場合は、そのクラスは継承することが出来なくなります。 |
abstract | クラスを使用してオブジェクトを作成することはできません。抽象クラスにアクセスするには、別のクラスから継承する必要があります。 |
attributes とメソッドは、下記のいずれかを使うことができます。
装飾子 | 説明 |
---|---|
final | 属性とメソッドはオーバーライド/変更できません |
static | 属性とメソッドはオブジェクトではなくクラスに属します。staticは、主にメモリ管理に使用されます。変数やメソッド、ブロック等、静的キーワードを適用できます。 | abstract | 抽象クラスでのみ使用でき、メソッドでのみ使用できます。 メソッドには実態がありませんのでそれ自体では使用できません。抽象クラスにアクセスするには、別のクラスから継承する必要があります。継承して初めて継承元で使うことができます。 |
transient | トランジェントは、シリアライゼーションで使用される変数修飾子です。初期化時に、特定の変数の値をファイルに保存したくない場合は、transientを使用します。 | synchronized | メソッドは一度に1つのスレッドのみがアクセスできます |
volatile | 属性の値はスレッドローカルにキャッシュされず、常に「メインメモリ」から読み取られます。 |
Javaのアクセス修飾子
以下のためのクラスは、次のいずれかを使用することができますpublicまたはデフォルト:
Javaのアクセス修飾子には4つのタイプがあります。
装飾子 | 説明 |
---|---|
public | public修飾子のアクセスレベルはどこにでもあります。クラス内、クラス外、パッケージ内、パッケージ外からアクセスできます。 |
private | プライベート修飾子のアクセスレベルは、クラス内のみです。クラス外からはアクセスできません。 |
default | デフォルト修飾子のアクセスレベルは、パッケージ内のみです。パッケージの外部からはアクセスできません。アクセスレベルを指定しない場合は、それがデフォルトになります。 |
protected | 保護された修飾子のアクセスレベルは、子クラスを通じてパッケージ内およびパッケージ外にあります。子クラスを作成しないと、パッケージの外部からアクセスできません。 |
final
javaのfinal修飾子はクラス、メソッド、変数全てにつけることができます。しかし、それぞれ意味が異なります。
クラスにつける場合は、そのクラスは継承することが出来なくなります。
クラスのメソッドにfinalを付けた場合、子クラスでのオーバーライドが不可になります。
変数にfinalを付けると値の変更ができなくなります。
変数にfinalを付ける場合、下記のように宣言します。
例
1 2 3 4 5 6 7 8 9 10 11 |
public class FlyTech { final int x = 10; final double PI = 3.14; public static void main(String[] args) { FlyTech myObj = new FlyTech(); myObj.x = 50; // エラーが発生します:最終変数に値を割り当てることができません myObj.PI = 25; // エラーが発生します:最終変数に値を割り当てることができません System.out.println(myObj.x); } } |
FlyTech.java:7: error: cannot assign a value to final variable x
myObj.x = 50;
FlyTech.java:8: error: cannot assign a value to final variable PI
myObj.PI = 25;
^ 2 errors
static
staticは、クラスとは異なり、オブジェクトを作成することなくアクセスすることができます。Javaのstaticキーワードは、主にメモリ管理に使用されます。変数、メソッド、ブロック、ネストされたクラスを含む静的キーワードを適用できます。staticキーワードは、クラスのインスタンスではなくクラスに属しています。。
例
staticとpublicメソッドの違いを示す例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class FlyTech { // Static method static void myStaticMethod() { System.out.println("オブジェクトを作成せずに静的メソッドを呼び出す"); } // Public method public void myPublicMethod() { System.out.println("オブジェクトを作成してパブリックメソッドを呼び出す必要あり"); } // Main method public static void main(String[ ] args) { myStaticMethod(); // staticメソッドを呼び出す // myPublicMethod(); // エラーを出力します FlyTech myObj = new FlyTech(); // FlyTechメソッドを作成します myObj.myPublicMethod(); // publicメソッドを呼び出します } } |
オブジェクトを作成せずに静的メソッドを呼び出す
オブジェクトを作成してパブリックメソッドを呼び出す必要あり
Abstract
abstractこの方法は、に属しabstract、それ自体は実行できません。継承されて初めて使うことができます。なぜ実行できないモノを作成するのかというと、管理しやすいからです。大きなプログラムになっていけばいくほど見にくく、管理しにくくなっていきます。その時に Abstractを使用していると、コーディングに制限をかけることができ、ある程度の品質は担保できるようになります。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 抽象クラス abstract class Person { public String fname = "Flytech"; public int age = 24; public abstract void study(); // abstract メソッド } // サブクラス(Personから継承) class Student extends Person { public int graduationYear = 2018; public void study() { // 抽象メソッドの本体はここ System.out.println("一日中プログラミング"); } } class FlyTech { public static void main(String[] args) { //Studentクラスのオブジェクトを作成します(これはPersonから属性とメソッドを継承します) Student myObj = new Student(); System.out.println("名前: " + myObj.fname); System.out.println("年齢: " + myObj.age); System.out.println("卒業年: " + myObj.graduationYear); myObj.study(); // 抽象メソッドの呼び出し } } |
名前: Flytech
年齢: 24
卒業年: 2018
一日中プログラミング
Ryotin
現役フリーランスエンジニアです。使ってるエージェントはフライテック!得意言語はJava。月収は75万円。SESのフリーランスではこれ以上稼ぐのは厳しそう...とはいってもサラリーマンの時より倍の収入だから家族も喜んでるけどね!