クラス
データ (プロパティ、フィールド、メンバ変数)と処理 (メソッド)をまとめたもの。
プロパティ(メンバ変数): クラス内で定義された変数
メソッド: クラス内で定義された関数
また、メンバ変数には、クラス変数とインスタンス変数の2種類がある。
- クラス変数:
static
で宣言
コンパイル時点で作成される
new
でインスタンスが生成されなくても使える
クラスに1つしか存在しない - インスタンス変数:
static
なしで宣言
コンパイル時点では作成されない
new
でインスタンスが生成されるまで存在しない
生成されたインスタンスごとに存在する
クラスは、インスタンス化 されて初めて使えるようになる。
また、インスタンス化したときに自動的に実行されるメソッドをコンストラクタ (初期化メソッド)という。
new演算子とコンストラクタ
コンストラクタとは、クラスのインスタンス生成時に実行されるメソッドである。
new演算子に続けて、クラスのコンストラクタを呼び出して実行するコードを記述すると、クラスのインスタンスが生成される。
public class メインクラス{
public static void main(String[] args) {
//インスタンス化
クラス名 変数名 = new クラス名();
}
}
public class クラス{
//コンストラクタ(インスタンス生成時に実行されるメソッド)
public クラス名(){
初期化処理など
}
}
コンストラクタに引数を設定することもできる。
例
public class Sample {
public static void main(String[] args) {
Person p = new Person("太郎",8);
}
}
public class Person {
String mName;
int mAge; //プロパティはm+大文字から始める慣例
public Person(String name, int age) {
mName = name;
mAge = age; //引数をプロパティに代入
System.out.println("オギャー"+mName+"、"+mAge+"才の誕生です。");
}
}
結果
オギャー太郎、8才の誕生です。
thisキーワード
コンストラクタの引数で渡した値を「this」句を使って受け取る場合もある。
「this」は「このクラスの」といった意味で、コンストラクタの引数の変数名と、このクラスのメンバ変数名を区別するためのものである。
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age; //自分自身のナンバ変数に、引数を代入
System.out.println("オギャー"+this.name+"、"+this.age+"才の誕生です。");
}
}
また、this()
とすると、コンストラクタから他のコンストラクタを呼び出すことができる。this()
はコンストラクタを呼び出すための特別なメソッドで、引数を渡すこともできる。
一方で、コンストラクタの先頭でしか呼び出せない。
メソッド
[アクセス修飾子] その他の修飾子 戻り値のデータ型 メソッド名(引数1, 引数2, ....){
/* メソッド内で実行する処理 */
}
変数.メソッド名()
のようにして実行する。
アクセス修飾子
アクセス修飾子 | 説明 |
---|---|
public | 他のクラスから |
protected | 同じパッケージ、サブクラス |
指定なし | 同じパッケージ |
private | 同じクラス |
その他の修飾子
修飾子 | 説明 |
---|---|
static | クラスをインスタンス化しなくても直接呼び出し可能 |
abstract | インスタンス化不可能(抽象クラス、メソッド) |
final | 上書き不可能 |
戻り値の型
型 | 説明 |
---|---|
void | 戻り値なし |
int | 整数型 |
String | 文字列型 |
例
import java.time.LocalDateTime;
public class Sample {
public static void main(String[] args) {
Person p = new Person("太郎",8);
p.sayHello(LocalDateTime.now().getHour());// 現在の時刻を取得
}
}
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHello(int time) {// メソッド名は小文字始まりで単語の切れ目に大文字の慣例
String text = "";
if (5 <= time && time < 10) {
text = "おはようございます";
} else if (10 <= time && time < 17) {
text = "こんにちは";
} else {
text = "こんばんわ";
}
System.out.println(text + "、" + name + age + "才です。");
}
}
結果
こんにちは、太郎8才です。
メソッドから戻り値を返すこともできる。
import java.time.LocalDateTime;
public class Sample {
public static void main(String[] args) {
Person p = new Person("太郎",8);
String m = p.getHelloMessage(LocalDateTime.now().getHour());//戻り値を代入
System.out.println(m);
}
}
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHello(int time) {
String m = this.getHelloMessage(time)
System.out.println(m);
}
public String getHelloMessage(int time) {
String text = "";
if (5 <= time && time < 10) {
text = "おはようございます";
} else if (10 <= time && time < 17) {
text = "こんにちは";
} else {
text = "こんばんわ";
}
String message = text + "、" + name + age + "才です。";
return message; //messageを戻り値として返す
}
}
ブロックとスコープ
より内側のスコープの変数が優先的に使われる。
自分と同レベル以下で定義された変数にはアクセスできない。
また、インスタンスフィールドに初期値を設定するには、private データ型 フィールド名 = 初期値;
とする。
クラス変数とクラスメソッド
クラス変数は、static
キーワードを付けて宣言される変数であり、すべてのインスタンスで共有される共通の情報である。これに対して、インスタンス変数の値は、インスタンス毎に異なる。
クラスフィールドへのアクセスには、クラス名.定数
を指定する。
final static データ型 定数 = 値;
//定数は大文字にするのが慣例
クラスメソッドは、クラスに属するメソッドでクラス名.メソッド名()
と呼び出す。クラスメソッドはインスタンスを生成しない状態でも呼び出すことができる。
public static 戻り値の型 メソッド名(){
// 処理
}