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