java

安価でプログラミングをするスレより。このスレは1さんと2さんが主に会話をしています。Javaについての会話がとても有意義だったのでまとめてみました。挫折ポイントとして名高いオブジェクト指向も、このようにエヴァで例えるとすんなりと理解できそう!
1さんが2さんにJavaを教えるところからスタートします。
ちなみにけっこう長めのまとめ。Javaに興味ある人、Javaをお勉強中の人は何度か読み返すといいかもしれません(*・ω・*)

スポンサードリンク

110: 1◆NaUNjCMHzs 2014/04/05(土)01:07:13 ID:n6jvIZNZZ

どこまでできる?


111: 2◆DTn7LrZ..DaI 2014/04/05(土)01:08:06 ID:XKWkZFm7A

何をだい??


112: 1◆NaUNjCMHzs 2014/04/05(土)01:08:29 ID:n6jvIZNZZ

java

わかりやすいJava入門編
川場 隆
秀和システム
売り上げランキング: 14,849

113: 2◆DTn7LrZ..DaI 2014/04/05(土)01:09:49 ID:XKWkZFm7A

数値入力して計算して表示・・・


114: 1◆NaUNjCMHzs 2014/04/05(土)01:11:04 ID:n6jvIZNZZ

クラスのお話しする?
俺もよくわからんけど

object-class


115: 2◆DTn7LrZ..DaI 2014/04/05(土)01:11:31 ID:XKWkZFm7A

クラスのお話か~理解できるか心配w


116: 1◆NaUNjCMHzs 2014/04/05(土)01:15:26 ID:n6jvIZNZZ

class Tmp{
int val;
public void method(){
//処理
}
}

-------------------------
こんな「Tmp」というクラスがあったら
Tmp obj = new Tmp();//newを使ってインスタンスを生成して

obj.val = 50; //クラスの中身にアクセスするにはクラス名のあとに.を付ける
obj.method();


117: 2◆DTn7LrZ..DaI 2014/04/05(土)01:16:32 ID:XKWkZFm7A

(;゚Д゚)


121: 1◆NaUNjCMHzs 2014/04/05(土)01:20:59 ID:n6jvIZNZZ

もう一回エヴァで説明してみるよ


122: 2◆DTn7LrZ..DaI 2014/04/05(土)01:21:37 ID:XKWkZFm7A

はい、お願いします


123: 1◆NaUNjCMHzs 2014/04/05(土)01:24:22 ID:n6jvIZNZZ

いろいろな「物」の設計書をクラスという
設計書にはそれの持つデータとそれ行う動作が書いてある

クラス→設計書
データ→メンバ変数
動作→メソッド

エヴァ零号機は「名前」,「全長」,「重量」というデータを持ち
「歩く」,「走る」,「飛ぶ」という動作をする
これをコードで書くと

class 零号機{
  //メンバ
  String 名前;
  int 全長;
  int 重量;
  
  //メソッド
  public void 歩く(){ //処理 }
  public void 走る(){ //処理 }
  public void 飛ぶ(){ //処理 }
}


124: 2◆DTn7LrZ..DaI 2014/04/05(土)01:27:10 ID:XKWkZFm7A

ふんふん、そこまでは実際に作っていく中で体感的に理解はできてるようだ


125: 1◆NaUNjCMHzs 2014/04/05(土)01:31:22 ID:n6jvIZNZZ

で設計書をもとに零号機を作りたい

例えば今までにやったと思うが、int型の変数を宣言するときは
int num = 45;
これは「num」はint型の格納庫で45を格納しますという感じ

零号機 機体 = new 零号機();

「機体」は零号機を格納する場所
new 零号機();は零号機を実際に設計書をもとに製造する呪文
「機体」という場所にnew呪文で作った零号機を格納します

ってな感じ


126: 2◆DTn7LrZ..DaI 2014/04/05(土)01:35:03 ID:XKWkZFm7A

>>new 零号機();は零号機を実際に設計書をもとに製造する呪文
ここが今ひとつ分からない


127: 1◆NaUNjCMHzs 2014/04/05(土)01:36:27 ID:n6jvIZNZZ

後で説明する

new クラス名()

で実際に作る
この時作られたものを「インスタンス」という

「機体」も零号機のインスタンス


128: 2◆DTn7LrZ..DaI 2014/04/05(土)01:42:04 ID:XKWkZFm7A

うんうん


129: 1◆NaUNjCMHzs 2014/04/05(土)01:46:05 ID:n6jvIZNZZ

まず零号機を歩かせたい
じゃあ歩かせるには零号機を実際に作り、作った零号機に「歩く」命令を与えなければならない

//零号機を製造して
零号機 機体 = new 零号機();
//歩く命令を出す
機体.歩く();

クラスに書かれた動作やデータを参照するためには
インスタンス(機体)にドットを付けて参照する

//走る
機体.走る();

//名前を知りたい
String tmp = 機体.名前;


130: 2◆DTn7LrZ..DaI 2014/04/05(土)01:48:10 ID:XKWkZFm7A

ほぉなるほど・・・


131: 1◆NaUNjCMHzs 2014/04/05(土)01:52:22 ID:n6jvIZNZZ

次にメンバ(データ)へのアクセス

零号機の名前を知りたいとき
String data = 機体.名前
これでString型変数 dataには機体の名前が入る

零号機の名前を変えたいとき
機体.名前 = "俺の綾波"
これで機体の名前は「俺の綾波」になる


132: 2◆DTn7LrZ..DaI 2014/04/05(土)01:54:14 ID:XKWkZFm7A

変数に代入するみたいな感じだな・・・


133: 1◆NaUNjCMHzs 2014/04/05(土)01:55:42 ID:n6jvIZNZZ

まんまそれ
「機体」の中の変数に代入したりする

メソッドの引数についてはおk?


134: 2◆DTn7LrZ..DaI 2014/04/05(土)01:57:11 ID:XKWkZFm7A

この、メソッドすなわち動作の引用というのがピンと来ないのだ

実際に使う場面ではその動作というのは何になる??


135: 1◆NaUNjCMHzs 2014/04/05(土)02:01:42 ID:n6jvIZNZZ

まずメソッドはいろいろな処理をまとめた感じかな
エヴァが歩くとすると
public void 歩く(){
  
  右足前にする
  左腕前にする
  関節曲げる
  ・
  ・
  ・
}

歩く()って呼び出すとその中の処理をやっていく
いちいち腕あげろ足出せとか言わなくても歩けと命令を出せばやってくれる


136: 2◆DTn7LrZ..DaI 2014/04/05(土)02:04:35 ID:XKWkZFm7A

なるほど・・・いろいろな処理をまとめておけば
エヴァで言うと初号機でも使いまわしたり出来るってことかな?


137: 1◆NaUNjCMHzs 2014/04/05(土)02:06:14 ID:n6jvIZNZZ

初号機は関係ない今はあくまで「零号機」が持つ動作


138: 2◆DTn7LrZ..DaI 2014/04/05(土)02:08:44 ID:XKWkZFm7A

ほぉ、固有の~ということか


140: 1◆NaUNjCMHzs 2014/04/05(土)02:17:03 ID:n6jvIZNZZ

>>138
あくまで零号機の設計書の中だし


139: 2◆DTn7LrZ..DaI 2014/04/05(土)02:12:46 ID:XKWkZFm7A

最大公約数のアプリでいうと
public void onClick(View v){}これがメソッドだな

メソッドの中でほとんど全てをやったからメソッドの理解が進んでないんだな


140: 1◆NaUNjCMHzs 2014/04/05(土)02:17:03 ID:n6jvIZNZZ

>>139
そんな感じ

で次にメソッドの引数
なんらかの動作を行うときなんか外部からの情報がほしいときがある
「飛ぶ」ならどれくらいの高度まで飛ぶのか
この「どれくらい」という情報が引数にあたる

クラスでの書き方は
public void 飛ぶ(int 高度){
  //処理
  int num1 = 高度 * 10; //①
  重量 = 30; //②
}

使い方は
機体.飛ぶ(100);

この時、「高度」には100という値が入る
①のint num1 = 高度 * 10;はint num1 = 100 * 10;となりnum1には1000が格納されえる

後②の様にメソッド内で自身のメンバ変数(データ)を参照できる


141: 2◆DTn7LrZ..DaI 2014/04/05(土)02:20:13 ID:XKWkZFm7A

ふんふん
>>後②の様にメソッド内で自身のメンバ変数(データ)を参照できる
これが今ひとつ分からない


142: 1◆NaUNjCMHzs 2014/04/05(土)02:24:17 ID:n6jvIZNZZ

そのまま
メソッドの中で自分の情報を扱える
例えば零号機には「エネルギー」という情報を持っている
「飛ぶ」という動作をするとエネルギーを1消費してしまう。
だから「飛ぶ」命令を出されたときエネルギーを-1しなければならない
public void 飛ぶ(){
  //なんかの処理
  電力 = 電力 - 1;
}

これでこの機体の電力は1マイナスされたことになる


143: 2◆DTn7LrZ..DaI 2014/04/05(土)02:25:19 ID:XKWkZFm7A

なるほど!


144: 1◆NaUNjCMHzs 2014/04/05(土)02:33:49 ID:n6jvIZNZZ

次にメソッドの「戻り値」
シンクロ率を計算する動作「シンクロ率計算」というメソッドがあるとする
その命令をしてシンクロ率の計算をしても呼び出し側にはその情報は戻ってこない

そこで戻り値というものがある
public int シンクロ率計算(){ //①
  //シンクロ率格納変数
  int シンクロ率;
  //いろいろな計算をして結果を「シンクロ率」変数に入れる
  
  return シンクロ率; //②
}

いままでのと変わっているのは①でいままでvoidだったのがintになっているのと
②のreturnというのが出てること

まず①について、public int 飛ぶ() というのは
この「飛ぶ」というメソッドはint型のデータを返します
という宣言を表す

②のreturn シンクロ率; は呼び出しもとにシンクロ率の値を返しますよということである。

呼び出し側はどうなるかというと
int result = 機体.シンクロ率計算();

これで変数resultにはシンクロ率が格納される


145: 2◆DTn7LrZ..DaI 2014/04/05(土)02:36:43 ID:XKWkZFm7A

なるほど!!
いろんなソース見たけどreturn ~;ってのが何を言ってるのかさっぱりわからんかったけど
理解した


146: 1◆NaUNjCMHzs 2014/04/05(土)02:39:23 ID:n6jvIZNZZ

戻り値の型は何でも
intでもdoubleでも自分の作ったクラスやもとからあるクラスでも

おkなら次に行く


147: 2◆DTn7LrZ..DaI 2014/04/05(土)02:41:26 ID:XKWkZFm7A

当然この場合、return シンクロ率;はintで返されるんだよな?
そうならOKだ


148: 1◆NaUNjCMHzs 2014/04/05(土)02:48:21 ID:n6jvIZNZZ

intで返されるというかintを返さなければならない
シンクロ率がdoubleならコンパイルエラー

次に「コンストラクタ」
new 零号機(); で零号機のインスタンスを作るときに呼び出されるのがコンストラクタというもの

クラスでは
public 零号機(){
  //初期化処理
}

と書かれる
public クラス名(){}
という形

おk?


149: 2◆DTn7LrZ..DaI 2014/04/05(土)02:49:53 ID:XKWkZFm7A

OKだ


150: 1◆NaUNjCMHzs 2014/04/05(土)02:55:15 ID:n6jvIZNZZ

public 零号機(){
  //インスタンス生成時の初期化処理とかを書く
}

別に書かなくてもおk
デフォルトコンストラクタと言って何もしないコンストラクタができる

これもメソッドと同様で引数を設定できる
零号機 機体 = new 零号機(10,20);

ただ引数がついたコンストラクタを作るとデフォルトコンストラクタが消えるため
public 零号機(int num1,int num2){}
こんなコンストラクタを書いた場合
零号機 機体 = new 零号機();
引数を設定してないのでエラーになる


151: 2◆DTn7LrZ..DaI 2014/04/05(土)02:58:26 ID:XKWkZFm7A

(;゚Д゚)


152: 1◆NaUNjCMHzs 2014/04/05(土)03:03:19 ID:n6jvIZNZZ

class 零号機{
  public 零号機(){
    //なんか初期化処理とか
  }
}

この場合 new 零号機()でインスタンスを生成すると
  public 零号機(){
    //なんか初期化処理とか
  }
が呼び出される

インスタンス生成時に勝手に呼ばれるものがコンストラクタ
コンストラクタはpublic クラス名()の形


153: 2◆DTn7LrZ..DaI 2014/04/05(土)03:05:27 ID:XKWkZFm7A

public 零号機(){~何もしないコンストラクタができる
理解した
が、その下からさっぱり(;゚Д゚)


154: 1◆NaUNjCMHzs 2014/04/05(土)03:07:27 ID:n6jvIZNZZ

class 零号機{
  int 体重;
  public 零号機(){
    体重 = 30;
  }
}

零号機 機体 = new 零号機();
この段階で機体インスタンスの体重には30が設定されてある。


155: 2◆DTn7LrZ..DaI 2014/04/05(土)03:08:18 ID:XKWkZFm7A

うんうん


156: 1◆NaUNjCMHzs 2014/04/05(土)03:09:23 ID:n6jvIZNZZ

クラスに
public クラス名(){}
が書いていないときは「デフォルトコンストラクタ」という何もしないのが勝手につく


157: 2◆DTn7LrZ..DaI 2014/04/05(土)03:10:46 ID:XKWkZFm7A

デフォルトコンストラクタというものに何か意味があるのだろうか??


158: 1◆NaUNjCMHzs 2014/04/05(土)03:11:39 ID:n6jvIZNZZ

なにもしない


159: 2◆DTn7LrZ..DaI 2014/04/05(土)03:12:13 ID:XKWkZFm7A

なるほど・・・


160: 1◆NaUNjCMHzs 2014/04/05(土)03:14:01 ID:n6jvIZNZZ

でコンストラクタもメソッド同様に引数を設定できる
class 零号機{
  int 体重;
  public 零号機(int num1){
    体重 = num1;
  }
}

零号機 機体 = new 零号機(50);
int tmp = 機体.体重 //tmpには50が入る


161: 2◆DTn7LrZ..DaI 2014/04/05(土)03:17:27 ID:XKWkZFm7A

うんうん


162: 1◆NaUNjCMHzs 2014/04/05(土)03:19:29 ID:n6jvIZNZZ

>>160のクラスの状態で

零号機 機体 = new 零号機();

と書くとどうなるか。答えはコンパイルエラー
なぜかというと public 零号機()がクラスに書かれていないから


163: 2◆DTn7LrZ..DaI 2014/04/05(土)03:22:04 ID:XKWkZFm7A

(;゚Д゚)


class 零号機{
  int 体重;
  public 零号機(){
    //なんか初期化処理とか
  }
  public 零号機(int num1){
    体重 = num1;
  }

}
こうしなきゃいけないのか?


164: 1◆NaUNjCMHzs 2014/04/05(土)03:23:59 ID:n6jvIZNZZ

正解

それを「オーバーロード」っていう
メソッドの名前が同じでも引数の型や数が違ければ書いてもおk


165: 2◆DTn7LrZ..DaI 2014/04/05(土)03:26:03 ID:XKWkZFm7A

class 零号機{
  int 体重;
@Override
  public 零号機(int num1){
    体重 = num1;
  }

}
こうか?


166: 1◆NaUNjCMHzs 2014/04/05(土)03:26:43 ID:n6jvIZNZZ

それオーバーライド


167: 2◆DTn7LrZ..DaI 2014/04/05(土)03:29:16 ID:XKWkZFm7A

そうかww

しかしながら
class 零号機{
  int 体重;
  public 零号機(int num1){
    体重 = num1;
  }
}
こうしてしまうことがあるのか?
大体違う名前にしないか?


168: 1◆NaUNjCMHzs 2014/04/05(土)03:33:04 ID:n6jvIZNZZ

まずコンストラクタは名前を変えるのは不可能

後メソッドでも
public void 走る(){}
public void 走る_Arg1(int num1){}

引数の有無でメソッド名を変えられたら逆にメンドイ
走る()
走る(20)
このほうが簡潔


169: 2◆DTn7LrZ..DaI 2014/04/05(土)03:33:57 ID:XKWkZFm7A

なるほど


170: 1◆NaUNjCMHzs 2014/04/05(土)03:35:52 ID:n6jvIZNZZ

まだ色々あるけどクラスの書き方はこんなん

次いっておk?


171: 2◆DTn7LrZ..DaI 2014/04/05(土)03:36:51 ID:XKWkZFm7A

既に集中力が切れてるので
次も理解できるか怪しいがOKだw


172: 1◆NaUNjCMHzs 2014/04/05(土)03:42:30 ID:n6jvIZNZZ

オブジェクト指向の3大特徴?

1つが「カプセル化」
クラスの持つ情報を内部に隠ぺいすること

例えば
String ゼーレの文書 = 機体.内部情報;
なんてやったらネルフがやばい
なので機体の情報を内部に隠さなければならない
class 零号機{
  private String 内部情報;
}
メンバ変数の宣言で先頭にprivateを付ける
この状態でString ゼーレの文書 = 機体.内部情報;をやってもコンパイルエラーが起こる
この時「内部情報」はクラスの中でしか参照できない
これにより外部から値を変な風に変えられたりして変な動作を起こしたりはしなくなる

これが「カプセル化」
privateを修飾子という


173: 2◆DTn7LrZ..DaI 2014/04/05(土)03:44:08 ID:XKWkZFm7A

なるほどw
バグを防ぐためにも必要なのだろうね


174: 1◆NaUNjCMHzs 2014/04/05(土)03:47:39 ID:n6jvIZNZZ

修飾子はpublic,protected,(何も書かない),privateとかがある

public・・・どこからでも参照可能
protected・・・同じパッケージ、サブクラスから参照可能
(何も書かない)・・・同じパッケージのみ
private・・・クラス内のみ

まだ説明してないのもあるから雰囲気でいうと

public・・・誰にでも股を開くビッチ
protected・・・彼氏と自分の子供ならおk
(何も書かない)・・・彼氏のみ
private・・・オ○ニー


176: 1◆NaUNjCMHzs 2014/04/05(土)03:56:44 ID:n6jvIZNZZ

この修飾子はクラスやメソッドにもつけれる
公開したくないメソッドとか

class クラス{
  public 公開メソッド(){
    //クラス内だから使用可能
    非公開メソッド();
  }
  private 非公開メソッド(){
    //なんか処理
  }
}

//使用側
クラス tmp = new クラス();

tmp.公開メソッド(); //○
tmp.非公開メソッド(); //エラー


175: 2◆DTn7LrZ..DaI 2014/04/05(土)03:49:56 ID:XKWkZFm7A

急にエヴァ関係なくなってワロタwwww

でも、非常に分かりやすいw


178: 1◆NaUNjCMHzs 2014/04/05(土)04:00:27 ID:n6jvIZNZZ

>>175
エヴァぶっちゃけ知らないから適当に書くと
public・・・アスカ(誰にでもため口開くレベル)
protected・・・碇シンジ(身近な人だけ心開くレベル)
(何も書かない)・・・綾波(本当に特定な人だけ心開くレベル)
private・・・碇ゲンドウ,ラミエル(・・・)

3大特徴の前に言い忘れたことがあった
次行っておk?


179: 2◆DTn7LrZ..DaI 2014/04/05(土)04:01:49 ID:XKWkZFm7A

やっぱりあんま知らんかったかw(それにしては地味に良く知ってるな~と思ったけど)
OKだw


180: 1◆NaUNjCMHzs 2014/04/05(土)04:07:01 ID:n6jvIZNZZ

エヴァは知り合い経由の知識や

まず「static」キーワード
public static int func(){}
public static int num;

このstaticがつくとインスタンスを生成しなくても参照できる
class クラス{
  public static int func(){
    return 20;
  }
}
この場合は
int result = クラス.func();
でresultに20入る
staticがついたメソッドをスタティック(静的)メソッド
staticがついた変数をスタティック(静的)変数とかいう


183: 1◆NaUNjCMHzs 2014/04/05(土)04:35:17 ID:n6jvIZNZZ

次「final」キーワード
これを付けると編集不可的な
final int num = 50;
の場合
num = 20;
とやってもエラーになる
finalで宣言したらnumは定数になる

メソッドにもつけれる
この時は「オーバーライド」が不可になる
説明は省略

------------------------------------------------------

次 インスタンスの生成方法
①newを使う
②ファクトリメソッド
③Classクラスを使う

①は今までの
②は目的のインスタンスを返すstaticメソッドを呼ぶ
③こんなん
//零号機というクラスを文字列から取得
Class tmp = Class.forName("零号機");
//インスタンスを取得
零号機 wk = (零号機)tmp.newInstance();


184: 2◆DTn7LrZ..DaI 2014/04/05(土)04:50:43 ID:XKWkZFm7A

下がよく分かりませぬ


185: 1◆NaUNjCMHzs 2014/04/05(土)04:51:42 ID:n6jvIZNZZ

①だけわかってればおk


186: 2◆DTn7LrZ..DaI 2014/04/05(土)04:53:52 ID:XKWkZFm7A

newを使う・・・OKw


187: 1◆NaUNjCMHzs 2014/04/05(土)04:59:03 ID:n6jvIZNZZ

次「継承」
既にあるクラスを拡張したいときに使う
零号機の設計書(クラス)から零号機・改の設計書を作るなら

class 零号機{
int 重量;
}
class 零号機・改 extends 零号機{
String 装甲版;
String ウェポンラック;
}


この時、零号機・改は書かれていない「重量」をいう変数を引き継いでいる


188: 2◆DTn7LrZ..DaI 2014/04/05(土)05:00:05 ID:XKWkZFm7A

なるほどw


189: 1◆NaUNjCMHzs 2014/04/05(土)05:02:27 ID:n6jvIZNZZ

この時、零号機をスーパークラス(親クラス)
改をサブクラス(子クラス)という

継承を使うことによって1から書き直すことはなくなる


190: 2◆DTn7LrZ..DaI 2014/04/05(土)05:04:00 ID:XKWkZFm7A

うんうん


191: 1◆NaUNjCMHzs 2014/04/05(土)05:07:18 ID:n6jvIZNZZ

次に「オーバーライド」

class 零号機{
  public void func(){}
}
class 零号機・改 extends 零号機{
  public void func(){}
}

この時親クラスのfunc()は子クラスのfunc()に上書かれる
これを「オーバーライド」という


192: 2◆DTn7LrZ..DaI 2014/04/05(土)05:08:38 ID:XKWkZFm7A

なるほど


193: 1◆NaUNjCMHzs 2014/04/05(土)05:11:26 ID:n6jvIZNZZ

しかし

class 零号機{
  public void func(){}
}
class 零号機・改 extends 零号機{
  public void func(){
    親のfunc使いたい・・・//①
  }
}

①のような時がある。
この場合はsuper.func();で呼ぶことができる。

superはスーパークラスを指す
ちなみに自分自身はthisを使う


194: 2◆DTn7LrZ..DaI 2014/04/05(土)05:13:05 ID:XKWkZFm7A

なるほどw
setOnClickListener(this);
これか


195: 1◆NaUNjCMHzs 2014/04/05(土)05:15:24 ID:n6jvIZNZZ

それ
その場合はインタフェース関連してるから説明は省く

this.メンバ変数、this.メソッドとか使う

コンストラクタも同様


196: 2◆DTn7LrZ..DaI 2014/04/05(土)05:17:11 ID:XKWkZFm7A

なるほど

そろそろ、集中力どころじゃなく睡魔がやってきている一時中断出来ないだろうか
(;・∀・)


197: 1◆NaUNjCMHzs 2014/04/05(土)05:18:14 ID:n6jvIZNZZ

おk
日曜日まではいくらでも受け付けるで


198: 2◆DTn7LrZ..DaI 2014/04/05(土)05:19:29 ID:XKWkZFm7A

夕方には万全の体制で戻ってくるだろう

おやすみ~


199: 1◆NaUNjCMHzs 2014/04/05(土)05:20:21 ID:n6jvIZNZZ

おやすみノシ


206: 2◆DTn7LrZ..DaI 2014/04/05(土)17:37:13 ID:XKWkZFm7A

スタンバイOKだ!


207: 1◆NaUNjCMHzs 2014/04/05(土)17:45:07 ID:eAaoY1Xss

ラスト「ポリモーフィズム」
簡単に言えば呼び出し方を共通化する

class 初号機{
  public void 歩く(){
    //初号機独特の処理
  }
}
class 零号機{
  public void 歩く(){
    //零号機独特の処理
  }
}

零号機と初号機では歩く動作でも振る舞いは若干異なる

同じ命令を出しても異なった挙動を取得することができる

例えば犬と猫に「鳴け」と命令したら「ワン」と「ニャー」とそれぞれ固有の挙動をする


208: 2◆DTn7LrZ..DaI 2014/04/05(土)17:46:35 ID:XKWkZFm7A

なるほど


209: 1◆NaUNjCMHzs 2014/04/05(土)17:50:03 ID:n6jvIZNZZ

ポリモーフィズムに関連して「抽象メソッド」「抽象クラス」

抽象メソッドはこんなん
abstract void func();

頭にabstractがついて、{}これがついてないやつ

そして抽象メソッドを1つでも持ってるクラスを抽象クラスといい
abstract class 零号機{
}
こんな感じで宣言する


210: 2◆DTn7LrZ..DaI 2014/04/05(土)17:52:30 ID:XKWkZFm7A

抽象クラスはどんな時に使うんだ?


211: 1◆NaUNjCMHzs 2014/04/05(土)17:54:39 ID:n6jvIZNZZ

後々

抽象クラスは基本的にインスタンスは作れない(普通に作れるけど)
こういう形はエラー
abstract class 零号機{
}

零号機 機体 = new 零号機();

抽象クラスを使うにはそいつを継承して、抽象メソッドをオーバライドしなければならない


212: 2◆DTn7LrZ..DaI 2014/04/05(土)17:55:48 ID:XKWkZFm7A

なるほど


213: 1◆NaUNjCMHzs 2014/04/05(土)17:59:06 ID:n6jvIZNZZ

abstract class 零号機{
  abstract void func();
}

class 零号機・改 extends 零号機{
  @Override
  void func(){
    //なんか処理
  }
}

零号機・改 機体 = new 零号機・改();

なんで使うか
この時「零号機」を継承したクラスはfuncをオーバライドしなければならない
ということは「零号機」を継承したクラスは必ず「func」というメソッドを持っていることになる

これでポリモーフィズムが実現


214: 2◆DTn7LrZ..DaI 2014/04/05(土)18:02:16 ID:XKWkZFm7A

分かったような分からないような(;・∀・)


215: 1◆NaUNjCMHzs 2014/04/05(土)18:07:28 ID:n6jvIZNZZ

abstract class 動物{
  abstract String 鳴く();
}

class 犬 extends 動物{
  @Override
  String 鳴く(){
    return "ワン";
  }
}

class 猫 extends 動物{
  @Override
  String 鳴く(){
    return "ニャー";
  }
}

動物を継承してるなら「鳴く」という動作をする
「鳴く」という動作はそれぞれの動物の中で定義されている

同じ命令でも動物ごとに異なる動作を行う

犬 チワワ = new 犬();
猫 なめ猫 = new 猫();

//お前ら動物を継承してるから「鳴く」っていう動作はあるよね
チワワ.鳴く(); //ワン
なめ猫.鳴く(); //ニャー


216: 2◆DTn7LrZ..DaI 2014/04/05(土)18:08:49 ID:XKWkZFm7A

なるほど!理解した


217: 名無しさん 2014/04/05(土)18:10:09 ID:fDw7jBRSw

わかりやすくてありがたい


218: 1◆NaUNjCMHzs 2014/04/05(土)18:10:46 ID:n6jvIZNZZ

他にもいたのか


219: 2◆DTn7LrZ..DaI 2014/04/05(土)18:11:08 ID:XKWkZFm7A

おぉ!!
生徒は俺だけじゃなかったか!

途中で質問とかしてもいいんだぞ!


220: 1◆NaUNjCMHzs 2014/04/05(土)18:16:05 ID:n6jvIZNZZ

もう1つポリモーフィズムを実現するのが「インタフェース」
public class MainActivity extends Activity implements OnClickListener

↑たぶん見たことあるけど「OnClickListener」がインタフェース
これは定数と抽象メソッドしか持たない抽象クラスと考えればおk

interface 零号機{
  int エネルギー = 50;
  int 身長 = 20;
  void 走る();
  void 歩く();
}



abstract class 零号機{
  public final static int エネルギー = 50;
  public final staticint 身長 = 20;
  abstract void 走る();
  abstarct void 歩く();
}

これを実装するには
class 実装するクラス名 [extends xxx(なにか継承するなら)] implements 1,2,3・・・

implementsの後に書く
なんで全部抽象クラスじゃダメなの?と思うかもしれんが
基本的にJavaは1個だけしか継承できない
けどインタフェースはいくらでもつけれる

ちなみにinterface 零号機を実装したら「走る」「歩く」はオーバライド必須


221: 名無しさん 2014/04/05(土)18:16:55 ID:luePZrbDD

おいらも見てます
VBで勉強中ですが
めっちゃ参考になります


224: 2◆DTn7LrZ..DaI 2014/04/05(土)18:23:41 ID:XKWkZFm7A

interface 零号機{
  int エネルギー = 50;
  int 身長 = 20;
  void 走る();
  void 歩く();
}

を、

abstract class 零号機{
  public final static int エネルギー = 50;
  public final staticint 身長 = 20;
  abstract void 走る();
  abstarct void 歩く();
}

に書き換えたということ??


225: 1◆NaUNjCMHzs 2014/04/05(土)18:24:55 ID:n6jvIZNZZ

interface 零号機を抽象クラスとして描くとそうなるって感じ
interfaceの中は「抽象メソッド」と「定数」のみ


226: 2◆DTn7LrZ..DaI 2014/04/05(土)18:26:15 ID:XKWkZFm7A

なら、概ね理解できた


227: 1◆NaUNjCMHzs 2014/04/05(土)18:29:46 ID:n6jvIZNZZ

public class MainActivity extends Activity implements OnClickListener

button.setOnClickListener(this);

公約数アプリで↑みたいなの書いたと思う
setOnClickListener(①);
①にはOnClickListenerを実装したインスタンスを入れて欲しいといってる
OnClickListenerを実装しているということは public void onClick(View v)が定義されているということ
buttonは押された際にその定義された処理を行う


228: 2◆DTn7LrZ..DaI 2014/04/05(土)18:31:52 ID:XKWkZFm7A

なるほど!


229: 1◆NaUNjCMHzs 2014/04/05(土)18:35:20 ID:n6jvIZNZZ

ポリモーフィズムはまだまだ説明するのがあるけどメンドイからスルー

オブジェクト指向はこんなんでおk?
ほんの一部しかやってないけど


230: 2◆DTn7LrZ..DaI 2014/04/05(土)18:36:42 ID:XKWkZFm7A

OKかどうかは分からんが、今までやった内容に関しては依然としてぼんやりであるがOKだw

Javaの絵本 増補改訂版
Javaの絵本 増補改訂版
posted with amazlet at 14.04.12
(株)アンク
翔泳社
売り上げランキング: 10,406

元スレ:http://hayabusa.open2ch.net/test/read.cgi/news4vip/1396201980/