シリアライズ対象外となる。マルチスレッド時の値の整合性を保証する。スレッドセーフな処理になる。C言語等で実実装を行う場合に指定する。浮動小数点演算がプラットフォームに依存しない厳密な動作をする。修飾子で最もよく利用されるのが「アクセス修飾子」です。付与対象がどのようなクラスから参照可能であるかを制御します。先ほどの修飾子一覧には記載されていませが、「アクセス修飾子」として「デフォルト修飾子」が存在します。「アクセス修飾子」を明示的に付与しない場合は、「デフォルト修飾子」が付与されたと見なされます。以下の表が、付与されたアクセス修飾子と、参照可能なクラスの関係をあらわした物となります。可が参照可能、不可が参照不可を意味しています。同一パッケージは同一パッケージに含まれるクラス、その他はその他のクラスを意味しています。「動物」クラスのサブクラスが「哺乳類」クラスや「魚類」クラスとなります。継承につきましては「第六回」で説明させていただきます。各修飾子のもう少し細かな説明を以降でさせていただきます。スタティック修飾子スタティック修飾子は、定数、変数、メソッドに付与可能です。クラスの宣言時には付与できません。スタティック修飾子を付与するとクラス(静的)メンバになります。メンバとは定数、変数、メソッド等のクラスの中身を意味します。クラスメンバとは、インスタンスではなく、クラスに属するメンバです。インスタンスに属するメンバはインスタンスメンバとよばれています。「焼き上がったたい焼き」に属するメンバがインスタンスメンバとなります。コードを利用した実際の利用方法は後述いたします。ファイナル修飾子クラス、変数、メソッドに付与可能です。付与されると上書きが禁止となります。以下の場合にファイナル修飾子が利用されます。サブクラスの作成を禁止したいクラス値の変更を禁止したい変数オーバーライドを禁止したいメソッドオーバーライドとはサブクラスで基底クラスのメソッドの動作を上書きすることです。「たい焼き」クラスを継承して、「たい焼き君」クラスを作成したとします。swim()を作成するとします。この行為がswimメソッドのオーバーライドです。強引ですが・・・、オーバーライドは第六回で説明させていただきます。変更が不可な定数になります。変数にしか付与できません。いっても付与した時点で変数ではなくなります。抽象修飾子クラス、インターフェース、メソッドに付与できます。宣言にabstractを付与することで、宣言された物が不完全であることを意味します。抽象修飾子が付与されたクラスを抽象クラス、メソッドを抽象メソッドと呼びます。出ました、今度はインターフェースですか、まだ説明できておりませんね。インターフェースは元々不完全な物ですので、付与はできるけど、そんな事をしても意味ないです。abstractなインターフェースを作成するのは言語仕様としても非推奨となっています。インターフェースの詳細は、第六回で説明させていただきます。話は元に戻って、何をもって不完全?、と思われるのが自然ですね。抽象修飾子が付与されると、そのクラスのインスタンスを作成しようとするとコンパイルエラーとなります。抽象メソッドをメンバに持つクラスは、必ず抽象クラスである必要があります。こちらもコンパイルエラーとなります。実際の処理はC言語等で実装を行う場合に指定する修飾子です。Java側には呼び出しのインターフェース(実装は無いメソッド定義)を記載するだけです。私Javaを使い始めて15年ぐらいになりますが、かなり前に1回だけ使った記憶があります。同期修飾子メソッドに付与される修飾子です。マルチスレッド環境で実行される場合は、メソッドが属するインスタンスを対象として排他制御が行われます。よって、同一インスタンスの同期修飾子付きのメソッドが同時に複数実行される場合のみスレッドセーフとなります。逆に、複数インスタンスの同期修飾子付きのメソッドが同時に複数実行される場合はスレッドセースにはなりません。同期処理については、別エントリーで説明させていただこうと考えております。一時的修飾子Javaにはシリアライズ、デシリアライズという機構が存在しています。VM」上に存在するインスタンスをファイルシステム上のファイルに出力したり、その逆の処理を可能にします。SOAPやEJB等も、インスタンスを複数サーバ間でやりとりするためにシリアライズ、デシリアライズを利用しています。Javaはデフォルトでオブジェクトのすべてのメンバをシリアライズの対象としますが、一時的修飾子が付与された変数は対象外となります。揮発性修飾子Javaの各スレッドは速度向上等のために、変数を自身のメモリー空間にコピーして利用し、スレッドの処理が終わった時点で元の変数に自身のメモリー空間の値を書き戻します。strictfp修飾子をクラス、インターフェース、メソッドに付与すると、浮動小数点の演算がプラットフォームに依存しない厳密な動作をするようになります。strictfpを付与しない場合の浮動小数点の演算は、プラットフォームに依存し、値が若干異なる場合があります。4.1」の「ModifierOrder」によると以下の順番が正しい記載順序です。説明に入る前に、第三回の終了時点のコードを確認しておきます。{}この例では、TaiyakiクラスをTaiyakiCreatorから利用するようになっています。現状ではTaiyakiのアクセス修飾子は「public」ですのでTaiyakiCreatorから参照可能です。修飾子とクラスクラスに付与可能な修飾子は以下の通りです。これ以上説明する事がございませんので省略します。アクセス修飾子とクラスこれについては、追加の説明は不要かと思いますが、1問だけクイズを出させてください。前述の例のTaiyakiのアクセス修飾子はpublicです。このpublicを他のアクセス修飾子に変更してもTaiyakiCreatorから参照可能になる物は存在するか?答えは、存在しないです。異なる場合はpublicのみ参照可能です。ファイナル修飾子とクラスTaiyakiにfinal修飾子を付与してみましたが、何も起こりませんでしたfinal修飾子を付与することで、サブクラスが作成できないクラスになった。{}抽象修飾子とクラスTaiyakiのfinal修飾子はそのままにして、abstract修飾子も付与してみました。{}するとコンパイルエラーが発生しました。不完全なままのクラスの継承を禁止しろとの意図になるのですから、意味不明ですよね。final修飾子を除去してみました。TaiyakiTaiyakiは純粋にabstractになりましたので、当然インスタンスが作成できないはずです。Eclipseでも予想通りのエラーが発生しました。シンプルなクラスのインスタンス作成方法も説明させていただきました。たい焼き();Taiyaki.javaでは、以下の部分が対応します。Taiyaki();このシンプルな例が実際には、どのように動作しているのかを説明し、シンプルではないクラスのインスタンス作成例を説明したいと思います。引数無しのコンストラクタがデフォルトコンストラクタです。.javaを作成した時点でデフォルトコンストラクタは利用可能です。復習となりますが、現在のTaiyaki.javaは以下のようになっています。{}見ていただいている通り、Taiyakiの中身は空っぽです。関わらずデフォルトコンストラクタは利用可能となります。デフォルト以外のコンストラクタが定義された場合は、デフォルトコンストラクタを明示的に定義しなければ、デフォルトコンストラクタは利用不可能になります。この例は後ほど説明いたします。・デフォルトコンストラクタ以外のコンストラクタコンストラクタの構文は以下の通りです。{初期化処理}上記例では引数が2つとなっていますが、必要な分だけ増やしたり、減らしたりすることが可能です。引数にintを1つ指定可能なコンストラクタをTaiyakiに追加してみました。{}}するとEclipseでコンパイルエラーが発生するようになりました。先ほど説明させていただいた、デフォルト以外のコンストラクタが定義されたので、デフォルトコンストラクタが利用不可能になったからです。Eclipseのエラー修正機能を用いてデフォルトコンストラクタを追加します。以下の画像の赤枠の部分をクリックします。Taiyaki()の作成」を上下ボタンの下を1回押して選択状態にした後、「リターン」キーを押して修正を確定します。Taiyakiクラスにデフォルトコンストラクタが作成された状態で、画面は以下のように表示されますので、パッケージを選択したらデフォルトコンストラクタの作成が完了です。基本的には、コンストラクタは基底クラスのコンストラクタを呼び出す必要があります。詳細は第六回で説明させていただきます。クラスとインスタンスと変数と定数いよいよ変数です。以前から何回か「変数は箱です。」みたいな表現を使っていますが、まさに箱ですが、変数にはメンバ変数(クラス変数やインスタンス変数)とローカル変数の2つが存在します。クラス変数とインスタンス変数の違いについては後述いたします。メンバ変数で注目すべきは、変数の型と修飾子です。ローカル変数は、メソッドやブロック内で宣言され、その範囲でのみ利用可能な変数です。const修飾子が付与された変数が定数となります。ローカル変数ローカル変数にも付与可能な修飾子がありますが、利用する機会はほぼ無いに等しいですので説明は省略いたします。宣言方法を以降で説明いたします。変数の名前1,変数の名前2;のようにカンマで区切って一括して宣言できます。初期値を指定する場合は変数名の後に=初期値;を追加します。以降で説明いたします。変数の名前1,変数の名前2;のようにカンマで区切って一括して宣言できます。変数の宣言のよくあるパターン「変数の宣言方法」では、修飾子の一言でかたづけましたが、変数宣言のキモは修飾子ですので修飾子の組み合わせを含んだ変数宣言をTaiyakiに追加しました。finalとprotectedを含んだ例も入れたいのですが、継承の説明後に説明することが効果的ですので、第六回で説明させていただきます。Taiyakiは以下のようになりました。自動生成されたコンストラクター・スタブ//本来は基底クラスのコンストラクタをsuper();記載することで呼び出す}}・name1name1(最悪なネーミングですね・・・)の注目ポイントは何もありません。メンバ変数にはクラス変数かインスタンス変数しかありませんが、name1はstatic修飾子が付与されていないのでインスタンス変数です。実際にTaiyakiCreatorからname1変数を参照してみます。参照方法は当然、インスタンス名.name1となります。100;}}・name2name2の注目ポイントはstatic修飾子です。これが付与されることにより、name2はクラス(静的)変数となります。クラス変数には、クラス名.変数名でアクセスします。実際にTaiyakiCreatorからname2変数を参照しみようと思うのですが、とりあえずインスタンス変数と同じ参照方法を記載してみます。アクセスする必要があります」との警告が表示されるようになりました。JDKの古いバージョンではコンパイルエラーになっていたと記憶しているのですが・・・どこかのバージョンから警告に変わった様です。確かに、インスタンスに対応するクラスをコンパイラは理解しているのだから、クラス変数にインスタンス経由でアクセスしても、良きに計らってくれるのでしょう。name2へstaticにアクセスするように変更してみます。先ほどの警告は出力されなくなりました。100l;}}・name3transient修飾子付与されたpublicな変数です。transientを付与したかった。・name4デフォルト修飾子とvolatileが付与された変数です。volatileによって違いが出るサンプルは今回は実装しませんが、機会があれば別エントリーで取り上げたいと思います。デフォルト修飾子は、自クラスと同一パッケージのクラスから参照可能です。同一パッケージのクラスの方の確認は、任意のクラスを作成し、パッケージ名をhoge.fooにするだけですので、説明は省略させていただきます。自クラスからの参照につきましては、private修飾子と同様ですので、name5で説明いたします。・name5private修飾子が付与されていますので自クラス(Taiyakiの内部から)しかアクセスできません。自クラスからの参照を実装してみます。デフォルトコンストラクタからname4の値を100.100に変更してみます。100.100;}この記載方法でも今の状態であれば問題ないのですが、問題が発生する可能性を考慮して、その回避策が言語仕様に存在しています。Taiyakiに以下のメソッドを追加しました。name5);}int型のname5という名前のローカル変数を値10で宣言し、System.out.printlnでname5の値をコンソールに出力しています。・このswimメソッドでインスタンスメンバのname5にアクセスするにはどうしたらよいか?・System.out.printlnで出力しているname5は本当にローカル変数のname5なのか?1つ目のクイズの答えは、this.name5と記述することでアクセスできる。2つ目のクイズの答えは、同じ名前のメンバ変数、ローカル変数が存在する場合は、ローカル変数が優先される。以下のように記述すれば両方の変数にアクセスできますが、「あれー、this付け忘れちゃったよ」なんてことになるとバグを作り込んでしまう可能性が高くなるので要注意です。this.name5);}Java超入門[4:クラスに関する基礎知識(修飾子とクラスとインスタンスと変数)]は以上です。スポンサードリンク関連記事Eclipse(4.4)でJava言語のリファクタリング機能の使い方[「メソッド・シグニチャーの変更」と基本的な抽出処理、及び「インライン化」、「定数の抽出」]本エントリーでは、Eclipse(4.3)でJava言語のリファクタリング機能の使い方に引き続き記事を読むEclipse(4.3,4.4)の使い方[パースペクティブのツールバーのカスタマイズ(「コマンド・グループ可用性」と「ショートカット」タブ)]「パースペクティブのカスタマイズ」画面には、以下の4つのタブが存在しております。WebDriver(Java/Junit4)の使い方]WebDriverでは、予め中継サーバを起動しなくても、テスト実行時にブラウザ拡張機能や、OSのネイ記事を読むEclipseの使い方(Eclipse4.4のブックマーク機能とタスク機能)今回は、Eclipseのブックマーク機能とタスク機能の説明をさせていただきます。記事を読むSelenium入門その6[Selenium3でWebDriver(Java/Junit4)の環境を作成しEdge,Chrome,Firefoxで確認してみる]Selenium3も3.0.1がリリースされましたし、今後は本格的にSelenium3が利用されてい記事を読むEclipse4.4(Java)における自動ビルド設定の変更方法の説明Eclipse4.4における自動ビルド設定の変更方法を説明させていただきます。記事を読むEclipseの使い方(Windows環境のEclipse4.3、Eclipse4.4)Eclipse4.4.0よりJDK8を正式サポートするそうです。コメントをキャンセルメールアドレスが公開されることはありません。(4.7.1)を利用してJUnit5の公式ガイドの内容を実践してみる。JUnit5が本格的に利用できる環境が整ってきました。Eclipse[4:クラスに関する基礎知識(修飾子とクラスとインスタンスと変数)]Java、Eclipse、JUnitに関連した技術情報のブログです。