Transcript No.5

オブジェクト指向プログラミング
5回目:配列,クラスとメソッド,ラップクラス,
カプセル化,
情報メディア学科
濱本和彦
本日の内容
配列・多次元配列
String型の変数?


クラスとメソッドの基本
静的メンバとインスタンスメンバ
Integerとintは違うの?

ラップクラスとカプセル化
Cの変数宣言とJavaのインスタンス宣言の違い

new演算子
Javaにおける配列の宣言
Javaでは,次のように配列を宣言します。
int a[];
a = new int[10];
int a[];

aという名前のint型の配列を使う,という宣言で,メモリ上にはまだ領域
が確保されていません。
a = new int[10];

配列aに,メモリ領域を割り当てます。new演算子を使います。int型で10
個分の領域を確保します。
Javaにおける配列の宣言
1行にまとめて次のように書くことも出来ます。
int a[] = new int[10];
宣言と同時に初期化する場合は次のように
書きます。
int a[] = {0, 1, 2, 3,4 };
※この場合は,要素数5の配列が作られます
Javaにおける配列の宣言
Example11.javaを実行して下さい。
配列宣言と同時に初期化するように書き
換えて下さい。
「//演習」の下に,次の文を追加して実行
して下さい。その意味を考えましょう。
System.out.println(“myarray.length = “ + myarray.length);
Javaにおける配列の宣言
Example12.javaを実行して下さい。
プログラムの最後に次の文を追加して実
行して下さい。その意味を考えましょう。
k[0] = 5;
System.out.println(“j[0] = “ + j[0]);
配列kの要素を変更したのに,配列jの要素も変わっています。
なぜでしょう? C言語で,配列名は何を意味していましたか?
Javaにおける配列の宣言
多次元配列も同様に次のように宣言でき
ます。2次元配列の例です。
float a[][] = new float[2][3];
この配列は2行3列の以下のような配列です。
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
Javaにおける配列の宣言
多次元配列では初期化や要素数の取得
が1次元の場合と若干異なります。
Example13.javaで確認して下さい。
Javaの多次元配列は,配列の配列として
確保されます。よって,他の言語のように
四角形の行列である必要がありません。
Example14.javaで確認して下さい。
クラスとメソッド
Javaのプログラムは,クラスの集合体です。
クラスには,いくつかのインスタンス変数とメソ
ッドが入っています。
メソッドは,Javaの基本的な実行単位です。
クラス外部にメソッドを置くことは出来ません。
よって,main()メソッドもクラスの一部として宣
言されます。
クラス vs 構造体
C言語の構造体
構造体は複数の「メンバ
変数」からなるデータ構造
構造体名 変数名; で構
造体変数を宣言
変数名.メンバ名 でメン
バ変数を参照
Javaのクラス
クラスは「インスタンス変
数」と「メソッド」からなる
最小のプログラム単位
クラス名 オブジェクト名;
でオブジェクトを作成
オブジェクト名.メソッド名
でメソッドを実行
オブジェクト名.インスタ
ンス変数名 で変数を参
照(通常は隠蔽)
静的メンバとインスタンスメンバ
静的メンバ


クラスそのものに対して定義され,クラスのどのオブジ
ェクトとも独立に存在する。
クラスに結びつけられているため,そのメンバ(メソッド
,変数)を呼び出すためにオブジェクト(インスタンス)
を作成する必要は無い。
インスタンスメンバ


クラスのオブジェクトに対して定義される。
クラスのオブジェクト(インスタンス)を生成し,そのオ
ブジェクトからメンバを呼び出す。
静的メンバ
オブジェクトを生成する必要がないため,ク
ラス名から直接メソッドや変数を利用する
ことが出来ます。
静的メソッドの呼び出し
クラス名.メソッド名(引数);
静的変数の参照
クラス名.変数名
静的メンバ
Example15.javaは,Mathクラスの静的メ
ンバの使い方を示しています。実行して確
認して下さい。
double型の変数radiusを宣言し,初期値と
して5を代入し,これを半径として,静的変
数Math.PIを使用して円の面積と円周の長
さを求めるプログラムを作成して下さい。
(Problem5.java)
インスタンスメンバ
インスタンスメンバはオブジェクトに結びつけられ
ており,そのオブジェクトに作用します。従って,
必ずオブジェクトを生成する必要があります。
インスタンスメソッドの呼び出し
オブジェクト名.メソッド名(引数);
インスタンス変数の参照
オブジェクト名.変数名
インスタンスメンバ
Stringクラス(String型ではありません!)を例に
インスタンスメンバの例を見てみましょう。
Example16.javaとExample17.javaを実行して
みましょう。
インスタンスメソッド
int length()
String substring(int start)
String substring(int start, int end)
の働きを確認して下さい。
問題
文字列の最後の10文字からなる部分文字
列を表示するプログラムを作成しなさい
(Example18.java)。
ヒント:length()メソッドを利用する
ある文字列に5個の数値が( , )で区切られ
て入っている。最後の数値を表示するプロ
グラムを作成しなさい(Example19.java)。
ラップクラスとカプセル化
Integerクラス



Integerオブジェクトは,基本データ型intの値をカプセ
ル化する。
これを,「Integerはintのラップクラスである」という。
Integerクラスは,静的メンバとインスタンスメンバの両
方を提供するクラスである。
カプセル化

データとデータを操作するコード(メソッド)を関連づけ
る仕組み。
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型で
返す
現在のオブジェクトの値の文字列
表現を返す
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に代入する。
問題
Example21.javaを,静的メソッドparseInt()を
使う形に書き換えなさい(Problem6.java)。
Integerクラスには,MAX_VALUEと
MIN_VALUEという2つの静的変数が定義さ
れています。これらの値を出力しなさい
(Problem7.java)。
オブジェクトを直接生成する
これまでは,静的メソッドの返り値などの形
で間接的にオブジェクトを作りました。
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”など
としてみましょう。
オブジェクト名の意味
次のプログラムの意味を考えてみましょう
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という出力は何を表しているのでしょう
か?