JavaSilver取得への道 基本編メモ

パッケージ

パッケージを使用する目的は以下のようにまとめられる。

  1. 名前空間を提供し、名前の衝突を避ける
  2. アクセス修飾子と組み合わせてアクセス制御機能を提供する
  3. クラスの分類を可能にする

1.名前空間を提供し、名前の衝突を避ける
例えば、パッケージ名を"tsujimari"とする。すると、tsujimariパッケージ内で作られたクラスは"tsujimari.クラス名"という完全修飾クラス名で表すことができる。
このようにしてクラス名が重複しても区別することができる。
ちなみに、パッケージ名にはドメイン名を逆にしたものを使用するのが慣習である。

2.アクセス修飾子と組み合わせてアクセス制御機能を提供する

アクセス修飾子 内容
private 同じクラス内からしか呼び出せない
省略 同じパッケージ内からしか呼び出せない
protected 同じパッケージ内か、そのサブクラスから呼び出せる
public どこからでも呼び出せる

アクセル修飾子を使用することで、パッケージ内のクラスを”公開するクラス”と”非公開にするクラス”に分けることができる。

3.クラスの分類を可能にする
パッケージはディレクトリ機能とマッピングされるため、管理が簡単になる。

パッケージのインポート宣言

①明示的にパッケージ宣言したクラスから無名パッケージに属するクラスにアクセスしようとするとコンパイルエラーが起きる

//無名パッケージに属するSampleクラス
public class Sample {
 public static int num = 10;
}
package example;
//exampleという明示的に宣言したパッケージに属するSampleImpleクラス
//無名パッケージに属するSampleクラスは同じ無名パッケージに属するクラスからしかアクセスできないため、Sample/numでエラーがでる。
public class SampleImple extends Sample{
    public static void main(String[] args) {
        System.out.println(num);
    }
}

この場合、Sampleクラスをexampleパッケージ内に作成すれば解決する。

②異なるパッケージのクラスにアクセスするときはインポートを宣言する

package sample2;
//sample2という明示的に宣言したパッケージに属するSampleクラス
public class Sample {
    public static int num = 10;
}
package example;
//sample2パッケージのSampleクラスをインポートする宣言
import sample2.Sample;

public class SampleImple extends Sample{

    public static void main(String[] args) {
        System.out.println(num);
    }
}

インポート宣言は、省略表記のために用いるだけであり、インポートしたフィールドやメソッドがコピーされる訳ではない。よって以下のような書き方でも可。

package example;
//完全修飾クラス名で表記
public class SampleImple extends sample2.Sample{
    public static void main(String[] args) {
        System.out.println(num);
    }
    
}

sample2に属するクラス全てをインポートしたい場合はアスタリスクを使用する

import sample2.*;

staticインポート

staticとは
staticとは、クラスに属するものであり、インスタンスを生成しなくても実行することができる。 そのため、staticメソッドから非staticなメンバ(インスタンス変数)にアクセスすることはできない。
なぜなら、インスタンスの有無に関係ないstaticメソッドから呼び出しても、どのインスタンス変数にアクセスしていいのか分からないからである。

staticインポートの書き方
staticなフィールドはメソッドはクラスに属しているため、”クラス名.フィールド名”や”クラス名.メソッド名”とどのクラスに定義されているものか明示しなければいけない。

//sampleクラスのstaticなprintメソッドをインポート
import static sample.print

メソッドがオーバーロードされたメソッドが複数あった場合は引数によって呼び出されるメソッドが決まるため、インポート宣言で引数を指定する必要はない

エントリーポイント

複数あるメソッドの中でも、最初に処理を始めるメソッドのことで、mainメソッドを指す。
エントリーポイントの定義は以下のように決められている。

public static void main(String[] args) {
        //}

変更可能なのは引数名である”args”の部分だけである。
ちなみに引数にはString配列型だけではなく、可変長引数のString型を受け取ることもできる。

Javaコマンド

javaコマンドで、mainメソッドに渡す引数のことを”起動パラメータ”や”コマンドライン引数”という。
javaの構文は以下のようになる。

java 完全修飾クラス名 引数 引数(起動パラメータ・コマンドライン引数)

参考文献:「java se8 silver 問題集」