前期中間試験の返却に伴い、補足説明。
C言語,Javaにおける文の定義
テストの時に、下記のようなプログラムで piyo() は、for の範囲?みたいな質問があったので、補足説明
for( ... ; ... ; ... ) if ( ... ) foo = bar ; else { baz() ; hoge() ; } piyo() ;
C言語やJavaにおける文の定義は、以下の通り
文 ::= 式 ; // 単文 | ; // 空文 | { 文 文 ... } // 複文 | for( .. ; .. ; .. ) 文 // 制御構文 | do 文 while( 式 ) ; | if ( 式 ) 文 [ else 文 ] ;
こういった文の範囲の誤解を避けるためのものが、インデント。
正しいインデントをつける習慣が重要。
Javaにおけるクラスとデータ構造のイメージ
この後のリスト構造の説明でもオブジェクトがどのように保存されるかを理解するのは重要なので、オブジェクトの説明。
Java では、class 宣言されたデータ構造は、ヒープメモリと呼ばれるデータ領域に保存されている。
class A { int data ; A( int value ) { this.data = value ; } } ; public class Main { public static void main( String[] args ) { A a = new A( 123 ) ; } }
ここで、new 演算子は、指定されたオブジェクトをヒープメモリ上に確保する。そして、そのデータの入っている領域アドレスを、インスタンスの変数 a に代入している。
テストで出題した例であれば、
class IdNameAge { int id ; String name ; Age age ; IdNameAge( int i , String n , int a ) { this.id = i ; this.name = n ; this.age = a ; } } ; IdNameAge[] = people = { new IdNameAge( 1001 , "saitoh" , 60 ) , new IdNameAge( 1002 , "tomoko" , 49 ) , new IdNameAge( 1003 , "mitsuki" , 26 ) , } ;
Integer 型も、整数データを記憶するけど、オブジェクト型である。
ただし、Integer 型を常にヒープメモリに保存するのは、効率が悪いので、-128~127までの値ではInteger
オブジェクトは内部でキャッシュされる。Integer y = 123 ; 書いてはいるけど本来であれば、Integer y = new Integer( 123 ) ; と書く必要があった。しかしJava5以降に、オートボクシングと呼ばれる機能があるため Integer y = 123 のように書けるし、こう書く方が推奨されている。
public class Main { public static void main(String[] args) { // Your code here! Integer sx = 123 ; Integer sy = 123 ; System.out.println( sx == sy ) ; // true Integer fx = 12345 ; Integer fy = 12345 ; System.out.println( fx == fy ) ; // false } }