訓練27日目「インターフェース」

訓練27日目「インターフェース」

こんにちは!
学校のPCはhpですが、キーボードの反応がすこぶる悪いです。
キーボードがへっぽこなのは、lenovo(IBM) のイメージでしたが、困ったものです。
特にOキーの反応が非常に悪いです。
家で使っているキーボードもhpなんですけどバラつきがあるんでしょうねぇ~。

あとはお風呂入ってこない方が前と右にいるので困りものです。。。
一日入ってないだけでも臭うものなんですよね。。。
今日のは二日入ってないようなので(´・ω・`)ショボーン

今日の出席状況

今日は天気が悪いせいか、みんな来るのが遅かったみたい。
でも遅刻はいないです。いいことです゚.+:。(・ω・)b゚.+:。グッ

今日の授業内容

継承についてのおさらいをやりました。
protectedは継承関係まで使える修飾子なんですね。
finalはオーバーライドされたくないものに使う。うむうむ。

getClass()メソッド

オブジェクトが属するクラスの情報を返すそうです。
「2番目のオブジェクトのクラスはclass lesson11.RacingCarです。」
プログラミングしてみたところ、このような表示結果が得られました。
Class型の変数に結果を代入するのがコツのようです。

ちなみにコードはこんな感じです。

package lesson11;

//車クラス
class Car {
 protected int num;
 protected double gas;

 public Car() {
 num = 0;
 gas = 0.0;
 System.out.println("車を作成しました。");
 }
}

//レーシングカークラス
class RacingCar extends Car {
 private int course;

 public RacingCar() {
 course = 0;
 System.out.println("レーシングカーを作成しました。");
 }
}

public class Sample9 {
 public static void main(String[] args) {
 Car[] cars;
 cars = new Car[2];

 cars[0] = new Car();
 cars[1] = new RacingCar();

 for(int i=0; i<cars.length; i++) {
 Class cl = cars[i].getClass();
 System.out.println((i+1) + "番目のオブジェクトのクラスは" + cl + "です。");
 //パッケージを含めたフルパスが表示される。
 }
 }
}

 toString()メソッド

System.out.println("car1");

特に何も準備せずに上のコードを記述すると、
「Car@数値」という感じで返ってきます。
lesson11.SampleP4.Car@1b383e9」のように返ってきます。

これはtoString()メソッドの戻り値が表示されているからです。
自分でtoString()メソッドを定義しておくことで(オーバーライド) 、
「Car@数値」 より分かりやすい文字列を返すことができます。

public String toString() {
String str = "ナンバーを" + num + "ガソリン量を" + gas + "の車";
return str;
}

このように指定すればよいのです。

抽象クラス

abstractという修飾子がついたもの。
「オブジェクトを作成することができない」
という特徴をもっています。
new演算子を使ってオブジェクトを作成することができないのです。

処理内容が定義されていないメソッドをもつという特徴があります。

abstract class Vehicle {
・・・
abstract void show();
・・・
}

では、抽象クラスの使い時はあるのでしょうか?
抽象クラスから継承した抽象メソッドの内容を
サブクラスできちんと定義してオーバーライドする
という作業をする必要があります。
つまり、継承したサブクラスで抽象メソッドの内容を定義しなければ、
サブクラスもオブジェクトを作成することができないのです。

スーパークラスとサブクラスを作っている 人がそれぞれ違う場合に使う機会があるそうです。

インターフェイス

インターフェイスは、フィールドとメソッドをもつことができます。
しかし、コンストラクタはもちません。

通常、インターフェイスのメンバには何も装飾しをつけません。
何もつけなくてもフィールドにはpublic static final、メソッド にはabstractという修飾子をつけている事と同じになるからです。
つまり、インターフェイスのフィールドは定数、メソッドは抽象メソッドという事になります。
インターフェイスではフィールドを変更、メソッドの処理内容を定義することができないのです。
また、オブジェクトを作成することができません。

インターフェイス型の変数・配列は宣言することができます。
インターフェイスは付加機能wつけるような場合に使うらしい。
例:ボタンをクリックしたらどうする?
⇒○○○メソッドが書かれたインターフェイス を呼ぶというようなGUIの動作を実装するときとか

まとめ

インターフェイス、instaceof演算子の理解が甘い。
インターフェイスに抽象メソッドがあるから、こういう動きなんだーっていうプログラムの流れを理解できていない。

package lesson12.Sample04;

import lesson12.Sample04.iVehicle;

//のりものインターフェイス
interface iVehicle {
 void vShow();
}

//材料インターフェイス
interface iMaterial {
 void mShow();
}

//車クラス
class Car implements iVehicle, iMaterial {
 private int num;
 private double gas;

 public Car(int n, double g) {
 num = n;
 gas = g;
 System.out.println("ナンバー" + num + "ガソリン量" + gas + "の車を作成しました。");
 }

 public void vShow() {
 System.out.println("車nナンバーは" + num + "です。");
 System.out.println("ガソリン量は" + gas + "です。");
 }

 public void mShow() {
 System.out.println("車の材料は鉄です。");
 }
}

class Sample4 {
 public static void main(String[] args) {
 Car car1 = new Car(1234, 20.5);
 car1.vShow();
 car1.mShow();
 }
}

こういうプログラムで、インターフェイスのvoid vShow()、void mShow()が何してるのかさっぱり。。。
ちょっと先生に聞いてみます。

→→聞いてみました。

インターフェースで書いたメソッドをサブクラスでも書かないと怒られるよって事らしいです。
動作はしないのですが、そっちでも書きなさいっていうアナウンスみたいな役割ですね。

複数人でプログラミングする時などに使うようです。
なので、インターフェースはそういうものだと覚えておくのが良さそうです。

明日以降

大がかりな部分が終わったので、明日以降はさくさくっと進んでいきそうです。
逆に言えば、簡単な反面進むスピードも早くなるので、今までの復習をしっかりやって、予習をしておくことが重要です。

今日、明日は仕事に時間を使う予定ですが、
朝だけは予習に時間を使おうと思います。

AndroidUI勉強会 -Returns-

大好評だったABCでのあんざいさんの講演&矢野さんによるスマホデザインパターン
http://www.zusaar.com/event/271002

参加してみようと思います。
矢野りんさんのデザイン本は幾つかもっていて、私にとってはデザインの出発地点なのです。
webだろうが、広告だろうが、商品だろうが、Androidだろうが見た目が大事です。
UIについてプロのお話が聞けるのはまたとない機会なので参加してきます!

photo by: R.W.W.