Java 修飾子
修飾子
ここまでで、ほぼすべての例に登場するpublic
についてはよくご存じでしょう。
public class Main
public
はアクセス修飾子であり、クラス、属性、メソッド、コンストラクターのアクセスレベルを設定するために使用されることを意味します。
修飾子を 2 つのグループに分けます。
- アクセス修飾子- アクセスレベルを制御します。
- 非アクセス修飾子- アクセス レベルを制御しませんが、他の機能を提供します。
アクセス修飾子
クラスの場合は、public
またはデフォルトのいずれかを使用できます。
修飾子 | 説明 | それを試す |
---|---|---|
public |
このクラスには他のクラスからアクセスできます | 試してみる " |
default | クラスにアクセスできるのは、 このクラスには、同じパッケージ内のクラスからのみアクセスできます。修飾子を指定しない場合に使用します。 パッケージについて詳しくは、パッケージの章を参照してください。 | 試してみる " |
属性、メソッド、コンストラクターには、次のいずれかを使用できます。
修飾子 | 説明 | それを試す |
---|---|---|
public |
コードはすべてのクラスでアクセス可能です | 試してみる " |
private |
コードは宣言されたクラス内でのみアクセス可能です | 試してみる " |
default | コードは同じパッケージ内でのみアクセスできます。修飾子を指定しない場合に使用します。 パッケージについては、パッケージの章で詳しく説明します。 | 試してみる " |
protected |
コードは同じパッケージやサブクラスでアクセスできます、サブクラスとスーパークラスついては継承の章で詳しく説明します。 | 試してみる " |
非アクセス修飾子
クラスの場合は、final
またはabstract
を使用できます。
修飾子 | 説明 | それを試す |
---|---|---|
final |
クラスを他のクラスに継承することはできません (継承の詳細については、継承の章で詳しく説明します。) | 試してみる " |
abstract |
このクラスを使用してオブジェクトを作成することはできません (抽象クラスにアクセスするには、 別のクラスから継承する必要があります。継承と抽象化については、継承の章と抽象化の章で詳しく説明します。) | 試してみる " |
属性とメソッドには、次のいずれかを使用できます。
修飾子 | 説明 |
---|---|
final |
属性とメソッドはオーバーライド/変更できません |
static |
属性とメソッドは、オブジェクトではなくクラスに属します |
abstract |
抽象クラスでのみ使用でき、メソッドでのみ使用できる。例えば abstract void run(); のように、 メソッドはボディを持たない。ボディはサブクラスが提供します(継承元)。 継承と抽象化については、継承の章と抽象化の章で詳しく学習します。 |
transient |
属性とメソッドは、それらを含むオブジェクトをシリアル化するときにスキップされます |
synchronized |
一度に 1 つのスレッドのみがメソッドにアクセスできます |
volatile |
属性の値はスレッド ローカルにキャッシュされず、常に「メイン メモリ」から読み取られます。 |
Final
既存の属性値をオーバーライドできないようにするには、属性をfinal
として宣言します。
例
public class Main {
final int x = 10;
final double PI = 3.14;
public static void main(String[] args) {
Main myObj = new Main();
myObj.x = 50; // will generate an error: cannot assign a value to a final variable
myObj.PI = 25; // will generate an error: cannot assign a value to a final variable
System.out.println(myObj.x);
}
}
静的
staticメソッドは、
publicとは異なり、クラスのオブジェクトを作成せずにアクセスできることを意味します。
例
static
メソッドとpublic
メソッドの違いを示す例は次のとおりです。
public class Main {
// Static method
static void myStaticMethod() {
System.out.println("Static methods can be called without creating objects");
}
// Public method
public void myPublicMethod() {
System.out.println("Public methods must be called by creating objects");
}
// Main method
public static void main(String[ ] args) {
myStaticMethod(); // Call the static method
// myPublicMethod(); This would output an error
Main myObj = new Main(); // Create an object of Main
myObj.myPublicMethod(); // Call the public method
}
}
概要
abstract
メソッドはabstract
クラスに属しており、本体はありません。本体はサブクラスによって提供されます。
例
// Code from filename: Main.java
// abstract class
abstract class Main {
public String fname = "John";
public int age = 24;
public abstract void study(); // abstract method
}
// Subclass (inherit from Main)
class Student extends Main {
public int graduationYear = 2018;
public void study() { // the body of the abstract method is provided here
System.out.println("Studying all day long");
}
}
// End code from filename: Main.java
// Code from filename: Second.java
class Second {
public static void main(String[] args) {
// create an object of the Student class (which inherits attributes and methods from Main)
Student myObj = new Student();
System.out.println("Name: " + myObj.fname);
System.out.println("Age: " + myObj.age);
System.out.println("Graduation Year: " + myObj.graduationYear);
myObj.study(); // call abstract method
}
}
プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。