Java 基本 1 - user000422/0 GitHub Wiki
ver | LTS | Extended Support |
---|---|---|
8 | ○ | 2030/12 |
11 | ○ | 2032/01 |
17 | ○ | 2029/09 |
21 | ○ | 2031/09 |
クラス名 … 頭文字は必ず大文字、ハイフンやアンダーバーを使わない
API(Application Programing Interface)
Javaでは200を超えるパッケージ、3500を超えるクラスが標準で提供されている
変数の初期化 … 宣言と同時に値を代入
定数名は大文字で設定することが一般的
ローカル変数は初期化必須(デフォルト値が設定されないため)
int age = 10; // 変数宣言(初期化)
char c = 'A'; // char型へ代入する値はシングルクォーテーションで囲むこと
final int AGE = 20; // 定数(値の上書き不可)宣言(初期化)
if文 、 for文
// if文 条件式 関係演算子 基本構文
if(sample == true) { … } // 等しい場合
if(sample != false) { … } // 異なる場合
if(sample.equals("文字列")) { … } // equalsメソッド String型変数の値(文字列)を比較
if(!(sample.equals("文字列"))) { … } // equalsメソッド String型変数の値(文字列)を比較 否定
if(!(age == 18)) { … } // 異なる場合(否定演算子)
if(age > 18 && gender == 1) { … } // 論理演算子 && 両方の条件が true なら true
if(age > 18 || gender == 1) { … } // 論理演算子 || どちらかの条件さえ true なら true
// for文
for(int i = 0; i < 5; i++) { … } // ループ変数を1ずつ増やす
for(int i = 5; i > 0; i--) { … } // ループ変数を1ずつ減少させる
for(int i = 0; i < 5; i+=2) { … } // ループ変数を2ずつ増やす
for(int i = 0; sample.length; i++) {
break; // ループから抜け出す
}
配列
宣言時に要素内の値を設定しない場合は null
が格納される
int[] score = new int[5]; // 宣言と代入を同時に
int[] score = new int[] {10, 15, 20}; // 宣言と要素初期値代入を同時に
int[] score = {10, 15, 20}; // 宣言と要素初期値代入を同時に(省略版)
int[][] scores = new int[2][3]; // 宣言と代入を同時に(2次元配列)
int[][] scores = {{10, 15, 20}, {10, 20, 30}}; // 宣言と要素初期値代入を同時に(2次元配列)(省略版)
score[0] = 10; // 配列の要素に値を代入
scores[0][0] = 10; // 多次元配列の要素に値を代入
int len = score.length; // lengthメソッド 配列の要素数を算出
メソッド
return文内では return = xxx;
の後に処理を記述するとエラー
別クラスからメソッドを呼び出す場合は、クラス名を明示的にする必要がある
フィールド … クラスブロック内(メソッドブロック外)に宣言された変数
オーバーロード … 同じメソッド名でも、引数の型や数が異なれば複数定義可能
// this 同じクラスのフィールド変数へのアクセス
// thisを省略もできるが、ローカル変数に同じ変数名がある場合優先されてしまうため省略は非推奨
this.color = "blue";
クラス型(class type) … クラスを定義することで利用可能になる型
インスタンスは通常、クラス型変数に入れて利用する
複数存在しうる同名インスタンスの中から、特定のインスタンスを識別するため
インスタンス
Monster m = new Monster(); // インスタンス生成 基本構文
m.name = "スライム"; // インスタンスのフィールドに値を代入
m.atack(); // インスタンスのメソッド呼び出し
コンストラクタ … インスタンス化(new)された時に自動で実行される処理
クラスをインスタンス化する時に、初期値を設定する手間を省ける(初期値を固定設定できる)
コンストラクタはメソッド名がクラス名と完全に等しくなければならない
コンストラクタはメソッド宣言に戻り値を記述してはならない
コンストラクタのオーバーロードも可
public class Slime {
int hp;
// このクラスがインスタンス化された時、このメソッドが自動で実行される
Slime(String name) { // 引数指定も可 呼び出す(new)する際に引数を指定する必要がある
this.hp = 100;
this.name = name;
}
Slime() { // オーバーロード
this("まだ名前はありません"); // 同クラス内の別のコンストラクタを呼び出す
}
}
static … newでインスタンス化せずに呼び出せる
static field( 静的フィールド )… インスタンスでフィールドを共有
静的フィールドを呼び出す場合は クラス名.静的フィールド名
で呼び出す必要がある
多くの場合 static
は final
と一緒に指定される(変化しない定数として共有するため)
static method( 静的メソッド)… xxx
インスタンスではなく、クラスに属するようになるため クラス名.静的メソッド名();
で呼び出せる
静的メソッド内では、static
の付いていないフィールドやメソッドを利用することができない
public class Slime {
static int mp; // 別々にインスタンス生成されても、このフィールドは共有される
static void setRandomMp() { // staticメソッド
Slime.mp = (int)(Math.random()*10);
}
}
カプセル化 … フィールドや操作に対するアクセス制御
アクセス修飾子
定石 … フィールドはすべて private
、メソッドはすべて public
名前 | アクセス許可範囲 |
---|---|
private | 自分自身のクラス |
何も書かない | 自分と同じパッケージに属するクラス |
protected | 自分と同じパッケージ or 自分を継承した子クラス |
public | すべてのクラス |
クラスにに対するアクセス制御も可能
クラス宣言の先頭にpublic
記述がない場合、そのクラスは同一パッケージ内からのみアクセス可
getter … 他クラスからインスタンス元のフィールドにアクセスするためのメソッド
setter … 他クラスからインスタンス元のフィールドの値を書き換えるためのメソッド
setter内で値のチェックをすることがよくある
public class Slime {
private String name; // private 他クラスからアクセス不可
// getter 他クラスからこのクラスのフィールドにアクセスするためのメソッド
public String getName() {
return this.name;
}
// setter 他クラスからこのクラスのフィールドの値を書き換えるためのメソッド
public void setName(String name) {
this.name = name;
}
}
// 別クラス
public class Demon {
Slime s = new Slime();
void nameCall(Slime s) {
System.out.println(s.name()); // 他クラスのprivateフィールドへアクセスできないため コンパイルエラー
System.out.println(s.getName()); // getterを介し、他クラスのprivateフィールドへアクセス
s.setName("スライムB"); // setterを介し、他クラスのprivateフィールドの値を書き換える
}
}
継承 … 継承元のメンバを持っていることにできる
is-a(子クラスは親クラスの一種である)の関係が成立しない場合は継承禁止
多重継承(複数のクラスを親とすること)は禁止されている
宣言時にfinal
を付けているクラスやメソッドは継承、オーバーライド禁止
オーバーライド … 継承元(親クラス)のメンバを継承先(子クラス)で上書きすること
オーバーライドのルール … メソッド名、引数の数・型、戻り値の型がすべて同じこと
// extendsと継承元のクラス名を記述することで継承できる
public class KingSlime extends Slime {
// 記述しなくてもSlimeクラスのメンバを記述していることになる
// オーバーライド 親クラス(継承元)のsleepメソッドを上書き
public void sleep() {
this.hp += 100; // 記述あってるかわからない
}
}
継承元のコンストラクタが引数の値が必要なものしかない場合は、
継承先の子クラスのコンストラクタでsuper(指定引数);
と記述する必要がある
抽象メソッド … 継承元クラスのまだ処理を決定していないメソッド
抽象メソッドを1つでも含むクラスは必ず抽象クラスにしなくてはならない
抽象クラスをインスタンス化するとコンパイルエラー
抽象クラスを継承する場合、必ず抽象クラス内の抽象メソッドをオーバーライドしなければならない
// 抽象クラス abstractで宣言
public abstract class Monster {
public abstract void attack(Slime s); // 抽象メソッド abstractで宣言
}
インターフェース … 抽象メソッドと定数しか持たない抽象クラス
インターフェースを実装(継承)する場合は、継承先クラスの宣言にimplements
を付ける
privateアクセス修飾子でインターフェース宣言はできない
インターフェースの多重実装(継承)は可能(絶対に抽象メソッドしかないため)
public interface Monster {
void attack(); // 自動的にpublicかつabstractになるため、この記述でOK
}
// インターフェースを実装(継承)するクラス implementsで宣言
public class Slime implements Monster { … }
// インターフェースを多重実装(継承)するクラス
public class Slime implements Monster, Character { … }
多態性(polymorphism)… 型をザックリ捉える(抽象化させる)ようにする
左辺のメソッドのみ扱うことができ、メソッドの処理内容は右辺に準じる
複数のインスタンスに対し、似た処理を行う時にひとまとめにすることができる(例がないと説明しづらい)
// 左辺を右辺と異なる型にし、多態化させる
Monster s = new Slime();
Java doc
/**
* 説明
* @param 引数( 自動で入るものと同じ名前で )
* @return 戻り値
*/
三項演算子
// 変数 code の 値 が 1 なら "red" その他の場合 "blue" を 変数 color に 代入
color = (code == 1) ? "red" : "blue" ;