Javaオブジェクト指向(1)
オブジェクト指向
ざっくりと書くので言葉のニュアンスは気にしない(でいたいっw)。
User user = new User();
- オブジェクトの宣言はそのクラス型で宣言する
User user = new User();
- フィールドとメソッドはオブジェクトがそれぞれ持っている。Userクラスがsex, year, speak()というメソッドを持っている場合に、下記のようにとしてインスタンスを作ると、user1というオブジェクトはuser1.sex, user1.year, user1.speak, を使用することが可能で、user2はuser2.sex, user2.year, user2.speakを使用可能。わかりやすく言うとクラスがたいやきの型で、インスタンスが焼き上がったそれぞれのたい焼き。
User user1 = new User(); User user2 = new User();
- 基本型以外は参照型→クラス型は参照型
- コンストラクタは例えて言えば、たい焼き型で皮だけ作って、その中身を後で注射器で注入するものという感じ
- メソッドとコンストラクタの違い
- 戻り値の型がない
- 名前がクラス名と同じもの
- 上記の違い以外はメソッドと同じと見てよい
- コンストラクタを宣言しなければ、引数なしのデフォルトコンストラクタが自動で作成される
- コンストラクタはインスタンス作成時には一度だけ実行される(例えばUser user = new User();として宣言するとき、userは変数と考える。参照型の変数の中には参照先のもののメモリアドレスが格納されているので、ここでも同じ。変数は初期化しないと使用できないが、ここでも同じ。ここではUser()によって初期化されている。)。
- クラスにてコンストラクタを一つでも作成するとデフォルトコンストラクタは作成されない
- クラスフィールド・メソッドのキーワードはstatic
- フィールド2種類
- メソッド2種類
- インスタンスフィールド・メソッドとクラスフィールド・メソッドの違い
- thisが指すのはインスタンス
User user = new User("takasing104");//インスタンス作成
public String username; public User(String username) { this.username = username;//ここではthis=user→user.usernameに"taking104"を代入している。 }
- インスタンス名.フィールド・メソッドを実行→そのフィールドやメソッドが見当たらなかったらJavaはクラスフィールド・メソッドを参照しに行く。下記において、を呼び出すような時警告は出るがコンパイルは通る。
public class Hoge { public static void main(String[] args) { Box box1 = new Box("チョコビ", 5); Box box2 = new Box("空想科学読本", 1); Box.key = new String("ひらけごま"); Box.look(box1, "ヒラケゴマ"); Box.look(box2, "ひらけごま"); Box.key = new String("チチンプイプイ"); Box.look(box1, "チチンプイプイ"); Box.look(box2, "ちちんぷいぷい"); } }
public class Box { public static String key; public String item; public int num; // constructors public Box() { } public Box(String item, int num) { this.item = item; this.num = num; } public void look(String word) { System.out.println(word + item + "が" + num + "つ見える"); } public static void look(Box box, String key) { //←box.keyはBox.keyであるべきだが、一応コンパイル可能 if (key.equals(box.key)) { System.out.println("箱の中には" + box.item + "が" + box.num + "つある"); } else { System.out.println("キーワードが違うよ"); } } }
- String型は特殊、比較時は必ずequalsメソッドを使う。String型ではコンストラクタを使わずに初期化するとコンスタントプールにある文字列を共有する(つまり同一オブジェクトを持つ)。
String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); String s4 = new String("Hello"); System.out.println(s1 == s2);//値比較 System.out.println(s3 == s4);//メモリアドレスを比較している System.out.println(s1.equals(s2));//参照先のオブジェクト比較 System.out.println(s3.equals(s4));
true false true true
今回はこの程度。
変数とかメソッドとかその他説明省きましたが、随時更新して行く(かもっ)。