クラスの利用
クラスをnewでオブジェクトを生成して使う。
乱数:Randomクラス
// Randomクラスの場合 Random ran; ran = new Random(); System.out.println( ran.nextInt(10) );
上の例の ran は「Random」クラスのオブジェクトを入れるための変数。
new でRandomクラスのオブジェクトを生成している。
nextInt()はメソッドの呼び出し
入力:Scannerクラス
// Scannerクラスの場合(数値の入力) Scanner sc = new Scanner(System.in); int num = sc.nextInt();
割り勘クラス
// 割り勘クラス class Warikan{ int kingaku; int ninzu; void hitori() { System.out.println( kingaku / ninzu ); } void husoku() { System.out.println( kingaku % ninzu ); } }
// 割り勘クラスの利用(main内) Warikan w = new Warikan(); w.kingaku = 13210; w.ninzu = 4; w.hitori(); w.husoku();
クラスの作成
class クラス名{ 属性 属性 ・ ・ メソッド メソッド ・ ・ }
- 属性=クラスのデータ
- メソッド=クラスの処理
クラスからオブジェクトを生成
クラスはオブジェクトを生成しないと使えない。
// Memberクラスの場合 Member m = new Member();
上の例のmはMemberオブジェクトを入れるための変数。new Member()でMemberクラスのオブジェクトを生成している。
カプセル化
クラスのメンバを外部からアクセスできないようにする
アクセス指定
属性・コンストラクタ・メソッドの前に付ける
private | 他のクラスからアクセスできない |
無指定 | 他のパッケージからアクセスできない |
protected | 無指定と同じだがサブクラスからはアクセスできる |
public | どこからでもアクセスできる |
属性の書き方
private int num;
getterとsetter
慣習として
- setが付くメソッド:クラス内部に値を設定できるようにする
- getが付くメソッド:クラス外部から値を取得できるようにする
class Member{ private String name; // privateなので外部からアクセスできない public void setName(String n){ name = n; } public String getName(){ return name; } }
- setName:引数でn をもらい、それをクラス内部のnameに設定
- getName:nameをreturnし外部がnameを取得できるようにする
// 外部からの利用例 Member mem = new Member(); mem.setName("鈴木"); String name = mem.getName();
コンストラクタ
- コンストラクタ=newするときに自動的に呼ばれるメソッドのこと
- クラス名と同じ名前で作ったメソッドがコンストラクタになる
- voidなどの戻り値の型は書かない
class Member{ public Member(){ // これがコンストラクタ } }
クラスの例(名前と年齢)
class Member{ private String name; private int age; public Member(String n,int a){ name = n; age = a; } public String getName(){ return name; } public int getAge(){ return age; } }
オブジェクト生成の例(上のMemberクラスの場合)
Member m = new Member("田中",30); System.out.println( m.getName() ); // 田中と表示
static
staticが付いた変数=クラス変数
staticが付いたメソッド=クラスメソッド
staticが付いていない変数=インスタンス変数
staticが付いていないメソッド=インスタンスメソッド
インスタンス変数、インスタンスメソッドはインスタンスの数だけ存在する。つまり、newした数だけ存在する。
クラス変数、メソッドはインスタンスの数に関わらず、常に1個のみ存在する。よって、newしなくても使用可能。
使用法:クラス名.メンバー名
class Animal{ staic void show(){ System.out.println("動物"); } } // 上のshowメソッドを使う場合 Animal.show();
staticが付いたメソッドからはstaticが付いた変数・メソッドしか扱えない
class Animal{ String name; static int num; staic void show(){ System.out.println(num); // OK System.out.println(name); // エラー } }
継承
スーパークラス(親クラス)の属性・メソッドを全て引き継いでサブクラスを作る
class サブクラス名 extends スーパークラス名{ }
//例:Animalクラスを継承しDogクラス class Animal{ String name; void showName(){ System.out.println(name); } } class Dog extends Animal{ void naku(){ System.out.println("ワン"); } }
Dog d = new Dog(); d.name = "ぽち"; // スーパークラスの属性を使う d.showName(); // スーパークラスのメソッドを使う d.naku();
オーバーライド
スーパークラスのメソッドをサブクラスで上書き
//例:Animalクラスを継承しDogクラス class Animal{ String name; void naku(){ System.out.println("がおー"); } } class Dog extends Animal{ void naku(){ System.out.println("ワン"); } }
Dog d = new Dog(); d.naku(); // ワンと表示
ポリモフィズム
スーパークラス型にサブクラスのインスタンスを代入可能
Animal a = new Dog();
変数の型にかかわらず、インスタンスのメソッドが呼び出される
Animal a = new Dog(); a.naku(); // ワンと表示
継承とコンストラクタ
スーパークラスのコンストラクタを super() で呼び出せる
class Animal{ Animal(){ System.out.print("動物"); } Animal(String name){ System.out.print(name); } } class Dog extends Animal{ Dog(){ super("犬"); // Animal(String name)が呼び出される。 System.out.print("わんわん); } } // Dogのインスタンスを作る Dog d = new Dog(); // 犬わんわんと表示
super()を書かない場合、自動的にsuper()を書いたものと見なされる
class Animal{ Animal(){ System.out.print("動物"); } Animal(String name){ System.out.print(name); } } class Dog extends Animal{ Dog(){ // superを指定していないのでsuper() とみなされる System.out.print("わんわん); } } // Dogのインスタンスを作る Dog d = new Dog(); // 動物わんわんと表示
呼び出すコンストラクタがスーパークラスにない場合、エラー
class Animal{ Animal(String name){ System.out.print(name); } } class Dog extends Animal{ Dog(){ // superを指定していないのでsuper() とみなされる System.out.print("わんわん); } } // Dogのインスタンスを作る Dog d = new Dog(); // エラー。Animal()が無い
抽象クラス
- newできないクラス。継承して使う
- classの前にabstractを付ける
- abstractが付いたメソッドは抽象メソッド。抽象メソッドは中身は書かない。
- 継承したクラスは抽象メソッドを必ずオーバーライドしなければならない
//例:Animalクラス abstract class Animal{ String name; abstract public void naku(); // 抽象メソッド } class Dog extends Animal{ public void naku(){ // 必ずオーバーライド System.out.print("わんわん); } }
インタフェース
- 抽象クラスで抽象メソッドしかないもの
- 継承(extends)ではなく実装(implements)
- メソッドは自動的に abstract public
- 属性は自動的に public static final(定数のみ)
//例:Animalクラス interface Animal{ void naku(); // 抽象メソッド } class Dog implements Animal{ public void naku(){ // 必ずオーバーライド System.out.print("わんわん); } }
インタフェースを実装したクラスはそのメソッドを全てオーバーライドしなければならない。