クラス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のローカル変数 } }
クラスは入れ子にできます。
上位のクラスで定義した変数は、グローバル変数として、入れ子のクラスで使えます。
逆に、入れ子のクラスで定義した変数は、ローカル変数となり、他のクラスからは使えません、
上位クラス:クラス
入れ子のクラス:メソッド
のような関係になります。