Java開発 虎の巻

Javaオブジェクト指向

クラスの利用

クラスを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("わんわん);
	}
}

インタフェースを実装したクラスはそのメソッドを全てオーバーライドしなければならない。