Javaの文

  1. Javaの文

    ここでは、Javaに基本的なデータ型や、計算や処理の流れを定める文について説明します。Javaの基本データ構造や処理を行う文の形式は、C言語のそれと大きな差異はありませんので簡単に概略を説明します。。

  2. 基本データ型

    1. データ型

      Javaでは以下の基本データ型を利用できます。型名の次の、括弧の中の数字は割り当てられるバイト数です。

       整数:byte(1),short(2),int(4), long(8)
       浮動少数:float(4),double(8)
       文字:char(2)
       ブール:booelan(2)

      整数型は小数点のつかない数字です。標準は4バイトですから、±231までの数字を扱うことができます。浮動少数は小数点を含む数字を扱います。単精度の float と倍精度の double 型が利用できます。また、char型はunicodeで記録するため2バイトであることに注意してください。C言語と異なるには、boolean型が存在することです。

      注:バイト
      ディジタル情報の基本単位はビットで、これは 0 または 1 を記憶できます。8ビットを1バイトといい、計算機の基本単位となります。1バイトは英数字を1文字記録できます。漢字やunicodeは2バイトで1文字を記録します。
       整数のバイト数は計算機により異なります。最近の32ビットパソコンは整数を4バイトで扱います。少し前の16ビットパソコンでは整数は2バイトで処理していました。

    2. 数の大きさ

       利用できる数字の型とそのバイト数もC言語と同様です。ただし、unsigned(符号なし)はありません。

      バイト数 範囲
      int 4 -2G〜2G(Gは109
      short 2 -32k〜32k
      long 8 10進19桁
      byte 1 -128〜127
      float 4 最大1038、有効6桁
      double 8 最大308桁、有効15桁
      char 2 unicodeの1文字

    3. 文字

      2バイトのユニコードで表現します。
       \u0000〜\uffff
      で、直接コードで文字を指定できます。ただし、多くの場合文字列は、String型 のクラスを利用します。漢字もユニコードで記録されます。

    4. 変数、定数

       型名 変数名;
      で、変数を宣言します。変数は英字で始まる英数字で、長さの制限はありません。変数の宣言と同時に初期値を設定することができます。

       int x1=120;

      先頭にfinalを付けた変数は一度しか代入できません。したがって定数として利用できます。
       final cont=320;

  3. 定数、式

    1. リテラル(定数)


      整数や少数の定数の形式は言語Cと同じです。
      boolean型の定数は、truefalseです。C言語と異なり0,1との互換性はありません。
      文字定数では、特殊(エスケープ)文字を次のように指定します。

       \\:\
       \b:バックスペース
       \n:改行(ラインフィード)
       \r:キャレッジリターン
       \t:タブ

    2. 演算子

      優先順位の高い順に示します。C言語の演算子とほぼ同じです。

      () []  括弧
      ++ -- ~ ! (型) 増加、減少、ビット反転、キャスト
      * / % 乗算、除算、余り
      + -  加算、減算
      >> <<  >>>  右シフト、左シフト、0フィルの右シフト
      >、 >=、 < 、<=  比較
      == 、!=  同値、
      &、、^ | 論理積、排他論理和、論理和
      && 、||  短絡論理演算
      ?:    三項演算
      =、+=、 -=、 *-、 /=、  代入、演算付代入

      &&や||の論理演算は、C言語と異なり短絡論理演算となります。この場合、一部の値の評価で論理値が定まると、他の項の評価をしません。これで、処理を高速化できます。ただし、メソッドの呼び出しを行うため、短絡演算されたくない場合は & ,| を利用します。
    3. 式と変数

       「式」は定数や変数を演算する記述で、通常の数式とほぼ同じ形式です。ただし、分数は / で記述します。


       -5*(23+45)/8;
       int i = 5; (i + 12 ) * 6;
       double x; 3.4*x*x  + 5.2*x + 3.2;

    4. 代入文

      代入文は
        変数 = 式;

      の形式で、式の値を変数を記憶(代入)します。= は左右が等しいという意味でなく、右辺の式を左辺の変数に代入する意味です。したがって、
       sum = sum +1;
      は、「変数 sum に1を加えて、それを sum に代入する」 意味になります。sum の値が5であった場合、この代入を行うと6になります。
      Javaでは、
       int x = x + 1; x++;
      のような、「代入演算を伴う式」が文となります。x + 1 のような、代入を伴わない式は、Cでは「文」になりますが、Javaでは有効な「文」にはなりません。
    5. 整数と少数

       Javaでは整数と少数を区別して扱います。
       3 / 5 は整数3を整数5で割るため、結果は0になります。一方、3.0 / 5.0 は少数の割り算のため、結果は 0.6 になります。
       
    6. 整数と少数の計算例を紹介します。行頭に // のある行は注釈で、プログラムとして実行されることはありません。

      public class exp {
      //式、整数、少数の例題
      public static void main(String[] args) {
      //整数型と少数型の変数を定義
      int i;
      float x;
      //定数の計算
        System.out.println("整数割り算 3/5 =" + 3/5);
        System.out.println("少数割り算 3.0/5.0 = " + 3.0/5.0);
        System.out.println("混合割り算 3/5.0 = " + 3/5.0);
      
      //整数変数の計算
        i = 3;
        i = i + 3;
        System.out.println("代入 i =" + i);
      
      //少数変数の計算
        x = 3.0f;
        x = x * i;
        System.out.println("代入 x =" + x);
      
        }
      }

      3.0f の f は float 型の意味です。f を付けないと double 型の定数と成るため、コンパイルすると、次のようなエラーになります。float x; の替わりに double x; と宣言しておけばこのような問題はありません。
      exp.java:15: 精度が落ちている可能性
      検出値  : double
      期待値  : float
        x=3.0;

      実行結果
      整数割り算 3/5 =0
      少数割り算 3.0/5.0 =0.6
      混合割り算 3/5.0 =0.6
      代入 i =6
      代入 x =18.0

  4. 配列

    1. 配列型

      配列型変数はサイズなしで宣言し、実行時にnew(後述)でサイズを指定して領域を確保します。実行時に割り付けますから、サイズは式で指定できます。
           double[] acc = new double [100];
      また、
           double acc[] = new double [100];
      とも宣言できます。

    2. 初期化

      初期化を伴う場合、次のように宣言することもできます。
       double[] acc={0,0,23,45,53,67};
      この場合、サイズはデータの個数になります。

    3. 多次元配列

      多次元の場合も、同様に宣言できます。
           double[][] accd = new double [2][100];
      初期化は次のように設定します。
           double[][] abcd=new double {{10,11,12},{20,21,22}};
      ここで、double[i]は、i 列の配列を参照します。したがって、次のように、行毎に異なる列数の配列も指定できます。
       int [][] odds=new int[NMAX][]; //行のサイズを定める
       for(n=0;n<NMAX;n++)
        odds[n]=new int[n+1]; //各列のサイズを定める
      なお、文字列の記録には、通常 String クラス(後述)を利用します。

    4. 配列のメソッド

       java.util.Arrays に配列用のメソッドが定義されています。
       static void fill()(基本型[], 配列名,値); //配列に値を詰める
       static void sort (基本型[], 配列名); //配列をソートする

  5. 制御文

    1. 基本形式

      形式は言語Cと同じですが、解釈が厳密になっています。例えば、条件式はboolean型を返さないと、文法違反になります。if (a=b) のような表現はC言語では許されますが、a=b が代入文で boolean 型ではないので、Javaではエラーになります。

    2. ブロック

      ; で区切られ、{ } で括られた文をブロックと呼び、これは文として扱われます。
      { ; ; ;}

    3. 3項演算子

      条件付の代入は次のように簡単に指定できます。
          条件?値1:値2 :条件によりtrueなら値1、falseなら値2となる「式」です。

    4. if else

           if (条件式) 文1 else 文2 ;
      条件式はboolean型の値を返す必要があります。

    5. switch case

      式の値で、対応する case 以後の文を実行します。
          switch (式)
      case 値1: 文1;
      case 値2: 文2;

    6. while

      条件式がtrueであれば文を実行します。
          while(条件式) 文;

    7. do while

      条件式がtrueであれば文の実行に戻ります
          do 文 while(条件式);

    8. for文

      C言語と同じように、繰返し実行を指定します。
          for(初期設定;条件式 ;繰り返し式 ) 

    9. continue

      残りの処理を中止して繰り返しを続けます
           continue; //次の繰り返し

    10. break

      繰り返しを中止し、次の処理に進みます。
           break://繰り返し修了

  6. 文字列と表示

    1. String型

       文字列は String型 で表現します。

       String exp="12345";

    2. 連結

      文字列は + で連結できます。文字列以外のモノは一般に、文字列に + すると自動的に文字列に変換されます。
       int age=18;
       String name="mimi" + age;

    3. 編集、比較

      文字列の長さは length メソッドで取得できます。
           int l1=name.length();
      文字列の同値は、eqauls()メソッドで確認できます。これはbooleanの値を返します。次は文字列 command と "hello" を比較します。
       例 String command ="abc" ;
          command.equals("hello")
      同じ文字列領域を共有しているか否かは == で判断できますが、+ 等で演算した文字列は == では判断できません。
       例
       String s1="abc";boolean b1= (s1 == "abc"); //b1=true;
       boolean b2= (s1="ab"+"c"); //b2=false

      == は 文字列の内容でなく、参照子(メモリの番地、C言語のポインタ)の値を比較します。

    4. 表示:System.out.println

       System.out.println("x=" + x);
      で、x= の文字列に続けて変数xの値を表示します。
       + は文字列の結合を意味します。変数を指定すると、その値の文字列に変換され表示されます。

    5. 注意

      文字列の + 演算は特殊な演算子で、「文字列+式」の場合文字列の結合として扱われ、xはその値を示す文字に変換されます。しかし、両者が式の場合、
       System.out.println(x + x);
      は x+x を数値として計算し、その値を表示します。

  7. メソッド

    1. メソッドの定義

      メソッドはC言語では関数と呼ばれ、名前に対応する処理を指定できます。main()も一種のメソッドですが、main()以外に複数のメソッドを定義できます。一般にメソッドは
           型名 メソッドの名前(引数の並び){ 文 }
      で定義できます。メソッドを呼び出すことで、そのメソッドの引数に値を渡して、実行することができます。メソッドに static を付加すると、コンパイルされた時点で実行できるメソッドになります。main() は static (コンパイル時に清々される)メソッドにする必要があります。
       次の例で、add()メソッドにも static が付加されていることに注意してください。static が指定されていないと、クラス app1 の「実体」を作成してから、関数を呼び出す必要があります(クラスを参照してください)。

      public class app1{
      
      //add() 関数の定義
       static int add(int op1,int op2)
       {   
         return op1+op2;
       } 
            
       public static void main( String[] args)
       { 
          //calc c2=new calc();
         System.out.println(add(2,3));//関数の呼び出し
       }
      }

    2. メソッドの引数

       メソッドは引数を指定することができます。メソッド側で定義する引数を仮引数といいます。仮引数には数字などの基本変数、または、配列やオブジェクト(後述)を指定できます。
       引数をもったメソッドを呼び出すとき、仮引数に渡す値を指定します。この値を実引数といいます。
       メソッドを呼び出すとき、基本変数には実引数としてリテラル(値)を渡します。一方、配列やオブジェクトの仮引数には、同じ型の「参照値(番地)」を引き渡します(C言語では、配列のみ参照値を渡します)。

    3. メソッドの戻り値

      メソッドが return 値 ; で戻す値は、シンプル変数の値か、配列またはクラスの参照です。

    4. 変数の有効範囲(クラス内)

       変数は任意のブロック { } の内部で宣言でき、その内部でのみ利用できます。たとえば、あるメソッドの内部で宣言された変数はそのメソッドの内部でのみ有効です。また、メソッド外で宣言された変数は、そのクラスの内部のすべてのメソッドで利用できます。クラスとメソッドで同じ名前の変数が宣言されている場合、メソッド(一番近いブロック)の変数が利用されます。

    5. 同じ名前のメソッド:オーバーロード

      メソッドは名前だけでなく、引数や戻り値でも区別されます。名前が同じでも、引数の型が異なる場合、別のメソッドとして区別されます。したがって、引数の型は異なるが同じ処理をするメソッドには、同じ名前を付けることができます。この機能をオーバーロードと呼びます。

      例 int abs(int x) と double abs(double x) は別のメソッドとして定義できます。

  8. 例外処理

    1. try、catchブロック

      実行時にエラーを発生する可能性のある文は、tryブロックの中で処理をすると catch ブロックの中でまとめてエラー処理をすることができます。以下は、配列の範囲を超えて使用した場合のエラー処理を行います。ArrayIndexOutOfBoundsException は配列の範囲に関するエラーを指定します。
      C言語ではこの種のエラーを起こしても自分のメモリ領域の場合検知されません。また、他人の領域を侵犯すると強制的に停止されます。Javaではエラーを起こした場合の処理が指定できることになります。
       次の例は、array[99] までの配列を超過して、array[100]にアクセスをしましたが、try-catch が指定されているため、catchで指定したエラー処理を行い、処理を続行することができます。
      1.  class arybound      
        {
        //配列のエラー処理の例 
        
          public static void main()
          {
             int i=0;
             try{
               int array[]=new int [100]; 
               i=100;
               array[i]=10;
            }catch(ArrayIndexOutOfBoundsException e){ 
               System.out.println("**array index error: "+i);
               e.printStackTrace();
             }
           }
          }
      2. 実行
        array index error: 100
        java.lang.ArrayIndexOutOfBoundsException at arybound.
        main(arybound.java:8)

    2. throw

      メソッドにthrowキーワードを付加すると、エラー処理をメソッドの呼び出し側で行うことができます。
      1. class throwEx{
          public static void main(String[] arg)
           {
            try{ work();}
            catch(ArrayIndexOutOfBoundsException (e){
            //work()関数での異常処理
             System.out.println("**array index error**");
             e.printStackTrace(); 
           }
         }
        
         static void work() throw ArithmeticException{ 
          int array[]=new int [100]; 
           int i=100;  array[i]=10;
        } 

      catchする例外はjava.lang.Throwable.Exceptionクラスで定義されています。