本日の課題

Download Report

Transcript 本日の課題

オブジェクト指向プログラミング
6回目:ラップクラス,カプセル化,制御文
情報メディア学科
濱本和彦
本日の内容
Integerとintは違うの?

ラップクラスとカプセル化
Cの変数宣言とJavaのインスタンス宣言の違い

new演算子
制御文

If文とfor文
ラップクラスとカプセル化
Integerクラス



Integerオブジェクトは,基本データ型intの値をカプセ
ル化する。
これを,「Integerはintのラップクラスである」という。
Integerクラスは,静的メンバとインスタンスメンバの両
方を提供するクラスである。
カプセル化

データとデータを操作するコード(メソッド)を関連づけ
る仕組み。
Integerクラスの例
class Example20 {
public static void main(String args[])
{
String s = "125";
Integer obj = Integer.valueOf(s);
int i = obj.intValue();
i += 10;
System.out.println(i);
}
}
Integerクラスの例
class Example20 {
public static void main(String args[])
{
String s = "125";
Integer obj = Integer.valueOf(s);
int i = obj.intValue();
i += 10;
System.out.println(i);
}
}
静的メソッドvalueOf()がStringオブジェクトsを引数に取り,Integerオブジェク
トを返す。
このオブジェクトはobjに代入される。
Integerクラスの例
class Example20 {
public static void main(String args[])
{
String s = "125";
Integer obj = Integer.valueOf(s);
int i = obj.intValue();
i += 10;
System.out.println(i);
}
}
インスタンスメソッドintValue()がobjに対して実行される。
objにカプセル化されている値をint型で返す。この返り値が変数iに代入され
る
このようにも書けます
class Example21 {
public static void main(String args[])
{
String s = "125";
int i = Integer.valueOf(s).intValue();
i += 10;
System.out.println(i);
}
}
このようにも書けます
class Example21 {
public static void main(String args[])
{
String s = "125";
int i = Integer.valueOf(s).intValue();
i += 10;
System.out.println(i);
}
}
静的メソッドvalueOf()がString引数を取りInteger
オブジェクトを返す。
赤字の部分が「Integerオブジェクト」となる
このようにも書けます
class Example21 {
public static void main(String args[])
{
String s = "125";
int i = Integer.valueOf(s).intValue();
i += 10;
System.out.println(i);
}
}
赤字の部分のIntegerオブジェクトに対して,インスタンスメ
ソッドintValue()が実行される。
カプセル化されている値をint型で返し,iに代入する。
Integerクラスの静的メソッド
(抜粋)
メソッド
Integer valueOf(String s)
int parseInt(String s)
String toBinaryString(int i)
Integer valueOf(String s, int r)
int parseInt(String s, int r)
説明
sを基数10の数値として変換し
てIntegerオブジェクトで返す
sを基数10の数値として変換し
てint型で返す
iの2進表現をStringオブジェク
トで返す
sを基数rの数値として変換して
Integerオブジェクトで返す
sを基数rの数値として変換して
int型で返す
Integerクラスのインスタンスメソッド
(抜粋)
メソッド
byte byteValue()
double doubleValue()
boolean equals(Object obj)
int intValue()
String toString()
説明
現在のオブジェクトの値をbyte型で
返す
現在のオブジェクトの値をdouble
型で返す
objと現在のオブジェクトの値が同
じなら真を返す
現在のオブジェクトの値をint型で
返す
現在のオブジェクトの値の文字列
表現を返す
問題
Example21.javaを,静的メソッドparseInt()を
使う形に書き換えなさい(Problem6.java)。
Integerクラスには,MAX_VALUEと
MIN_VALUEという2つの静的変数が定義さ
れています。これらの値を出力しなさい
(Problem7.java)。
オブジェクトを直接生成する
これまでは,静的メソッドの返り値などの形
で間接的にオブジェクトを作りました。
String s = "125";
や
Integer obj = Integer.valueOf(s);
など。
オブジェクトを直接生成する
new演算子を用いると,直接オブジェクトを
作ることが出来ます。
クラス名 オブジェクト名 = new クラス名(引数)
・「コンストラクタ」と呼ばれるクラス名と同じ名前のメソッド
・オブジェクト生成時に実行され初期値などを与える
Integerクラスのコンストラクタ
class Example22{
public static void main(String args[])
Integer obj1 = new Integer(5);
Integer obj2 = new Integer("6");
int i1 = obj1.intValue();
int i2 = obj2.intValue();
System.out.println(i1);
System.out.println(i2);
}
}
{
Integerクラスのコンストラクタ
class Example22{
public static void main(String args[])
{
Integer obj1 = new Integer(5);
Integer obj2 = new Integer("6");
int i1 = obj1.intValue();
int i2 = obj2.intValue();
基本データ型
System.out.println(i1);
intの値を引数
System.out.println(i2);
とします
}
}
Integerクラスのコンストラクタ
class Example22{
public static void main(String args[])
{
Integer obj1 = new Integer(5);
Integer obj2 = new Integer("6");
int i1 = obj1.intValue();
int i2 = obj2.intValue();
Stringオブジェクト
System.out.println(i1);
を引数とします。
System.out.println(i2);
形式によっては
}
エラー(例外)が
}
発生します。
例えば,”A”など
としてみましょう。
Integerクラスのコンストラクタ
class Example22{
public static void main(String args[])
{
Integer obj1 = new Integer(5);
Integer obj2 = new Integer("6");
int i1 = obj1.intValue();
int i2 = obj2.intValue();
System.out.println(i1);
オブジェクトから呼び
System.out.println(i2);
出されるインスタンス
メソッドです
}
}
Integerクラスのインスタンスメソッド
(抜粋)
メソッド
byte byteValue()
double doubleValue()
boolean equals(Object obj)
int intValue()
String toString()
説明
現在のオブジェクトの値をbyte型で
返す
現在のオブジェクトの値をdouble
型で返す
objと現在のオブジェクトの値が同
じなら真を返す
現在のオブジェクトの値をint型で
返す
現在のオブジェクトの値の文字列
表現を返す
オブジェクト名の意味
次のプログラムの意味を考えてみましょう
class Example23 {
public static void main(String args[]) {
Integer obj1 = new Integer(5);
Integer obj2 = obj1;
System.out.println(obj1);
System.out.println(obj2);
}
}
一見,単に値をコピーしているだけのように見えますが。。
オブジェクト名の意味
Integer obj1 = new Integer(5);
Integer obj2 = obj1;
メモリ領域
obj1
この時点では,名前の宣
言のみで,まだメモリ上に
実体がありません。
オブジェクト名の意味
Integer obj1 = new Integer(5);
Integer obj2 = obj1;
メモリ領域
obj1
オブジェクト
この時点で,メモリ上にオブジェ
クトの領域が確保されて,
obj1がその領域の場所の情報
を受け取ります。
5
オブジェクト名の意味
Integer obj1 = new Integer(5);
Integer obj2 = obj1;
メモリ領域
obj1
obj2
obj2が宣言されますが,実体は
まだありません。
オブジェクト
5
オブジェクト名の意味
Integer obj1 = new Integer(5);
Integer obj2 = obj1;
obj1が持っている領域情報が
obj2にコピーされます。
obj1
obj2
obj2はobj1とおなじ領域を指し
示すことになります。
メモリ領域
オブジェクト
5
オブジェクト名の意味
オブジェクト名には,オブジェクトそのもの
ではなく,オブジェクトの「ポインタ」が保存
されています。
Example24.javaで確認しましょう。
オブジェクト名の意味
次の場合はどうでしょうか?
class Example25 {
public static void main(String args[]) {
Integer obj1 = new Integer(5);
System.out.println(obj1);
obj1 = new Integer(10);
System.out.println(obj1);
}
}
単にオブジェクトの値を変えただけのように見えますが。。
オブジェクト名の意味
Integer obj1 = new Integer(5);
obj1 = new Integer(10);
メモリ領域
obj1
先ほどと同様です。
オブジェクト
5
オブジェクト名の意味
Integer obj1 = new Integer(5);
obj1 = new Integer(10);
メモリ領域
obj1
新たなオブジェクトが生成されて
obj1のポイント先が変わります。
オブジェクト
5
オブジェクト
10
オブジェクト名の意味
Integer obj1 = new Integer(5);
obj1 = new Integer(10);
参照されなくなった”5”という値のオブ
ジェクトの立場は?
obj1
「ガベージコレクション」という仕組み
があります。
使われなくなったメモリ領域を自動的
に回収するJavaの仕組みです。
メモリ領域
オブジェクト
5
オブジェクト
10
その他のラップクラス
Javaでは,Integerクラス以外の7個の基本データ型にもラッ
プクラスが定義されています。







Boolean
Character
Byte
Short
Long
Float
Double
「文字列を基本データ型に変換するメソッドを提供している」
ことが重要です。
カプセル化された基本データ型の値の変更は出来ません。
生成後のオブジェクトは不変となるので注意が必要です。
オブジェクトの配列
前回の最初に「基本データ型の配列」につ
いて説明しました。
オブジェクトについても同様に配列を作る
ことが出来ます。
Example26.javaを実行してみましょう。
nullという出力は何を表しているのでしょう
か?
オブジェクトの配列
main()メソッドの引数は,実はStringオブジ
ェクトの配列です。
public static void main( String args[] )
この引数は,プログラム実行時にコマンド
ラインから渡されるため,コマンドライン引
数と呼ばれます。
コマンドライン引数
Example27.javaでコマンドライン引数の取
得方法を確認しましょう。
class Example27 {
public static void main(String args[]) {
int i;
for (i = 0; i < args.length; i++) {
System.out.println("args[" + i + "]=" + args[i]);
}
}
}
コマンドライン引数の与え方
Visual Studioの場合
「プロジェクト」タブから「プロパティ」を選び
ます。
「デバッグ」タブを選びます。
「開始オプション」の中の「コマンドライン引
数」に記入します。
複数与える場合はスペースで区切ります。
全て「文字列型」で扱われます。
コマンドライン引数による計算
Example28.javaは,コマンドライン引数を
数値に変換して計算する例です。
class Example28 {
public static void main(String args[]) {
int i = Integer.parseInt(args[0]);
int j = Integer.parseInt(args[1]);
int sum = i + j;
System.out.println("Sum is " + sum);
}
}
コマンドライン引数による計算
Example28.javaは,コマンドライン引数を
数値に変換して計算する例です。
class Example28 {
public static void main(String args[]) {
int i = Integer.parseInt(args[0]);
int j = Integer.parseInt(args[1]);
int sum = i + j;
System.out.println("Sum is " + sum);
}
}
※ラップクラスのparseIntメソッドを用いて文字列から数値に変換します。
演習
コマンドライン引数として円の半径を受け
取り,面積を表示するプログラムを作成し
なさい(Problem8.java)。
System.out.println()とは?
Javaで最初に使った関数(メソッド)ですが,この意
味を考えてみましょう。
「System」は,クラス名です。
「out」は,Systemクラスの静的変数です。
PrintStreamオブジェクトへの参照(ポインタ)を表し
ます。
PrintStreamクラスは,入出力サポートを提供して
くれるクラスで,print()やprintln()は,標準出力に
文字列引数を表示するインスタンスメソッドです。
Systemクラスには,exit(0) : 「その時点で正常に
プログラムを終了」などの静的メソッドがあります。
制御文:if文
Javaにも,もちろんif文があります。
書式は,C言語と同じです。
次のプログラムを考えてみましょう
(Example29.java)。




メートル単位とフィート単位の変換を行うプログラムを
作成します。
コマンドラインの第一引数は数値,第二引数は単位,
”feet”または”meters”とします。
この引数が”feet”の場合はメートル単位に変換した答
えを,”meters”の場合は,フィート単位に変換した答え
を返します。そのどちらでもない場合はエラーメッセー
ジを返します。
1メートルは3.28フィートとします。
制御文:if文
Example29.javaでの注意点
コマンドライン引数の,args[0]が数値,args[1]が
単位となります。
どちらも文字列型です。
args[0]は,文字列から数値に変換する必要があ
ります。
if(args[1]==“meters”)では正しい答えが得られま
せん。なぜでしょう?



args[1]はStringクラスのオブジェクトです。文字列変
数ではありません。
オブジェクト名は何を表しているのでしょう?
「他の文字列と同じなら真」というメソッドはなんでしょ
う?

文字列の大文字と小文字を区別しない場合のメソッドは?
制御文:if文
問題(Problem9.java)
Exmaple29.javaに,次の処理を追加して下
さい。
「コマンドラインに引数が無い場合,「引数があ
りません」,というメッセージを出して終了する」
 「引数が1つのみの場合,「引数が足りません」
というメッセージを出して終了する」
 ヒント:「引数がない」の判断は,「配列argsの長
さ(要素数)が0である」という判断です。

制御文:for文,他
Javaにおけるfor文,while文,break文,
switch文,関係演算子,論理演算子なども
C言語と同じです。
次のプログラムを考えてみましょう
(Example30.java)。
コマンドライン引数として与えられた英文の中
から,$で始まる文字列(金額の情報)を探しま
す。
 最初に見つかった金額を表示して終了します。

中間テストについて
日時:6月2日(火) 11:05-12:05
場所:421教室
内容:






オブジェクト指向の特徴(文章の穴埋め)
プログラムの誤り指摘
プログラムの穴埋め
コンパイル・実行結果予想
授業時のプログラムリスト8割,新出のリスト2割
プログラムはすべてJavaから出題