忍者ブログ

からすまる日誌 java

実践2(1) インターフェイス、多態性(1)

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

実践2(1) インターフェイス、多態性(1)

インターフェース:

public class Creature{
}
のかわりに
public interface Creature{
}
とインターフェースは宣言できる

・とにかくあいまい
・子クラスが普通たくさん

 インターフェースはimplementsというキーワードを使って継承する(extendsじゃない)


・ふつうのextendsの時は多重継承を許可していない
・implementsは多重継承ができる。2つでも3つでも可。なぜか。親がふたつともインターフェースということは、中身はからっぽのメソッドだから混乱が発生しない。
どうせ自分の中でオーバーラードするため。


android stadio

最新版をDLする
https://developer.android.com/studio/?hl=ja

とりあえずインストは午後から
 



教科書p491

打ち込みはしたが何にも理解できないな?
しゃあない上から見ていってみましょう。
 
①最上位インターフェース

--->Things.java

public interface Things {
 double getWeight();
 void setWeight(double weight);
}

・double型でgetWeightを宣言。なかみはない。たぶん。
・そのsetterをつくってる。おわり。
 


②レベル2の「すべての資産」クラス
public abstract class Asset {

 private String name;
 private int price;//無形資産に値段はあるとのこと!

 public Asset(String name, int price) {
  this.name=name;
  this.price=price;
 }

 //automatic create
 public String getName() {
  return this.name;
 }
 public int getPrice() {
  return this.price;
 }

}

ここで起こっていること:
・このひとは最上位インターフェースを受け継ぐ宣言がないな?
abstractがclassの前に付いているので、これが抽象クラスと分かる。よってこの部分はインスタンス化できずミスから保護される。
・private String name;
 private int price;
が宣言。
 


③レベル3の「有形資産」のクラス
--->TanbibleAsset.java

public abstract class TanbibleAsset extends Asset implements Things{

 private String color;
 private double weight;

 public TanbibleAsset(String name, int price, String color) {
  super(name, price);
  this.color = color;
 }

 //自動生成
 public String getColor() {
  return this.color;
 }
 public double getWeight() {
  return this.weight;
 }

 public void setWeight(double weight) {//たぶんオーバーライド
  this.weight = weight;
 }
}
 
ここで行われていること:
extends Assetimplements Thingsの二重継承
abstractがclassの前に付いているので抽象クラスである。newできない。
colorとweightの宣言
びっくりするぐらいざっくりとsuperで継承。どっちから継承するかすら書いてない。スゴイ。これがjavaか。(可能性的に)継承先はAssetしかない。


④レベル4の「本」とか「こんぴゅーた」のクラス

--->Book.java

//package exercise;

public class Book extends TanbibleAsset{

 private String isbn;

 public Book(String name, int price, String color, String isbn) {
  //this.name = name;
  //this.price = price;
  //this.color = color;
  super(name,price,color);
  this.isbn = isbn;
 }

 public String getIsbn() { return this.isbn; }
}
 
TanbibleAssetをextends
・bookが新たに持たされたフィールドは、isbnだけである。
 


--->computer.java

//package exercise;

public class Computer extends TanbibleAsset{
 //親クラスに持たせたためコメントアウトす
 //private String name;
 //private int price;
 //private String color;

 private String makerName;

 public Computer(String name, int price, String color, String makerName) {
  //this.name = name;
  //this.price = price;
  //this.color = color;
  super(name,price,color);
  this.makerName = makerName;
 }

 //public String getName() { return this.name; }
 //public int getPrice() { return this.price; }
 //public String getColor() { return this.color; }

 public String getMakerName() { return this.makerName; }
}
 
TanbibleAssetをextendsしている
ここでも親が持ってるものはsuperでぶん投げ。
コンピュータで新たに持たされたフィールドはMakerNameのみ。
 


◎実行用
--->Main491.java

public class Main491 {
 public static void main(String[] args) {
  Book b = new Book("本1",1000,"黄色","1234");
  Computer c = new Computer("PC1",1000,"黒","SONY");
  b.setWeight(10);
  c.setWeight(20);
  System.out.println(b.getName()+ "の重さ:" + b.getWeight());
  System.out.println(c.getName()+ "の重さ:" + c.getWeight());
 }
}
 
色と太字をつけてやっと構造が理解できた。
 


多態性:

とりあえず親の型の箱に入れるという性質

Character - SuperHero

今まで:
SuperHero  h = new SuperHero();

多態性の記述:
Character c = new SuperHero();

is-aの関係
superhero is a character → ok
スーパーヒーローはキャラクターだ。ありだ。

ただにんげんさんは聞けば常識で判断できるが、コンピューターさんはハテナなので、javaにおいて継承関係でクラスがつながっていればすっとび代入( Character c = new SuperHero(); )ができる。というわけ。

親の箱には入れることができるということ。この場合親がインターフェースであっても可能である(newはできない)
Life hoge = new Wizard();
//Lifeはインターフェース
 


android stadio インストール:
うさぎをぐーぐるにおくるか?とか聞かれたときだけ
Don't sendで。
あとはnextでインストール。
 

PR

コメント

ブログ内検索

P R