オブジェクト指向 プログラミング演習 第 2 回クラス インスタンス メソッド コンストラクタ
先週の出席確認 Webブラウザはどのようなプログラムでできているかこの問に答える前に Webブラウザとは 何か? 普段使ってますよね? Webブラウザを使ってできることと Webブラウザがやっていることを区別する必要がある 何をすれば Web ブラウザ と言えるのか NHK チコちゃんに叱られる!
Web ブラウザがやっていること Web ページを表示する サーバに接続して Web ページの情報を受け取る 受け取った情報 (HTML など ) を解釈して表示する 表示しているページに対する操作に対応する リンクがクリックされたら リンク先のページを表示する 入力欄のあるページに入力された情報を記憶する TAB で入力欄のフォーカスを移動する submitが押された enterキーが押されたときにサーバに接続して入力された情報を渡す
Web ブラウザがやっていること サーバに接続して Web ページの情報を受け取る サーバに接続するには サーバのアドレスなどを知る必要がある http://sun.ac.jp/prof/yamagu/ プロトコル サーバのアドレス サーバ上の情報の位置 URL を解釈して プロトコル サーバのアドレス 情報の位置を識別 ( 取り出す ) 機能を持っている プロトコルに従ってサーバと通信する http, https など
Web ブラウザがやっていること 受け取った情報 (HTML など ) を解釈して表示する HTML の解釈 表示 CSS の解釈 JavaScript の解釈 実行 画像情報の解釈 ( 解凍 ) 表示 その他 (pdf とか Flash とか ) プラグインを導入できるようにしておく プラグインに情報を渡す プラグインが画像や音声を出力できるようなインタフェースが必要
Web ブラウザがやっていること リンクがクリックされたら リンク先のページを表示する 画面上の位置とHTML 中の位置を対応づける リンク先は URL URLの解釈をする URLが省略されていることもある URLの補完をしている
Web ブラウザがやっていること Webページの閲覧を便利にする機能 閲覧履歴を記録する 履歴の中を前ページを表示する 履歴の中の次ページを表示する 再読込 ブックマーク ( お気に入り ) を記録する 複数タブ / 複数ウィンドウ Cookie の記録 管理
Web ブラウザの部品 ユーザとのインタフェース テキストの入力欄 ボタン Webページを表示する画面 HTMLの Form タグ内で使われる入力の仕組み
Web ブラウザがやっていないこと サーバ名から IP アドレスを得る 検索 これは DNS の仕事 Web ブラウザは DNS への問い合わせをする これは検索エンジンの仕事 Web ブラウザは検索エンジンに検索語を渡し 応答として返ってきた Web ページを表示している HTML や CSS の記述 これは Web ページを作る人の仕事 問は Web ページがどうできているか ではない Web ブラウザは HTML や CSS を解釈して Web ページの表示を行っている ネットワーク上の他のパソコンから接続される これは (Web) サーバの仕事
Web ブラウザがやっていることだが ブックマークの機能だけ述べた回答がありました インタフェースについてだけ述べた回答がありました Webブラウザの中心的な機能はWebページの表示です当たり前のことが意識できていない回答です
整理をし 言葉を選んで 回答すること Web ブラウザの画面は HTML と CSS でできている という回答がありました HTML と CSS で出来ているのは Web ページです Web ブラウザは Web ページを表示する機能を持っていますが それはブラウザの一部です この回答は 整理ができていない または 分かって書いているのなら 言葉が足りない
演習への回答に際しての注意事項 当たり前のことをきちんと書きましょう 本質 ( もっとも重要なこと ) は何かを はっきりさせるため 当たり前のことだけで終わってはダメ 定義を書いただけ 言い換えただけになるので 本質について より深く考えて下さい ブックマークの機能がなくても Web ブラウザとして成立しますよね?
今日のお題 クラス インスタンス メソッド オブジェクトモノの種類 コンストラクタ モノの実体 関数のようなもの モノの機能を表す計算手順 新しいインスタンスを作るときに呼び出される計算手順 本演習の Web ページがあります : http://sun.ac.jp/prof/yamagu/2018oop/
Java の型とクラス (C 言語と同様に ) 変数や返戻値は型を持つ 型には プリミティブ型とクラスがある プリミティブ型 :int, double など プリミティブ型の変数は その型の値を記憶する クラス 最初から用意されているもの 自分で定義したもの 文字列は String クラスで表される クラスを型とする変数は そのクラスのインスタンスを記憶する インスタンスが値として扱われている primitive は原始的な / 単純な / 元々のといった意味
サンプルプログラム Oop2.java というファイルを作り javac Oop2.java でコンパイル java Oop2 で実行 今日は Oop2.java というファイルを書き換えながら演習します java.awt パッケージの下にあるすべてのクラスを利用可能にする java.awt パッケージは GUI を作るのに使えるクラスを提供する import java.awt.*; public class Oop2 { public static void main(string args[]) { Frame f; f = new Frame(); f.setvisible(true); f に記憶されている Frame のインスタンスの setvisible メソッドを呼び出す ウィンドウが見えるようになる Frame クラスのインスタンスを記憶できる変数 f を宣言 新しく Frame クラスのインスタンスを作って f に代入 画面上にウィンドウ ( 枠 ) を出すためのデータを用意している
画面上にウィンドウを表示するプロ グラム このままだと あまりに小さいので Frame のインスタンスを見えるようにする前に大きさを設定する import java.awt.*; public class Oop2 { public static void main(string args[]) { Frame f; f = new Frame(); f.setsize(200,200); f.setvisible(true); f ( に記憶されている Frame のインスタンス ) の大きさを 200 200 にする
サンプルプログラム ためしに もう一つ Frame のインスタンスを作ってみる import java.awt.*; public class Oop2 { public static void main(string args[]) { Frame f; f = new Frame(); f.setsize(200,200); f.setvisible(true); f = new Frame(); f.setsize(100,200); f.setvisible(true); 区別できるように 大きさを変える 新しく Frame クラスのインスタンスを作って f に代入 改めて Frame クラスのインスタンスを作って f に代入 ウィンドウが二つ現れる
ここまでのまとめ Frame クラスのインスタンスを作る new Frame() ウィンドウが作られる Frameクラスは 可視 / 不可視を制御する機能を持つ setvisible メソッドを呼ぶ Frameクラスは 大きさを変える機能を持つ setsize メソッドを呼ぶ
コンストラクタ インスタンスを生成するときに呼ばれる 個々のインスタンスに初期設定をするなど Java の API を参照して Frame クラスに どんなコンストラクタがあるか 調べてみよう : Frame() Frame(GraphicsConfiguration gc) Frame(String title) タイトルを指定できる Frame(String title, GraphicsConfiguration gc)
コンストラクタの利用例 new クラス名に続く括弧内に コンストラクタへの引数を渡す import java.awt.*; public class Oop2 { public static void main(string args[]) { Frame f; f = new Frame("OOP"); f.setsize(200,200); f.setvisible(true); 新しく Frame クラスのインスタンスを作るとき タイトルを指定している
ここまでは 既存のクラスの既存のコンストラクタやメソッドを使った 次は 自分でコンストラクタやメソッドを定義してみよう
Frame を持つクラスを定義してみる import java.awt.*; public class Oop2 { Frame fr; Oop2() { fr = new Frame("Oop2"); fr.setsize(200,200); fr.setvisible(true); public static void main(string args[]) { Oop2 test; test = new Oop2(); Oop2 は Frame を一つ持つ これはフィールド Oop2 のインスタンスを作る ウィンドウが現れる フィールドの宣言には 型フィールド名 ; というパターンを書く public や static などの修飾が付くこともある Oop2 のコンストラクタの定義コンストラクタは クラス名 ( 仮引数列 ){... というパターンで定義する コンストラクタの定義には public などの修飾が付くこともある
メソッドの定義と呼出し メソッドの定義には public や static などの修飾が付くこともある import java.awt.*; public class Oop2 { Frame fr; Oop2() { fr = new Frame("Oop2"); fr.setsize(200,200); fr.setvisible(true); void large() { fr.setsize(400,400); public static void main(string args[]) { Oop2 test; test = new Oop2(); test.large(); メソッドの定義は 返戻値の型メソッド名 ( 仮引数列 ){ というパターンを クラスの定義の中に書く C 言語では引数を持たない関数では 仮引数列に void と書くことを推奨したが Java では仮引数列に void と書くことができない メソッドの呼出し 変数 test( に記憶されているOop2のインスタンス ) の large メソッドを呼んでいる
今日のまとめ クラス class というキーワードを使って定義する その中身には フィールド メソッド コンストラクタを書く インスタンス new というキーワードを使って 生成する メソッド インスタンス i のメソッド m を i.m(...) というパターンで呼び出す クラスの定義の中で メソッドを定義する コンストラクタ new を使うと呼び出される コンストラクタの定義も クラスの定義の中に書く
import java.awt.*; public class Oop2 { おまけ : 絵を描くくらいしたい Frame fr; Oop2() { fr = new Frame("Oop2"); Canvas cv = new Canvas() { ; public void paint(graphics gc) { gc.setcolor(new Color(255,255,255)); gc.fillrect(0,0,200,200); gc.setcolor(new Color(0,0,0)); gc.drawline(50,50,150,150); cv.setsize(200,200); fr.add(cv); fr.pack(); fr.setvisible(true); 絵を描くには Canvas クラスを使う Canvas の大きさを設定する public static void main(string args[]) { new Oop2(); 作ったインスタンスを 受け取る変数が必要なワケではない Canvas のサブクラスを名前を付けずに定義して そのインスタンスを作っている Frame に Canvas を入れる 描画の命令は Graphics クラスのインスタンスを通じて行う 白で 200 200 の領域を塗りつぶす 黒い線を一本描く Frame の大きさを計算する ここでは Canvas に合う大きさになる
次回予告 アクセス制御