JavaBronze Note == ## Javaのエディションについて ◎JavaSE(スタンダード・エディション)  ・GUIアプリケーション開発に向いている  ・JVMが含まれる 後述のJavaEEとJavaMEはこのJavaSEがベースになっている。 ◎JavaEE(エンタープライズ・エディション)  ・JavaSEから拡張して作られている。  ・JavaEEは仕様だけ定めるため、APサーバの実行にはJavaSEが必要になる。  ・エンタープライズ向け  ・大規模なシステム開発をする際には、JavaEEの方がいい 将来的にWEBサービスとして稼働することが予定されている場合、 JavaSEでつくって、JavaEEに移行するのもあり。 今の名称はJakarta EE ◎JavaME(マイクロ・エディション)  ・ハードウェア制御をするソフトウェア用  ・狭いメモリサイズ、ディスプレイ、容量、バッテリーの中で動くように  ・とても動きが軽いが、実現するために多くの制約が存在している。  ・JavaSEから抜粋して作られている  ・JVMではなく、KVMが動く。 JVMが動かないような狭い環境を前提としているため。 KVMのKはキロバイトの頭文字らしい。。。 つまり、軽量。軽いのK ## インクリメント演算子とデクリメント演算子 ・インクリメントはi++、++i(加算) ・デクリメントはi--、--i(減算) ・++i,ーーiは事前に計算する ・i++,iーーは使い終わってから計算される。 ## アクセス修飾子 【低】「public」 どこからでもアクセスできる(すべてのクラスから)  ・ 「protected」 同じパッケージ内、サブクラスからアクセスできる。  ・ 「なし」  同じパッケージ内のクラスからのみアクセスできる。 【高】「private」 同一クラス内からのみ ## privateに設定できるのは? フィールドとメソッド(メソッドにはコンストラクターも)抽象とつくものはNG【具象は🆗】 ## privateのアクセス可能範囲 •同じクラスの中であること、オーバーロードされたメソッド。 •コンストラクター及び同じクラス内のインスタンス経由であること。 •this.は身内内で使える機能 ## シグニチャ 構成内容 ・メソッド名 ・引数の数 ・引数の型 ・引数の順番 ## 演算処理について ・整数値同士の計算をする際に生じた小数点以下の数値は切り捨てられる。 int a = 5; int b = 2; System.out.println(a / b); →実行結果  2 ・ ## staticについて ・すべてのインスタンスで共有されるフィールド。 ・アクセス修飾子の後に付く。 ・メソッドについているのはstaticメソッドで、 staticがついたメソッドの中でのみ動くので、フィールドへアクセスすることができない。 ・フィールドについているのはstaticフィールド ・staticメソッドは自クラスにあるインスタンスフィールドとインスタンスメソッドは 利用できない。 ・自己完結型のやつ。 ## コンストラクター ・コンストラクターチェーン サブクラスコンストラクターにはスーパークラスを呼び出すやつが入ってる。 ・サブクラスはスーパークラスのコンストラクターは引き継がれない。 ・アクセス修飾子がつけられる(publicしか基本使わないけども) ・必ずすべてのフィールドを初期化する必要はない。 ・newで宣言したときの引数とコンストラクタの引数は共通していないとエラーが発生する。 ## オーバーライドするとき ・戻り値が同じ、変数の型が同じ、アクセス修飾語が同じか緩いこと ## superクラスへのアクセス方法 ・サブクラスからスーパークラスのフィールドやメソッドにアクセスする 時にはsuperを使用する。 ・「super.フィールド名」ないし「super.メソッド名」と指定する。 ・super(なんとか名)やthis()はオーバーロードした自クラス内で使えるので 間違えたら免停。 ## オーバーロード ・コンストラクターから別のコンストラクターを使うには this(〜)を使う(見た目は同じ、引数が違うやつがある時) ・コンストラクターの一番上にあること ・this()で指定しなければならない (this.コンストラクター名()はNG) ・メソッドをオーバーロードする場合、メソッド名のみが一致していればよい。 ## 戻り値(return) ・一つしか設定できないよ ・return以降はなんもかけない ・複数の値を返したいなら配列をつかう ## クラス宣言について Java.langやJava.utilで.*で指定するのはNG objectはimplementがNG ## if elseについて(引っ掛け) ・ifおよびelseの後ろに{}がついていない場合、下一行のみが実行される。 ・if(x = y)はNG。if(x == y)にしないと比較されない。→ コンパイルエラーになる ## for文について for(int i= 0; ;i++)のように終了条件を省略すると無限ループする。 ## 変数の初期化 stringは初期化していないとNULLが入る (空白ではない) ## importについて importはどこに何があるかを最後まで書く必要がある(完全修飾クラス名) パッケージの名前のみでは不可 .*を使用すれば全て選択になる(java.langはNG) ## null "null"で初期化する時文字列でnullになる IFでnullとするとリテラルNULL(文字列ではないヌル)になるので、比較で弾く ## 変数の初期化(intや double) 初期化されないと0で暗黙的に初期化する ## 整数値のデータ型について ・byte 3桁 -128 ~ 127 ・short 5桁 -32,768 ~ 32767 ・int 10桁 -2147483648 ~ 2147483647 ・long 19桁 -9223372036854775808 ~ 9223372036854775807 ・マイナス側は下一桁が8で、プラス側は7で終わる。 ・LONG型は数値の最後に「L」を付けるとLONG型として扱われるらしい ## 浮動小数点型 ・float 7桁  ・double 16桁 ## ローカル変数とフィールド  ・メソッド内で宣言する変数のことをローカル変数 ・フィールドを呼び出すときは「this.フィールド名」 ・混在しやすくなる ## 配列の代入に関して ・配列の範囲を6で設定した変数に ・要素数7の変数を代入したらちゃんと配列の数は7になる。 ## クラス名の定義 ・_、$、アルファベット(Unicode文字)が一文字目、2文字目から数も可能になる。 ・−、♯、%はNG ## 継承に関して ・クラスの継承にはextend ・インターフェースの継承はimplements ・ 一つのクラスが複数のスーパークラスを継承できない 継承済みのクラスも継承できる。 ・フォールドとメソッドが同名のサブクラスの要素にできる。 ・コンストラクターは継承されない。 ・継承関係にあっても、privateになっているフィールドやmethod、コンストラクターは 引き継がれません。親の物は全部子供の物にはならない理論 ## 抽象クラスについて ・明示的にabstractを付ける必要がある(暗黙的にはならへん) ・インスタンス化できない(実行できないから) ## 比較演算子(これ→==)と同一性 String s1 = "ABC"; String s2 = "ABC"; もしくは String s2 = s1; String s3 = new String("ABC"); newしてないStringは自動で生成されたStringインスタンスをつかってる。 なので、 s1 == s2は同じとして判定されるが、 s3 == s1は同じと判定されない。 Stringのインスタンスがs1とs2は同じのを使っているが、 s3はStringのnewで新しいインスタンスを生成しているため、 s1及びs2と、s3では参照元が異なる。 → Stirngはのデータ型は参照型であることの特徴でもある よって、s1(s2) == s3は同じと判定されない。 ## switchの仕様について ・Switch文の式はbyte,short,int,char及びByte,Short,Integer,CharacterとString,列挙型を戻す式である必要がある。 浮動小数型のdouble,floatなどはNGとなる。 ・break文がない場合、Switch文を途中で抜けないため、 分岐処理の次に記述されている項目を実行してしまう仕様である。 defaultまで処理を実行した場合はSwitch文を抜ける public class Main() { public static void main(String[] args) { int x = 2; switch (x) { case 1: System.out.print("A"); break; case 2; System.out.print("B"); case 3; System.out.print("C"); default: break; } } } 実行結果はBCとなる。 ## while文の仕様に関して ・while(〜){} この〜の中身は、trueであり続ける間はwhile文の処理を行い続けるように動く。 ・while(true) falseでもいいんだが、継続条件が事実上終了しないような設定をされている場合、意図的に無限ループを発生させることができる。 「ユーザーからの入力→処理→ユーザーからの入力」のように、同じ処理の何回実行するかが明確になっていない場合に使用すると便利である。 ・ループ端の最後の項目で判定がなされるのではなく、while文の()の処理の中で判断がされるため、 int i = 0; while(i < 5){ //ここでiを比較している i++; } System.out.println(i); 処理結果 5 iが5になったタイミングでwhile文を抜け、5が表示される。 ・do while do{ //処理 }while(条件式); のように記述する。 do(条件式)はエラーになる。 また、判定部分がループ端の最後にあるため、必ず一度は実行される特徴がある。 ## カプセル化について ・変更に強いソフトを作るために機能を分割する設計思想 ソフトウェアを分解した”部品”のことをモジュールと呼ぶ ・その分解した部品(ソースコード)のうち、関係性の高いものをひとまとめにすることを **カプセル化**という。 ・カプセル化の実現方法 ・関係するデータをまとめる ・まとめたデータを必要とする処理をまとめる 関係性の低いフィールドを他のクラスに移動する、フィールドのデータを利用するようなメソッドを追加すること。 ・カプセル化の維持をするために欠かせない原則とは**データ隠蔽**が絡む。 ## データ隠蔽について 【キーワード】カプセル化、アクセサメソッド、コンストラクター ・他のモジュールから用意にフィールドのデータを操作できないようにする。 ・属性の公開範囲を制限すること ・フィールドのアクセス修飾子をprivateに設定する。 →同一のクラス内でのみ制御が可能になる。 ・クラス内にprivateに設定したフィールドを操作するための、 getter,setterなどのアクセサーメソッドを設定する。 (必ずしもアクセサーメソッドを提供する必要はない) →これにより、クラスの外部からの フィールドへのアクセスを制限することができる。 ## 抽象化について ・共通部分だけを抜き出し、それ以外を無視して扱うこと。 ・カプセル化を実現することで、分割された機能を効率よく利用するために、モジュール同士の共通部分を抜き出し、抽象的にひとくくりにすることで、複雑化した要素を単純化する方法。 ・順序 カプセル化(手法:データ隠蔽) → 抽象化(手法;情報隠蔽) ## ポリモーフィズム【多態性)に関して 【キーワード】抽象化、情報隠蔽 ・オブジェクト指向での抽象化をしてオブジェクトを扱うことを **ポリモーフィズム**と呼ぶ。 ・抽象化した型でインスタンスを扱うことを指す。 ・インターフェースの実装が絡む(オーバーライドやインターフェースの実装) ・変更されたクラスを使用するクラスに変更の影響が及ばない。 ・共通はしていても、動きが異なることで派生を作りやすくする。 ・既に生成したインスタンスを別のクラスで宣言したインスタンスに代入した場合、代入したインスタンスのクラス側が動く。 ・シグニチャが異なる場合、小クラスと親クラスで引数の動きが異なる場合、エラーが発生する。 ## 情報隠蔽について 【キーワード】ポリモーフィズム、パッケージ、インターフェース ・抽象化を実現するための手段 ・公開するべきものと非公開にするべきものを区別する。 ・モジュールをフルオープンにするのではなく、公開非公開を設定する。 抽象化によって着目した部分は公開、それ以外は非公開 非公開にする部分にはアクセス制御を行う。 ・公開メソッドを集めたインターフェースを用意する。 抽象化したモジュールと、非公開にし隠蔽されたモジュールとの橋渡し役となる。 ・パッケージ宣言を追加する。 クラスファイルを分類するための入れ物 ・コンストラクタのアクセス修飾子を設定する。 private、protected、デフォルト(なんもつけない)、public ## インターフェースについて ・パブリックのみ設定可能 ・暗黙的に(勝手に)final staticで修飾される。 フィールドや変数が初期化させていないとエラーになる。 ・フィールドはabstractできない(全部やけど) ・メソッドには勝手にpublic abstractが修飾される。 ・型を定義するためのもの ・実装、インスタンス化は不可 メソッドとフィールドには publicのみ設定可能。 メソッドにstaticをつける場合、実装がなければならない。 フィールドは定数のみ定義可能 ## has-a A has-a B → AはBを持っているとなる public class A { private B b; } //AクラスがBフィールドを持っていると解釈できる A has-a Bにならないパターン public class A { public void sample(){ B b = new B(); } } この場合、A has-a sampleとなり、 Bはどこからか引っ張ってきているため、Aでもsampleのものでもない。 ## 抽象クラスと具象クラス ・抽象クラスは継承されることを前提としている ・インターフェース ・実装がほぼない概念的な使われ方をしているクラス ・具象クラスは実行するためのクラスで、すべてのメソッドが実装済みである必要がある。 ・mainメソッドや実働するメソッドが存在しているクラス *** ###### tags: `Note`