クラスの利用
クラスを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("わんわん);
}
}
インタフェースを実装したクラスはそのメソッドを全てオーバーライドしなければならない。