Javaの学習で不明点をまとめてみた。
.classの拡張子を持つファイルはコンパイル済みのバイトコードであるが、であれば.jarで終わるファイルもバイトコードなのか?
今のところ仕事をしていると.classという拡張子のファイルは意識しない。どっちかというと.jarの拡張子がついたファイルを使う。これらは何が違うのか?.jarのファイルも.classと同じなのか?という疑問をもった。
→.classの拡張子がついたファイルと表記していたが、シンプルにclassファイルと呼べばいい。.jarの拡張子がついたファイルもjarファイルと呼べばいい。jarファイルは、classファイルや画像ファイルをzip形式にしたもの。.class単体でもjarファイル化されていたりする。
※javaファイルもeclipseでjarファイルにしているため、.classファイルの存在を知らなかった。
文字列の比較はequalsで行う
文字列比較を演算子==で行っても、コンパイルエラーが出ない。しかも、それとなく動作してしまうが、不具合がまれにおこる。正しくはequals演算子を使う↓(Pealなどの場合もこのような仕様になっていたが、変数がオブジェクトであれば単純に値として演算子で比較はできずメソッドで評価せよということなのだろうが、使う側からすると面倒なルールではという気しかしない)PHPでは意識しなくていい(型はなんとなく分かっていないといけないかもしれない)
if(str1.equals(str2){ // str1とstr2の文字列が等しい。 }
配列の戻り値は参照渡しになる
配列を戻すと配列は参照渡しであるため値ではなく参照が戻る。呼び出した先で加えた変更が呼び出した元でも影響を受ける。
例えばphpの場合、仕様的に配列は参照渡しだが明示的に指定しない限り参照も値のスコープも内部的にコピーされて別物として扱われる(プログラマは参照渡しであることを意識しなくて良い)
javaのimport宣言は他言語と異なり、FQCNを書かなくするための入力軽減に過ぎない
javaと他の言語ではimport宣言の意味が異なる。
他言語ではクラスライブラリを読み込むために必要な処理だが、Javaの場合はすでにjvmで組み込まれているクラスライブラリは完全限定名(FQCN)で表記すればすべて使える。
したがって、完全限定名で書くのがしんどいので入力を楽にするために表記するもの=入力軽減のための定義である。
※あまりおすすめしないが、import文を使わなくてもFQCNで表記すれば問題ない。
※javaしかやっていないプログラマは、他の言語におけるimport宣言の定義を知らないといけない。
コメント