みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

メソッドの中身の構成要素

javaのメソッドの処理は{}の中に書いて、一文ごと文末に「;」を付けます。その構成要素は次の9種で、どんなプログラムも9種の合成で書けると聞いた事があります。
(1)他メソッドの呼び出し:System.out.println("");setName("佐藤");getName();
(2)ローカル変数の宣言:int a;String a;Program java;
(3)代入:a=0;a=b;a=a+3;
(4)インクリメントとデクリメント:a++;++a;a--;
(5)オブジェクトの生成:new DefaultConstractor();new Dog("ハチ公");
(6)条件分岐・判断:if(true){・・・}else{・・・;} switch case
(7)繰り返し・反復:while(true){・・・;} for(Object o:list){・・・;}
(8)出力:return a;return "佐藤";
(9)例外処理:try catch finally assert

本当にこれだけで足りますか?何か忘れてる気がするのですが、10個目11個目を教えてくれると幸いです。

---以下は補足
例えば、System.out.println("あああ")と打てば「あああ」と表示されるのですが、その内容は何処かでprintln(String x){・・・・・;}とプログラミングされていると思います。{・・・・・;}を(2)~(9)の合成でつくり、画面表示を再現できるのでしょうか?変数用意して、何か計算して代入して、、、その後何をドーすれば画面表示にるのでしょう?

System.out.printlnの中身は少しだけ知っていて、StringBuffer.write()というメソッドを呼び出しているんです。その中身も少し見て、プログラムを追ったのですが、文字列をchar型のデータに分解してインクリメントなどしている感じでした。予想通
り、コードが長く、括弧のネストも重なって複雑でした。ただ、データの加工に終始しているだけのような印象で、画面表示に繋がりそうなコマンドが本当にあるのか疑問に思い、質問しています。

String x;
x="あああ";
/*この後ドーしよう。。。System.out.printの使用を避けて画像表示できるか。
boolean y;
y=(x=="あああ");
y=(y==true);
・・・型を定めて変数をごちゃごちゃ作って値を操作しても、コンピュータの中の現象に閉じる気がする。それを人が認知できる形に表示するにはSystem.out.printに依存しちゃう。。。*/

電卓をイメージしているのですが、1+1を計算して、2を導き出すまでが電卓の中の世界、それを表示するのに液晶部の縦横棒に電圧かけて2と表示しているんだと思います。System.out.printlnの中身は特殊で(2)~(9)とは別のコマンドを使っていて、グラフィックボードにかかっている電圧を制御しているんですかね?
 ―
  |
 ―

 ―

投稿日時 - 2013-11-27 21:28:15

QNo.8364537

暇なときに回答ください

質問者が選んだベストアンサー

9種類で書けるというのは知りませんでしたが、Java Language Specificationを見る限り、フィールドへのアクセス、配列の作成など色々と不足点があるように思います。
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html

System.out.printlnの実装についてはこれが詳しいです。
http://luckytoilet.wordpress.com/2010/05/21/how-system-out-println-really-works/
この中で出てくるJNIというのはJava Native Interface (http://ja.wikipedia.org/wiki/Java_Native_Interface)といって、Javaからそのプラットフォームで動くコードを直接呼び出す方法です。
要するに、Javaの世界だけで収まらずJNIを通じてOSに処理を依頼しているということです。まあ、ある意味OSへの命令をメソッド呼び出しをしているとも言えると思いますが...

投稿日時 - 2013-11-27 23:53:55

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>どんなプログラムも9種の合成で書けると聞いた事があります。

それは誰がどんな根拠で言った事なのでしょうか。

少なくとも
・内部クラス定義
・算術演算
・論理演算
・ビット演算
・ジャンプ:continue、break
・オブジェクトの型判定:instanceof
・キャスト
・排他制御:synchronized
・アサーション機能:assert
は足りません。考えたら他にもありそうですが。

「算術演算・論理演算・ビット演算」の結果を代入することは多いですが、演算と代入は別の事です。演算結果を代入せずにメソッドの引数として呼び出す事もできますし、演算をしたときに例外が発生しない値である事を確認するために演算をするという使い方も出来ます。

returnは「出力」ではなく、「メソッドの終了および返値」だと思います。で、それが独立しているレベル感なら「continue、break」も必要でしょう。またassertを例外処理に含めているのはおかしな話です。独立させるべきです。

…など、はっきり言って穴だらけ・突っ込みどころ満載の分類です。どうでもいい人がテキトーに無責任に作った分類なのではないかと思います。そんなどうでもいい情報は気にしないほうがいいと思いますよ。

投稿日時 - 2013-11-28 18:45:40

ANo.2

理論と実装との違いといいましょうか。

例えば
int a,b ;(ともに正)として
a+b は a ++ を b回繰り返すことで実現できます。
a*b は、 a を b回足すことで実現できます。上記のように足し算はインクリメントで実現できるので、「かけ算はインクリメントとループで実現できる」と言えます。
a-b は a -- を b回繰り返すことで実現できます。
加減乗算ができると、筆算の要領で割り算もできます。
四則演算ができると、数学の定理を使って、複雑そうな関数でも四則演算に分解して計算することができます。
無限の桁がある実数は、コンピュータで扱うことができません。double等は、内部では整数を使って X*2のn乗の形で値を保存しており、整数演算の組み合わせで小数点以下の計算を実現しています。

と、やっていくと、おおよそコンピュータでやるような数値演算は、インクリメント、デクリメント、ループ、分岐だけで実現できる、ということになります。
これに、途中経過を記憶するためのローカル変数と、それに記憶させるための代入を加えれば、プログラムとして作成することができます。

こういう変換を繰り返していけば、(1)~(9)で実現できる、ということです。
あとは、Javaのプログラムとして正しくするには、class, メソッドの定義構文が必要ですが。
# 配列のアクセスも if(i==0){return a_0;}else if(i==1){return a_1;}else... と等価だと言えます。

ただ、実際にそんな計算していません。低機能の組込みマイコンならありえない話ではないですが、PCに入っているようなCPUでは、より高速な手段を使って演算回路を実現しており、それで瞬時に計算します。


画面表示も、最終的には「グラフィックボードにかかっている電圧を制御」という感じにはなりますが、それは特殊な命令ではなく、「Zahyo_0_0=White;」としたら「座標(0,0)の点が白になる」というイメージです。
こういう処理をするのはOSやドライバーの仕事で、Javaから直接ということはありません(少なくとも、PCでは。マイコン組込みだとそういうケースもあるかもしれません)
Javaからは「OSに座標(0,0)の点が白にするように頼むメソッド」を実行することになります。



理論の話になると、チューリングマシン、構造化定理、といったキーワードで調べるとよいでしょう。

投稿日時 - 2013-11-28 08:16:53