大変お世話になっております。
反逆する武士
uematu tubasaです。
初回投稿日時:2020年3月23日(令和2年3月23日)
さて、本日は政治経済ブログということを捨て去り(笑)、Javaに関するお勉強の結果報告のような、まとめ記事のような、試験する前に、徹底的に見直すためのブログ記事になります。
※はっきり申し上げて、SEOなんて二の次三の次であり、いつもの政治経済系のノリではございませんのでご容赦いただきたく。
勉強してて思ったことは、私はフレームワークや統合開発環境(IDE)であるeclipseに頼ってばかりであり、基本的なことは理解できていないということです。
反逆する武士uematu tubasaってこんなに馬鹿なITエンジニアなの???って罵っていただいても問題ありません。
とあるポンコツITエンジニアが何とか一人前のJavaプログラマになるため、頑張るということで、生温かい目で見ていただければ幸いに存じます。
パッケージに関して注意すること
JavaSE11におけるパッケージの目的は3つ存在します。
1、名前空間を提供し、名前の衝突を避ける
2、アクセス修飾子と組み合わせてアクセス制御機能を提供する
3、クラスの分類を可能とする
Javaでのシステム開発においては、以前開発した部品や外部からのオープンソースを利用して成果物を製造することが多々ございます。
したがって、名前空間を提供し、名前の衝突を避けなければ、コンパイラやJVMは製造物のソースコードにおいてどの部品を利用しているのかわからなくなります。
仮に同じパッケージで同じクラス名だった場合、どちらの部品を呼び出すのかわからず、コンパイルエラーになったり、意図しない部品を利用することになって、動作がおかしくなる場合もございます。
したがって、パッケージ名は一意であることが推奨されます。
また、パッケージ単位でアクセス制御することができます。
とあるパッケージに属するクラスにおいて、一方はpublicで片方はpublic無しであれば、publicなクラスは別パッケージに所属するクラスから使用できますが、public無しのクラスは使用できません。
※ public無しクラスは別パッケージから使用されるとマズいクラスを作成するのに向いており、例えばTestクラス(おそらく単体テストなどで利用?)などがこれに該当します。
なお、クラスは必ず何らかのパッケージに属します。
パッケージに属さないクラスは存在しません。
パッケージ宣言(クラスの一番上部に記述される、どのパッケージに所属しているか宣言するもの)を省略したクラスは「無名パッケージ」に属することになります。
「無名パッケージ」に属するクラスは同じく「無名パッケージ」に属するクラスからしか参照できません。
※読者様からのご指摘を受け、一部修正させていただきました。
誠にありがとうございました。
mainメソッド(エントリーポイントについて)
クラスには複数のクラスが存在しているため、実行した場合、どのクラスのどのメソッドから処理を始めるのか決まっていなければなりません。
処理を始めるためのメソッドを一般的にエントリーポイントと呼びます。
詳細は以下に記述します。
public static void main(String[] arg){
//any code
}
上記において、自由に記述できるのは引数であるargだけであり、エントリーポイントに適用されるルールは以下になります。
1、公開されていること(publicであること)
2、インスタンスを生成しなくても実行できること(staticであること)
3、戻り値は戻せない(voidであること)
4、メソッド名はmainであること
5、引数はString配列型を一つ受け取ること
なお、エントリーポイントの引数にはString配列型ではなく、可変長引数のString型を受け取ることもできます。
public static void main (String . . . args){
//anycode
}
可変長の引数はコンパイル時に配列型の引数に変換されるからです。
Javaコマンドに関して注意すること
いやいやいやJavaコマンドなんてシステム開発現場で使わないし、というツッコミは置いておき、基本的なところから説明しましょう。
Javaのプログラムを実行するためには、Javaコマンドを使用します。
Javaコマンドでは以下の3つを実行することができます。
1、mainメソッドを持つクラスファイル
2、jarファイル内のメインクラス
3、モジュールに含まれるメインクラス
Java SE 11ではjavacコマンドでコンパイルせずにソースファイルを直接実行できるソースファイルモードが機能追加されました。
私の理解だと、javacコマンドがソースファイルをコンパイルするコマンドで、javaコマンドがプログラム実行するためのコマンドであると理解してます。
例:> java Sample.java a b c
a
b
c
public class Sample {
public static void main (String . . .args){
for (String arg : args ){
System.out.println(arg);
}
}
}
例のコマンドで、Sampleクラスに起動パラメータを渡すことで、出力していることになります。
起動パラメータはスペースで区切って列挙します。
スペースを含む文字列を起動パラメータとして渡したい場合はダブルクオーテーションで括ります。
例:>Java Sample.java Hello World "Hello World"
Hello
World
Hello World
例:> Java Sample.java Hello World ¥”Hello World¥”
ダブルクオーテーションを文字列として認識させるためには、「¥」を左隣りに記述することで対応可能です。
Hello
World
”Hello
World”
JavaコマンドだけでJavaプログラムを実行できるようになるので、Javaをとりあえず動かしたいときや簡単な処理を行う場合に活用できるとのこと。
Javaコマンドのsourceオプションの使用例
例> mv Sample.java Sample ←Sample.javaをSampleに変える
> Java --source 11 Sample a b c
a
b
c
拡張子が.javaであればJavaコマンドは自動的にソースファイルモードで実行されます。
拡張子が.javaではない場合は上記のように--sourceオプションを利用します。
--sourceオプションの引数はソースファイルに使用されているJavaのバージョンです。
この場合はJava11なので、上記のように記述しました。
Javaにはpublicなクラス名とソースファイル名は一致させなければならないというルールがございます。
これも併せて覚えておきましょう。