Head First Java 第2版――頭とからだで覚えるJavaの基本 その2
オブジェクト指向
クラスを作る際に考えるべきこと
・クラスに対応する物や事に必要な[情報]は何か?
・クラスに対応する物や事が果たすべき[機能]は何か?
class ShoppingCart {
cartContents //情報
addToCart() //機能}
情報のことをインスタンス変数
機能のことを「メソッド」と呼ぶ
■クラスとオブジェクトの違い
クラスはオブジェクトの設計図
ex.buttonクラスがあったとき、その形や色、ラベルなどが異なるbuttonオブジェクトが作られる
クラスとオブジェクトの関係は新品の「アドレス帳」のようなもの
■クラスの作成と使用
クラスを使用するためにテストをするためのクラスを作る。
■mainから外へ飛び出す
mainメソッドだけを使っているうちはオブジェクト指向プログラミングとは言えません
■mainメソッドの役割
・他のクラスのテスト
・Javaアプリケーションの起動
[サンプル]オブジェクト指向を使って数当てゲームを書いてみる
・数当てゲームクラス
/** *0~9までの数から無作為に数字が選ばれて、 *その数字が何かPlayerオブジェクトが予測するゲーム */ public class GuessGame { //インスタンス変数の宣言 Player p1; Player p2; Player p3; public void startGame() { //Playerオブジェクトを作成する p1 = new Player(); p2 = new Player(); p3 = new Player(); //playerが予測した数字を代入する変数 int guessp1 = 0; int guessp2 = 0; int guessp3 = 0; //正解フラグ boolean p1isRight = false; boolean p2isRight = false; boolean p3isRight = false; //無造作に数字を選ぶ int targetNumber = (int) (Math.random() * 10); System.out.println("I'm thinking of a number between 0 and 9..."); while(true) { System.out.println("Number to guess is " + targetNumber); //Playerオブジェクトのguess()メソッドを呼び出す p1.guess(); p2.guess(); p3.guess(); //Playerの予測した数字を取得する guessp1 = p1.number; System.out.println("Player one guessed " + guessp1); guessp2 = p2.number; System.out.println("Player two guessed " + guessp2); guessp3 = p2.number; System.out.println("Player two guessed " + guessp3); //Playerオブジェクトの予想した数字と、無作為に選ばれた数字を比較する //正しければ正解フラグをtrueにする if (guessp1 == targetNumber) { p1isRight = true; } if (guessp2 == targetNumber) { p2isRight = true; } if (guessp3 == targetNumber) { p3isRight = true; } //いずれかのPlayerオブジェクトの予測が正しければ以下の処理が実行される if (p1isRight || p2isRight || p3isRight) { System.out.println("We have a winner!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); System.out.println("Player one got it right? " + p1isRight); System.out.println("Player two got it right? " + p2isRight); System.out.println("Player three got it right? " + p3isRight); System.out.println("Game is over."); break; } else { System.out.println("Player will have to try again."); } } } }
・Playerクラス
public class Player { //予測した数字が入る int number =0; public void guess() { number = (int) (Math.random() * 10); System.out.println("I'm guessing " + number); } }
・テストクラス
public class GameLauncher { public static void main(String[] args) { GuessGame game = new GuessGame(); game.startGame(); } }
■ガーベージコレクション
今後使われることのないと判断されたオブジェクトをゴミとして処理する
■素朴な疑問
・Javaにはグローバル変数が存在しないの?
public staticや public static final することでグローバル変数ぽくなります
・それってオブジェクト指向なの?
結局なんらかのクラスがもってる変数を参照しているからオブジェクト指向
・Javaのプログラムは結局クラスの集まりということ?
そうです
・クラスの数が膨大になったら?
.jarファイルにまとめます。マニフェストと呼ばれるテキストファイルににどのクラスがmain()メソッドを持っているかという情報を持っています。
■重要ポイント
1.オブジェクト指向プログラミングでは既存のコードに手を付けずにプログラムを拡張することができる
2.Javaプログラムのコードは必ずいずれかのクラスに属する
3.クラスはオブジェクトを作るための設計図のようなもの
4.オブジェクトを利用する際、中の仕組みがどのようになっているかを知る必要はない。仕方と結果だけわかればよい。
5.クラスには情報と機能を持たせる
6.クラスの持つ情報を「インスタンス変数」と呼ぶ
7.クラスの持つ機能を「メソッド」と呼ぶ
8.クラスをテストするには別のクラスから呼び出してみる。(オブジェクトを生成する)
9.クラスは他のクラスから変数やメソッドを使いまわせる(継承)
10.Javaプログラムは「オブジェクトのやりとり」で成り立っている
1章 Javaの世界に飛び込もう
・ソースコードからコンパイラへ
コンパイラはバイトコードへ。このバイトコードを仮想マシンが理解する。
・コンパイル
Party.javaをコンパイルするとParty.classができる。コンソールからコマンド「java Party」で実行できる。
・Javaの歴史
Java1.02(250クラス) -> Java1.1(500クラス) -> Java2(2300クラス) -> Java5.0(1.5以降 3500クラス)
自分で考えてみよう-------------------------------------
int size = 27 //int型の変数sizeに27を代入
String name = "Fido"; //String型の変数name文字"Fido"を代入
Dog myDog = new Dog(name, size); //Dog型の変数myDogにnameとsizeを引数にしてDogオブジェクトを作る
X = size - 5; //変数Xにsizeから5をマイナスして代入 Xは宣言されていない
if(x < 5) myDog.bark(8); //xが5未満ならばDogクラスのbarkメソッドを8を引数にして実行
while (x > 3) { //xが3以上の間
myDog.play(); //Dogクラスのplayメソッドを実行
} //while閉じるint[] numList = {2,4,6,8}; //int型の配列numListに2,4,6,8を代入
System.out.print("Hello"); //"Hello"と表示
System.out.print("Dog:" + name); //"Dog:"のあとに変数nameを表示
String num = "8"; //Strign型の変数numに文字8を代入
int z = Integer.parseInt(num); 変数numをint型に型変換を行いint型の変数zに代入
try { //必ず成功するとは限らない処理の実行を試みる
readTheFile("myFile.txt"); //myFile.txtを引数にしてreadTheFIleメソッドを実行
}
catch(FileNotFoundException ex){ //実行した処理が失敗した場合に実行される
System.out.print("File not found."); //例外をキャッチしたらこのメッセージを表示
}
- -
■Javaプログラム(ソースファイル)の構造
・ソースファイルの構成
ソースファイルをクラスで構成される。
public class Dog {
}
・クラスの構成
クラスはメソッドという要素から構成される。
右の図Dogクラスはbark()というメソッドが含まれています。
メソッドの本体部分も{で始まり}で終わる。
public class Dog {
void bark() {
}
}
・メソッドの構成
メソッドの間にはそのメソッドでどのような処理を行うかの指示が書かれています。
その単位を「ステートメント」という。
public class Dog {
void bark() {
statement1;
statement2;
}
}
■mainメソッド
Java仮想マシンはmainというメソッドを探す。
詳しく見て行きましょう。
public //どこからでも呼び出せるアクセス修飾子
class //クラスの宣言
MyFirstApp { //クラスの名前public
static
void //void型は何も戻さないという意味
main //メソッドの名前
(String[] args) //Stringの配列を引数にして実行している
{
System.out.print("I Rule!");
}
}
■mainメソッドを持つクラス
・Java仮想マシンはクラスファイルと同じ名前のクラスを探してそれをロードします。
・そのクラスの中のmainメソッドを探して中のステートメントを実行する。
・mainメソッドは実行の起点になるメソッド。
・いかにプログラムが大きくても実行には必ずmainメソッドが必要である。
■mainメソッドの中身
1.単純な命令系 (変数の宣言,代入,呼び出し)
int x = 3;
String name = "dark";
2.繰り返し行う系 (while,for)
while(x > 12) {
}
for (int i=0;i>12;i++) {
}
3.ある条件が満たされた時系(if,else)
if((x < 3 )&(name.equals(""Drink))) {
}
・ループ
while文は一定の条件が満たされている間、同じ処理を繰り返す。
・条件判定< 小なり
> 大なり
== 等しい
■素朴な疑問
・Javaプログラムはクラスで構成されている
・mainメソッドが必要とされているのはひとつのクラスだけ
・int型とboolean型に互換性はない
■sysout.printとsysout.printlnの違い
・printだとすべての文字列が1つの行に固まって表示されますが、printlnだと文字列ごとに改行が行われる
■自分で考えてみよう
%java DooBoo
DooBeeDooBeeDo
上記のような実行結果を得るとき、以下のプログラムに何を入れればいいか。
public class DooBee {
public static void main (String[] args) {
int x = 1;
while (x < 2) {
System.out.print("Doo");
System.out.print("Bee");
x=x+1;
}
if(x==2) {
System.out.print("Do");
}
}
}
p.14まで
app inventorリニューアルされた?
app inventorリニューアルされたみたいですね。
ブロックエディタからこれ押すと。
エミュレータが起動する。
あと日本語対応ー?
http://piezdowe.blogspot.com/2011/01/blog-post.html
app inventorを使ってオリジナルアプリを作ってみる
app inventorが面白くなってきたので、自分でオリジナルなアプリを作ることにしました。
twtitterが取得できるようなのでユーザからつぶやき検索を試す。
電話するとき相手の状況が分からないから、ついtwitterを見て相手が今何してるか確認してから電話をかけることがたまにある。
電話帳からtwitter IDを取得してタイムラインを取得しつつ電話できるアプリがないかな..
ということで...
「TwittCall」
超プロトタイプ段階だが、、
連絡帳から電話番号を取得。
といっしょにtwitter idも取得したいけどGmailの連絡帳から取得できない。。
プロトタイプアプリの設計には使えるかも。
簡単だね!app inventor!
app inventorを使ってみた②
http://appinventor.googlelabs.com/learn/tutorials/piccall/piccall.html
チュートリアルを進めてみる作業。
「PicCall」
http://appinventor.googlelabs.com/learn/tutorials/piccall/piccall.html
写真をボタンにして、相手の電話にかけるアプリ。
App inventorは最初からコンポーネントが用意されており、それぞれ組み合わせて動作を実装していく。
「Social」カテゴリに「PhoneCall」というコンポーネントがあり、電話機能が動作する。
app inventorを使ってみた
Google、誰でもAndroidアプリを開発できるツール「App Inventor」
http://www.itmedia.co.jp/news/articles/1007/12/news070.html
Google、Android向けWYSIWYG開発ツール、App Inventorを発表―その影響は?
http://jp.techcrunch.com/archives/20100711google-app-inventor/
このへんも気になっていたのでapp inventorに登録してみた。
利用は簡単。
Gmailがあれば誰でも登録できる。
About - App Inventor for Androidのサイトから「Request Access」にあるフォームに入力して送信。
早ければ次の日には利用可能になる。
http://appinventor.googlelabs.com/about/
とりあえず、プロジェクトを作ってみる。右上「MyProject」をクリック。
チュートリアルにあるような猫アプリなら簡単に出来た。にゃあ。
http://appinventor.googlelabs.com/learn/tutorials/hellopurr/hellopurr-part1.html
面白そうだから色々いじってみる予定。
いくつか関連文書を集めてみる。
http://tatakau-developper.blogspot.com/
はじめての App Inventor講演者:梶川敬文
誰でも(プログラムを知らなくても)出来る!と言われているが BASIC レベルの知識は必要
Betaなので、全体的にまだ未完成の部分がある
クラウドサービスなので常に最新版を利用できるが、逆に勝手にアップデートされるので、昨日まで動いていたものが急に動かなくなることがある(まだBetaだからとう面もある)
プロトタイプ作成などに使えると思う
感想はじめての App Inventor という題名だったので、App Inventor の Hello World かと思ってた、App Inventor を使ってみてのレビューという感じだった
プログラムの論理構造をパズルっぽいブロックで組み合わせる表現方法は、今後の新しい開発環境でも用意されれば、言語ごとの表記方法の相違を飲み込んでくれるので、とっかかりの面倒臭さがなくなるかも ( 今で言えば Google Apps, Google Desktop, etc )
開発の敷居を下げることで Android 開発者の層が広がり、将来的に優秀な技術者を獲得することにつながる可能性も
App Inventor for Androidを始めよう!使い方その2
http://sepiandroid.blog100.fc2.com/blog-entry-43.html
日本アンドロイドの会 グループのディスカッションからいくつか
App Inventorで作成したアプリをAndroidマーケットに 公開する方法
https://groups.google.com/group/android-group-japan/browse_thread/thread/dba63da5be26b6e9/73b8507ca1cdcd3b?hl=ja&lnk=gst&q=app+inventor#73b8507ca1cdcd3b
GUI開発ツール「App Inventor」が、Googleから公開されました
https://groups.google.com/group/android-group-japan/browse_thread/thread/c536e482e14bd9f1/eee5a62971123fc5?hl=ja&lnk=gst&q=app+inventor#eee5a62971123fc5