オブジェクト指向 プログラミング演習sun.ac.jp/prof/yamagu/2018oop/oop02.pdf ·...

Post on 18-Sep-2020

1 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

オブジェクト指向プログラミング演習

第2回 クラス・インスタンス・メソッド・コンストラクタ

2018.04.20

先週の出席確認

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 クラスのインスタンスを作るとき、タイトルを指定している。

ここまでは、既存のクラスの既存のコンストラクタやメソッドを使った。

次は、自分でコンストラクタやメソッドを定義してみよう

2018.04.20

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();

}

}

おまけ: 絵を描くくらいしたい

2018.04.20

絵を描くにはCanvas クラスを使う

Canvas のサブクラスを名前を付けずに定義して、そのインスタンスを作っている

描画の命令は Graphics

クラスのインスタンスを通じて行う

白で200×200の領域を塗りつぶす

Canvas の大きさを設定する

黒い線を一本描く

Frame に Canvas を入れる

Frame の大きさを計算する。ここでは Canvas に合う大きさになる。

次回予告

アクセス制御

2018.04.20

top related