クラスMain のメソッド main を例にして説明します。
public static void main(String[] args)
は、決まり文句で、通常はこのまま記述します。
これらの構成について「ざっとした」説明をします。
public class Main{
public static void main(String[] args) {
// 処理内容
}
}
public アクセス修飾子 public は、どこからでも参照可能。Main-main は必ず public
static 静的 インスタンス可(new)しなくても外部から使用可能
void 戻り値なし
main メソッド名
String[] 引数をString型の配列で受け取る
args 引数名、任意の名称だが 通常は args とする。
staticメソッドとは、プログラムの動作に関係なく機能を行うもので、静的メソッドです。
それに対して、インスタンスメソッドは、呼び出すプログラムの動作に対応した機能を行うもので、動的メソッドです。
インスタンスメソッドでは、呼出し側メソッドで与えた状況により、インスタンスといいます。メソッドでは抽象的な機能を記述しておき、インスタンスにより具体的な機能にしますが、それをインスタンス化といいます。 new や this が必要です。
>staticメソッドは、インスタンス化の必要のないメソッドだともいえます。
インスタンスメソッドは難しいし、多くがstaticメソッドですので、ここでは、staticメソッドに限定します。
外部からの呼出しを許すかどうかの指定です。
クラスでは、
Mainクラスは外部から(コンパイラから自動的に)呼び出されるので public
、
他のクラスは、同一パッケージ(プログラム)から呼び出されるので、通常は「設定なし」
にします。
以下は主にメソッドに関する説明です。
| アクセス修飾子 | 同一クラス | 同一パッケージ | サブクラス | すべて |
| public | ○ | ○ | ○ | ○ |
| protected | ○ | ○ | ○ | × |
| 設定なし | ○ | ○ | × | × |
| private | ○ | × | × | × |
メソッドの形式は、次の形式になります。
public static void メソッド1() { System.out.println("メソッド1); }; public static String メソッド2() { return "メソッド2"; }; private static String メソッド3() { return "メソッド3"; };
Mainクラス以外のクラスは、他のクラスから参照されるのが通常ですので、アクセス修飾子は「設定なし」になるのが通常です。
他クラスのメソッドを呼び出すには、クラス名.メソッド名() とします。
public class Main {
public static void main(String[] args) {
String 文字列 = "";
文字列 = メソッド1(); // 引数のない関数 () を付ける
System.out.println(文字列); // 自クラス・public
文字列 = メソッド2();
System.out.println(文字列); // 自クラス・private
文字列 = 他クラス.メソッド1();
System.out.println(文字列); // 他クラス・public
// 文字列 = 他クラス.メソッド2();
// System.out.println(文字列); // 他クラス・privateは呼び出せない コンパイルエラー
}
public static String メソッド1() {
return "自クラス・public";
}
private static String メソッド2() {
return "自クラス・private";
}
}
class 他クラス {
public static String メソッド1() {
return "他クラス・public";
}
private static String メソッド2() {
return "他クラス・private";
}
}
Javaは、オブジェクト指向言語だといわれますが、オブジェクトを組み合わせて、ある目的を達成するプログラム技法です。
すなわち、オブジェクトとは、プログラムの部品のようなものです。
オブジェクトは、二つの要素からなっています。
属性(データ) オブジェクトが持つ情報
操作(メソッド)オブジェクトが持つ機能や動作
いいかえれば、オブジェクトとは、小さな処理を行うためのデータとメソッドをまとめたものだといえます。
そして、このオブジェクトの利用では、オブジェクトの内部構成をしる必要はなく(カプセル化)、オブジェクトの外部仕様であるメソッドを通してだけ、利用できるようにしています。
クラスとオブジェクトの関係は二つの見方があります。
class 学生クラス { // クラス名 String 氏名 = "阿部"; // ┬ 構造体の型と初期値 int 年齢 = 20; // ┘ public 学生クラス() { // ┐ コンストラクタ名はクラス名に合わせる super(); // ├ 記述不要(このようなデフォルトコンストラクタが生成) } // ┘ } public class Main { public static void main(String[] args) { 学生クラス 学生 = new 学生クラス(); // new記述可能 System.out.println(学生.氏名 + ", " + 学生.年齢); // 阿部, 20 } }
通常は、メソッド内部で定義した変数は、ローカル変数となり、メソッドの外からアクセスできません。
そのため、異なるメソッドでは、同じ変数名が独立した変数として定義できます。
それに対して、クラスで定義した変数は、グローバル変数となり、クラス内のどのメソッドでもアクセスできます。
メソッドで、グローバル変数と同名の変数を定義すると、そのメソッド内だけでローカル変数になります。
public class Main{
static String 変数G = "グローバル変数"; // static で定義する
public static void main(String[] args) {
System.out.println("変数G = " + 変数G); // 変数G = グローバル変数 (どのメソッドでも使える)
String 変数A = "mainメソッドのローカル変数";
System.out.println("変数A = " + 変数A); // 変数A = mainメソッドのローカル変数
メソッド1();
// System.out.println("変数B = " + 変数B); // コンパイルエラー
};
public static void メソッド1() {
String 変数B = "メソッド1のローカル変数";
System.out.println("変数B = " + 変数B); // 変数B = メソッド1のローカル変数
String 変数G = "グローバル変数と同名のメソッド1のローカル変数";
System.out.println("変数G = " + 変数G); // 変数G = グローバル変数と同名のメソッド1のローカル変数
}
}
クラスは入れ子にできます。
上位のクラスで定義した変数は、グローバル変数として、入れ子のクラスで使えます。
逆に、入れ子のクラスで定義した変数は、ローカル変数となり、他のクラスからは使えません、
上位クラス:クラス
入れ子のクラス:メソッド
のような関係になります。