水野2003/1/30
※ レポートの配点を40点としていますのでこの試験問題の満点は60点です
問1 次のプログラムについて以下の問いに答えなさい。(各10点、計20点)
public class Test14{ static String list[]={"1","Two","3","Hello","27","END","15"}; static public void main(String arg[]){ int t=0,i,k; for(i=0;i<list.length;i++){ if(list[i].equals("END"))break; try{ k=Integer.parseInt(list[i]); System.out.println("OK"); t+=k; }catch(Exception ex){ System.out.println("例外"); } } System.out.println("t="+t); } }(1) Test14クラスがアプリケ-ションプログラムとして実行された時の出力を示しなさい。
(2)if文の条件式 list[i].equals("END") を list[i]=="END" とするのが好ましくない理由を示しなさい。
問2 以下から4項目を選択しjava言語の場合について具体的に説明しなさい。
(各10点、計40点)
- ソースコードを実行するまでの手順
- オブジェクトのメンバと可視性
- クラスとインスタンス
- クラスの継承
- インターフェイスの実装
- スレッド
- アプリケーションとアプレット
問1
(1)例外処理の流れを追うことができたでしょうか?解答は下記のようになります。
OK 例外 OK 例外 OK t=31
(2) 基本データ型と参照データ型の違いを十分に理解できているかの確認の為の問題です。
残念ながら正解率は非常に低かった
==演算子は変数の値が等しい場合に真となります。
基本データ型では値はデータそのものなので、これはデータが等しい場合に真となります。
参照データ型の値は参照対象を特定するものなので、値が等しい場合は参照するインスタンスが同一であることを意味します。従って、list[i]=="END"とするとlist[i]から参照するStringインスタンス"END"と==演算子の右辺のStringインスタンス"END"が同じインスタンスの場合のみ真となります。
これに対してlist[i].equals("END")はlist[i]から参照するStringインスタンスとequalsメソッドの引数のStringインスタンス"END"の内容が等しい場合に真となります。このとき2つのStringが同一のインスタンスである必要はありません。
問題の場合はstatic String list[]={"1","Two","3","Hello","27","END","15"};とif(list[i].equals("END"))break;のString「END」が同じインスタンスとは限らないため、list[i]=="END"とするのは好ましくないのです。
※javaのコンパイラはメモリーを節約する為に、同じ内容の二つのStringインスタンスを作らずに1個ですませることが多い。従って==でプログラムを書いても期待どうりの動作をすることがありますが、これは保証の限りではありません。
さらに、Stringクラスではequalsはインスタンスの内容を比較する処理として実装されていますが、自分で作ったようなクラスについてはequalsを上書きして内容を比較する処理を実装する必要があります。
問2
下記の様な単語を含む解答を期待していました。具体的な解答は自分で考えましょう。あえてここでは示しません。
- ソースコードを実行するまでの手順
javaコンパイラ、バイトコード、クラスファイル、java仮想機械(インタープリタ)、中間言語
ソースコード、バイトコードは共通、コンパイラや仮想機械を計算機の環境に合わせて個々に準備
一度書いたソースコードが異なるOSやCPUの上で実行可能
JIT、HotSpot、JDK,JRE
- オブジェクトのメンバと可視性
フィールド(メンバ変数)、メソッド(メンバ関数)
クラスメンバ(static)、インスタンスメンバ
private、protected、public、指定無し
抽象データ型
- クラスとインスタンス
オブジェクト、クラス分け、雛形(設計図)、
クラスメンバ(static)、インスタンスメンバ
インスタンス化(new)
コンストラクタ
- クラスの継承
親クラス(スパークラス)子クラス、super、メンバの追加、上書き、単一継承、extends、Objectクラス、多態性
- インターフェイスの実装
定数、publicな抽象メソッド、implements、多重実装、インターフェイス型の変数、
- スレッド
処理の流れ、mainスレッド、ガベージコレクション
マルチスレッドプログラム、Threadクラス、デッドロック
- アプリケーションとアプレット
main関数、Appletクラス、appletviewer、アプレットタグ、Webブラウザ、インターネット、セキュリティー