Javaメソッドの構成要素とは?

このQ&Aのポイント
  • Javaのメソッドは9つの構成要素で書けます。
  • 構成要素には他メソッドの呼び出し、ローカル変数の宣言、代入、インクリメントとデクリメント、オブジェクトの生成、条件分岐・判断、繰り返し・反復、出力、例外処理があります。
  • これらの要素を組み合わせて、Javaのプログラムを構築します。
回答を見る
  • ベストアンサー

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

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)とは別のコマンドを使っていて、グラフィックボードにかかっている電圧を制御しているんですかね?  ―   |  ― |  ―

  • Java
  • 回答数3
  • ありがとう数0

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

  • ベストアンサー
回答No.1

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への命令をメソッド呼び出しをしているとも言えると思いますが...

その他の回答 (2)

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.3

>どんなプログラムも9種の合成で書けると聞いた事があります。 それは誰がどんな根拠で言った事なのでしょうか。 少なくとも ・内部クラス定義 ・算術演算 ・論理演算 ・ビット演算 ・ジャンプ:continue、break ・オブジェクトの型判定:instanceof ・キャスト ・排他制御:synchronized ・アサーション機能:assert は足りません。考えたら他にもありそうですが。 「算術演算・論理演算・ビット演算」の結果を代入することは多いですが、演算と代入は別の事です。演算結果を代入せずにメソッドの引数として呼び出す事もできますし、演算をしたときに例外が発生しない値である事を確認するために演算をするという使い方も出来ます。 returnは「出力」ではなく、「メソッドの終了および返値」だと思います。で、それが独立しているレベル感なら「continue、break」も必要でしょう。またassertを例外処理に含めているのはおかしな話です。独立させるべきです。 …など、はっきり言って穴だらけ・突っ込みどころ満載の分類です。どうでもいい人がテキトーに無責任に作った分類なのではないかと思います。そんなどうでもいい情報は気にしないほうがいいと思いますよ。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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)の点が白にするように頼むメソッド」を実行することになります。 理論の話になると、チューリングマシン、構造化定理、といったキーワードで調べるとよいでしょう。

関連するQ&A

  • メソッド

    public class Point{ public int x; public int y; public void swap(int s){ int x = s * y; y = s * x; this.x = x; } public void swap2(int s){ int x = s * y; y = s * this.x; this.x = x; } public static void main(String[] args){ Point pt = new Point(); pt.x = 3; pt.y = 4; pt.swap(2); System.out.println(pt.x + " " + pt.y); pt.swap2(3); System.out.println(pt.x + " " + pt.y); } } このプログラムでswapメソッドとswap2メソッドってどう違うんですか?

    • ベストアンサー
    • Java
  • メソッドのオーバーライド(java)

    class A3{ void hello(){ System.out.println("A3"); } void hello(int i){ System.out.println("A3"+i); } } class B3 extends A3{ void hello(){ System.out.println("B3"); } } class C3 extends B3{ void hello(String s){ System.out.println("C3"+s); } } class MethodOverriding3{ public static void main(String args[]){ A3 obj = new C3(); obj.hello(); } } 上のプログラムを実行すると"B3"と表示されまが、どうしてクラスBのメソッドが実行されるのでしょうか? クラスAのメソッドが無視される仕組みがわかりません。 また、クラスMethodOverriding3でobj.hello("abc")としてコンパイルすると mo.java:25: シンボルを見つけられません。 シンボル: メソッド hello(java.lang.String) 場所 : A3 の クラス obj.hello("abc");   ^ エラー 1 個 とエラーが出ます。 どうしてでしょうか? 誰か教えてください、お願いします。

    • ベストアンサー
    • Java
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaで課題を出されています

    題名の通りなのですが、javaのプログラミングで課題を出されていて うまく書けません お題としては 1 if分と論理演算を使うこと。 2 forまたはwhileを使用すること 3 メソッドを使用すること。(main以外で) 4 配列を使用すること 以上なのですが、一応昔スロットプログラムを作っていたのでこれをベースに作ろうかなと考えています import java.io.*; public class Slot01{ public static void main(String[] args){ try{ //String line =reader.readLine(); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("こんにちは!スロットゲームへようこそ!"); System.out.println("EnterKeyを押して当たりを出してくださいね!"); while(true){ //while文は処理を繰り返すためのものです。 // ▽これよりソースを打ち込んでください //try{ int x=(int)(Math.random()*9)+1; int y=(int)(Math.random()*9)+1; int z=(int)(Math.random()*9)+1; int[]kakuritu; int sum; System.out.print(x); System.out.print(y); System.out.print(z); System.out.println(""); String line =reader.readLine(); //System.out.println(""); if(x==7&&y==7&&z==7){ System.out.println("スーパー大当たり"); }else if(x==y&&y==z){ System.out.println("大当たり"); }else if(x==y||y==z||x==z){ System.out.println("小当たり"); }else{ System.out.println("外れ"); } }//while文の終わり }catch (IOException e){ System.out.println(e); }catch (NumberFormatException e){ System.out.println("正しい形式で表示してください。"); } } } このプログラムなのですが、1と2はこの中に入ってます。考えてみたのですが、このプログラムに当たり確率を表示させるプログラムなら3と4も満たせそうなのですが、いまいちソースが思いつきませんのでご教授お願いします。 文章おかしいところだらけで申し訳ありません。

    • ベストアンサー
    • Java
  • メソッドを使ったプログラム

    メソッドをつかったプログラムで数当てゲームを作成したいのですが 1から1000までのランダムな値(以降 数値X として)を取得し、プレイヤーにその数を当てさせる。 プレイヤーが入力した数値(以降 数値Y として)が数値Xより大きければ『もっと小さいです』、数値Yが数値Xより小さければ『もっと大きいです』と出力する。 数値Xと数値Yが同じになるまで繰り返し、何回であったたかを最後に表示する。 条件:以下の処理の単位をメソッドにする。   1.1から1000までのランダムな値を取得する。   2.数値X、数値Yの関係(大小、等しい)を調べ、適切なメッセージを出力する というプログラミングを作成したいのですがどういうふうにしたらよいのかわかりません!! import java.io.*; class Question7_2{ public static void main(String[] args){ BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); try{ System.out.println("数当てゲーム"); というところでとまった状態です。どのようにしたらよいか教えてください!例外発生やIf文を使うというのまではわかるのですが…

  • java Eclipse 初心者 メソッド

     次のようなプログラムを書きました。”変数 mainにvoidは無効な型です。”とエラーが発生しました。 package lesson5; import java.util.Random; import java.util.Scanner; public class MentalArithmetic { static Scanner stdIn = new Scanner(System.in); static boolean confirmRetry(){ int cont; do{ System.out.print("もう一度?<Yes・・・1/No・・・0> : "); cont = stdIn.nextInt(); }while (cont != 0 && cont != 1); return cont ==1; } static int mondaix(){ Random rand = new Random(); int a = rand.nextInt(900) + 100; // return a; } static void mondai1( int p, int q, int r){ do{ while(true){ System.out.println(p + "+" + q + "+" + r + " = " ); int k = stdIn.nextInt(); // if(k == p + q + r) // break; System.out.println("違いますよ!!"); } }while (confirmRetry()); public static void main(String[] args) { System.out.println("暗算力トレーニング!!"); while (true) { int x = mondaix(); int y = mondaix(); int z = mondaix(); mondai1( x, y, z); } } } }  これがプログラムです。大学の課題でついにつまずきました。エラーの原因と解決方法(プログラム)を教えていただけるとありがたいです。  初めの方の内容なので簡単なレベル(技術)で解決できると助かります。

  • java 戻り値についての質問です。

     戻り値を使ったプログラムを作成したところエラーが出たのですが、どこを修正しなければならないのかわかりません。 [プログラム] public class Main31{ public static int add(int x, int y){ int ans = x + y; return ans; } public static void main(String[] args){ int ans = add(100 , 10); System.out.println(x +"+"+y+"="+ans); } } [エラーの内容] Main31.java:12: エラー: シンボルを見つけられません System.out.println(x +"+"+y+"="+ans);     ^ シンボル: 変数 x 場所: クラス Main31 Main31.java:12: エラー: シンボルを見つけられません System.out.println(x +"+"+y+"="+ans);      ^ シンボル: 変数 y 場所: クラス Main31 エラー2個 どこを直せば良いのかと、このプログラムだとエラーが出てしまう理由を教えてください。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Javaの初期化メソッドについて

    こんにちは。Javaの初心者です。 Javaの初期化メソッド(initメソッド)についてなのですが、処理を記述しても実行してくれません。 恐らく使い方が間違ってるかと思われるのですが、ネットで調べてもあまり検索結果がでてこなかったので、質問させてもらいました。 以下サンプルコード import java.lang.*; public class Test { static int a; public void init() { a = 10; } public static void main(String[] args) { System.out.println(a); } } 実行してみても、「0」と表示されるだけで、「10」と表示してくれませんでした。 どこかコードが間違えてるのでしょうか? それとも初期化メソッドはアプレット用であってアプレットで使わないと意味がないというものなのでしょうか? 因みに関係ないかと思われますが、グローバル変数は自動的に初期化される(0が代入される)ということは知っています。 ご教授の方、よろしくお願い致します。

    • ベストアンサー
    • Java
  • Javaで配列の長さを知るメソッド

    Javaの配列の長さを知るメソッドを調べています。 例えば String sTest[][] = new String[2][2]; sTest[0][0] = "something"; だとして、sTest[0][0]の長さ(文字数)の9を出力したいのですが、どのようにすればいいのでしょうか。 APIを調べて、クラスArrayのgetlengthを使って System.out.println(getlength(sTest[0][0])); としてみたら駄目でした。 また、Stringクラスのlengthを使って System.out.println(length(sTest[0][0])); としても駄目でした。 まだAPIにあまりなれていないのですが、書き方が間違っているのでしょうか?

    • ベストアンサー
    • Java
  • Javaのメソッド呼び出しについて

    void usage() { System.out.println("zzz"); System.out.println("xxx"); System.out.println("ccc"); } void finish() { System.out.println("aaa"); } 上記の2つのメソッドを、mainメソッドから呼び出したいのですが どうやるのでしょうか? かなり足りない部分があるかと思うんですが、 おしえていただけないですか?

    • ベストアンサー
    • Java