クラス
クラスを宣言する
class HogeCls {
// フィールド、コンストラクタ、メソッドの宣言
}
class HogeCls extends PiyoSuperCls inplements LoliInterface {
// フィールド、コンストラクタ、メソッドの宣言
}
メンバー変数を宣言する
アクセス修飾子
メソッドを定義する
メソッドの命名
違和感がありますがメソッドの命名規則は、Camel形式が一般的な様です。
メソッドのオーバーロード
Javaはメソッドのオーバーロードをサポートしている為、シグネクチャが異なるメソッドを区別することが可能です。
クラスのコンストラクタを作る
スーパークラスの指定がなかった場合、暗黙的にクラスObjectがスーパークラスとなります。このクラスObjectは、引数なしのコンストラクタを持っています。
メソッドやコンストラクタに情報を渡す
パラメータの型
任意の数の引数
省略記号(...)を使う事でメソッドを呼び出す事が出来ます。
private static void varArgsFunc(int... varArgs)
{
System.out.print(varArgs.length + ":");
for(int i : varArgs)
{
System.out.print(i + ",");
}
System.out.println();
}
varArgsFunc(); // 0:
varArgsFunc(3); // 1:3,
varArgsFunc(4, 5, 6); // 3:4,5,6,
パラメータの名前
基本データ型の引数を渡す
参照型の引数を渡す
オブジェクト
オブジェクトを生成する
オブジェクトを参照する変数宣言する
クラスをインスタンス化する
オブジェクトを初期化する
オブジェクトを使う
オブジェクトのフィールドを参照する
オブジェクトのメソッドを呼び出す
ガベージコレクタ
脳内でどうしてもガレージコレクタに変換されてしまう……ガレキ自重。
クラス詳説
メソッドから値を返す
クラス階層と戻り型
キーワードthisを使う
フィールドとthis
コンストラクタとthis
コンストラクタから別のコンストラクタを呼びだすためにもthisが使えます。
public class HogeClass {
private int x, y;
private int tanaka, sato;
public HogeClass()
{
this(0, 0, 0, 0);
}
public HogeClass(int x, int y, int tanaka, int sato)
{
this.x = x;
this.y = y;
this.tanaka = tanaka;
this.sato = sato;
}
}
明示的コンストラクタ呼び出しと言います。
クラスのメンバーへのアクセスを制限する
制限の強度順は強い順から、private、アクセス修飾子無し、protected、public。
privateは、同一クラス内からしかアクセス出来ない。
アクセス修飾子無しは、privateとは等価ではなく、同一パッケージ内のクラスであればアクセスが可能である。
protectedは、パッケージが異なっていても継承すればアクセス可能である。
publicは、何でもOK。
特に理由のない限りprivateを使います。また、定数を除いてpublicなフィールドは避けます。
インスタンスメンバーとクラスメンバー
クラス変数
すべてのオブジェクトに共通なstaticなフィールドは、クラス変数と呼ばれる。
クラスメソッド
修飾子staticを宣言に持った場合、そのクラスのインスタンスを生成せずに、メソッド呼び出しを行うことが出来ます。
一般的な用途としては、staticフィールドにアクセスする事。
定数
フィールドを初期化する
static初期化ブロック
staticフィールドを初期化する際には、static初期化ブロックが使用できます。
public class Main {
static int hoge;
static int hoge2;
public static void main(String[] args) {
System.out.println("hello world");
}
static {
hoge2 = 5;
}
static {
hoge = 9;
}
}
static初期化ブロックは、コードの上に配置されているものから順に実行されますので、先頭のhoge,hoge2の宣言順には関係なく、hoge2,hogeの順で初期化される。
インタスタンスメンバーの初期化
public class HogeClass {
private int hoge;
{
hoge = 5;
}
}
finalメソッドはサブクラスでオーバーライドできません。第5章で説明して頂けるようです
public class HogeClass {
private int hoge = initHoge();
protected final int initHoge() {
return 5;
}
}
クラスとオブジェクトのまとめ
入れ子のクラス
クラスの中にクラスを定義する事が出来ます。入れ子の暮らす(nested class)と呼ぶ。
public class HogeClass {
void hoge()
{
InnerClass innerCls = new InnerClass();
// 例えprivateであってもアクセス出来る
int aa = innerCls.hogePrivate;
}
class InnerClass {
private int hogePrivate = 5;
protected int hogeProtected = 6;
public int hogePublic = 7;
}
}
入れ子になっているクラスは、内部クラス(InnerClass)と呼ぶ。
なぜ入れ子のクラスを使うのか
- クラスを合理的にグループ化
- カプセル化を促進
- コードの理解とメンテナンスが容易
staticな入れ子のクラス
内部クラス
ローカル内部クラスと匿名内部クラス
メソッド本体の中で名前無しで内部クラスを宣言する事が出来て、匿名内部クラスと呼ばれます。
修飾子
入れ子のクラスのまとめ
ドキュメンテーション
コンパイラが使用する注釈
注釈の処理
雑感
アクセス修飾子にfriendって居ませんでしたっけ。C++だっけな……