テキスト形式のボーエンの始まり:(2点)
プロジェクト |
コンテンツ |
「オブジェクト指向プログラミング(Javaの)」 |
https://www.cnblogs.com/nwnu-daizh/ |
どこの仕事でこの要件 |
https://www.cnblogs.com/nwnu-daizh/p/11815810.html |
ジョブの学習目標 |
|
エッセイボーエン本文の内容は次のとおりです。
パートI:理論的知識ジェネリックプログラミングの章VIIIの概要(25ポイント)
1、一般的なプログラミングの概念
JDK 5.0でのジェネリック型では(1)の増加は、Java言語には、安全性の向上の重要なタイプです。
ジェネリック(2)また、タイプパラメータによって処理されるオブジェクトのタイプを示す、クラス、インタフェースおよびメソッドの定義でパラメータ化された型(パラメータ化型)と呼ばれます。(例えば、ArrayListクラス)
(3)一般的なプログラミング(ジェネリックプログラミング):ライトコードは、オブジェクトの多くの異なる種類によって再利用されてもよいです。
2、および方法の一般的なクラス宣言の例
(1)一般的なクラス(一般クラス)、すなわちクラス変数の1つまたは複数のタイプ、作成したパラメータクラスとして使用されるタイプを有するされています。
(2)次の形式で定義された一般的なクラスとして:クラスジェネリック<K、V> K及びVは、可変パラメータークラスタイプです。
(3)ペアクラスは、型Tの変数を導入(<>)、角括弧で囲まれ、クラス名の後に続きます。
(4)一般的なクラスは、変数の型を複数持つことができます。例えば:パブリッククラスペア<T、U> {...}
クラス定義における(5)式の変数は戻り型とフィールド、ローカル変数のタイプを指定します。
(6)一般的なクラスの制約と制限:
a)の基本的なタイプのパラメータの型をインスタンス化するために使用することはできません
b)の実行時型クエリは元の型に適用されます
C)ジェネリッククラスのインスタンスが捕捉できない投げません
D)アレイのパラメータ化された型は正当ではありません
E)型変数インスタンス化することはできません
f)は、ジェネリッククラス型変数の静的コンテキストが無効です。
g)を消去し、紛争後の注意
定義3、一般的な方法
(1)一般的な方法:一般的なクラスに加えて、一つの方法として、単一の一般的な方法を定義することができ、ジェネリック型パラメータまたは戻り値を指定するための方法は、メソッドコールが残っていると判断します。
(2)一般的なクラスは、一般的なカテゴリ内で宣言することができる一般的な方法で宣言されてもよいです。
{クラスArrayTool公共 のpublic static <E>のボイドINSERT(E [] E、I intは) { //コードを自分で追加して下さい } のpublic static <E> E valueAt(E [] E、Iはint) { //自分自身を追加しますコード } }
4、汎用的なインタフェースの定義
パブリックインターフェースIPool <T> { T GET()。 int型の追加(TのT); }
型変数を(1)定義
アッパーは、一般的な変数を定義する)バインド
パブリッククラスNumberGeneric <Tは数を拡張します>
b)の下に定義型変数の結合
リスト<?superCashCard>カード=新規のArrayList <T>();
5、継承ルールのジェネリック型
(1)Java配列は共変(共変)ですが、この原理は、一般的なタイプには適用されません。
非共分散の(2)Javaのジェネリッククラス。
(3)一般的なクラスを拡張し、又は他の一般的なクラスを実装することができます。
使用ワイルドカードの6種類と方法
(1)は、「?」記号は、パラメータの種類は、任意のタイプを示すことを意味し、T引数が異なっています。Tは未知のタイプを表し、「?」いずれかのタイプを表します。このワイルドカードは、一般的に次の三つの用途があります。
a)の一人で?、のいずれかのタイプを意味するために使用します
B)?上限で表さ、タイプを拡張します。
下限で表現C)?スーパータイプ、。
(2)型定義されたワイルドカード
a)のペア<?従業員は、拡張>
b)のペア<?スーパーマネージャー>
C)不定ワイルドカード:<?>ペア。<?>ペアペア異なるとのこと:あなたは任意のObjectオブジェクトを元のメソッドsetObjectにペアクラスを呼び出すことができます。
パートII:実験の部
実験1 : 第8章サンプルプログラム、テスト手順やコードのコメントを導入します。
試験手順 1:
、編集、デバッグ、教科書ランニング 311312ページのコードを、プログラムを組み合わせた結果がプログラムを理解します。
ジェネリッククラス定義にコメントを追加して、コードを使用します。
ジェネリッククラスの定義および使用をつかみます。
コードは以下の通りであります:
PairTets1:
パッケージPAIR1; / ** * @version 1.01 2012-01-26 * @authorケイHorstmann * / publicクラスPairTest1 { パブリック静的無効メイン(文字列[] args) { 文字列[] = {単語"メリー"、 "HAD" 、 "A"、 "リトル"、 "ラム"}; ペアの<string> MM = ArrayAlg.minmax(単語) のSystem.out.println( "分=" + mm.getFirst()); のSystem.out.println ( "最大=" + mm.getSecond()); } } クラスArrayAlg { / ** *文字列配列の最小値と最大値を取得します。。 文字列の* @ParamアレイAN A * @return一対Aがヌルであるか、または空の場合はnullのために、最小値と最大値を持ちます * / 公共静的ペア< { IF(== NULL || a.length == 0)リターンヌル。 文字列分= [0]。 ストリングmaxは= [0]。 以下のために(INT I 1 =; I <a.length; I ++) { IF(min.compareTo([I])> 0)分= [I]。 IF(max.compareTo([I])<0)MAX = [I]。 } 戻り新しいペア<>(最小、最大)。 } }
ペア:
パッケージPAIR1; / ** * @version 1.00 2004-05-10 * @authorケイHorstmann * / publicクラスペア<T> //はタイプTの変数紹介ジェネリッククラス定義 { プライベートまずTを。 第2のT専用; //変数型を使用し、型のメソッドの戻り型は、変数指定 公共ペア(){まず= NULLを、SECOND = NULL;} 公共の対(T第一、第二Tは)= {まずthis.first; this.secondを=秒;} パブリックT getFirstと(){リターンまず;} パブリックT getSecond(){戻りSECOND;} 公共ボイドsetFirst(T newValueに){まず= newValueに;} 公共ボイドsetSecond(T newValueに){SECOND = newValueに;} }
次のようにプログラムの結果は以下のとおりです。
一対のクラスは、型Tの変数を導入(<>)、角括弧で囲まれ、クラス名の後に続きます。ジェネリッククラスは、変数の型を複数持つことができます。例えば、クラスが前記第一のドメインと第2ドメインの使用、異なるタイプのペアを定義することができます。
パブリッククラスペア<T、U> {...}
戻り値の型とタイプフィールドと変数の型を指定したメソッドのクラス定義のローカル変数。たとえば:最初の民間T; //は型変数を使用しています
変数の代わりの種類の特定のタイプは、例えば、ジェネリック型をインスタンス化することができます:ペア<文字列>
試験手順2:
教科書はPairTest2、プログラムの組み合わせ結果がプログラムを理解315、編集、デバッグ、および実行されています。
ジェネリックプログラミングコードでの関連するコメントを追加します。
一般的な方法と目的定義された変数の一般的な定義をご覧ください。
コードは以下の通りであります:
PairTest2:
パッケージPAIR2。 輸入java.time *。; / ** * @version 1.02 2015年6月21日 * @authorケイHorstmann * / publicクラスPairTest2 { パブリック静的無効メイン(文字列[] args) { LOCALDATE []誕生日= { LocalDate.of(1906、12、9) 、// G.ホッパー LocalDate.of(1815、12、10)、// A.ラブレース LocalDate.of(1903、12、3)、// J.フォンノイマン LocalDate.of(1910、6、22) // K.ツーゼ }。 対<LOCALDATE> MM = ArrayAlg.minmax(誕生日)。//实例化对象ミリメートル のSystem.out.println( "分=" + mm.getFirst())。 のSystem.out.println( "最大=" + mm.getSecond())。 } } ArrayAlgクラス { / ** 型Tの配列オブジェクトの最小値と最大値を取得します。 @paramのT型のオブジェクト配列 ヌル用Aがヌルまたは空の場合、最小値と最大値を有する@return、 * / パブリック静的ペア<T> MINMAX(T [] A)<Tが同等を拡張します> { IF(A == NULL || a.length == 0)戻りNULL; T分= A [0]; T MAX = A [0]; のための(INT I = 1; I <a.length; I ++) { IF(min.compareTo(A [I])> 0)分= A [I]; IF(max.compareTo(A [I])<0)MAX = A [I]; } 新しい新しいペア<RETURN>(分、MAX); } }
ペア:
パッケージPAIR2; / ** * @version 1.00 2004-05-10 * @authorケイHorstmann * / publicクラスペア<T> //はタイプTの変数紹介ジェネリッククラス定義 { プライベートまずTを。 第2のT専用; //変数型を使用し、型のメソッドの戻り型は、変数指定 公共ペア(){まず= NULLを、SECOND = NULL;} 公共の対(T第一、第二Tは)= {まずthis.first; this.secondを=秒;} パブリックT getFirstと(){リターンまず;} パブリックT getSecond(){戻りSECOND;} 公共ボイドsetFirst(T newValueに){まず= newValueに;} 公共ボイドsetSecond(T newValueに){SECOND = newValueに;} }
次のようにプログラムの結果は以下のとおりです。
一般的な方法は、一般的なカテゴリで定義することができる一般的なメソッドを呼び出すときにも、メソッド名の前の角括弧の特定の型に、ジェネリッククラスで定義することができる:.文字列の中央= ArrayAlgの<string> getMiddle( "ジョン"、 "Q."、 "公共")
;この場合、メソッドの呼び出しは、<文字列>型パラメーターを省略してもよいです。
クラス全体で有効なジェネリックジェネリッククラス定義、。この方法が使用されている場合は、操作するためのすべてのタイプを明確に操作するオブジェクトの特定のタイプの一般的なクラスが修正されました。
さまざまなタイプを操作するためのさまざまな方法を可能にするために、およびタイプが不明です。ジェネリック医薬品は、メソッドに定義することができます。
* Eを拡張:Eは、E型又は上限のサブタイプを受信することができます。
*スーパーE:親タイプEやタイプEは、下限値を受け取ることができます。
試験手順3:
教科書335 PairTest3を試運転して、プログラムを組み合わせた結果がプログラムを理解します。
ワイルドカード型の定義と使用法を理解します。
コードは以下の通りであります:
PairTest3:
パッケージpair3。 / ** * @version 1.01 2012-01-26 * @authorケイHorstmann * / publicクラスPairTest3 { 公共の静的な無効メイン(文字列[] args) { VARの最高経営責任者(CEO)=新しいマネージャー( "Gusの貪欲"、800000、2003、12 、15); VaRのCFOは、新しいマネージャー( "シド卑劣な"、600000、2003、12、15)=。 VARの仲間=新しいペア<マネージャ>(CEO、CFO); printBuddies(バディ)。 ceo.setBonus(1000000)。 cfo.setBonus(500000)。 マネージャ[]マネージャ= {CEO、CFO}。 VaRの結果は=新しいペア<従業員>(); minmaxBonus(マネージャー、結果)。 System.out.println( "最初:" + result.getFirst()。 + "第二:" + result.getSecond()のgetName())。 maxminBonus(マネージャー、結果)。 System.out.println( "第一" + result.getFirst()のgetName() + "第二:" + result.getSecond()のgetName())。 } パブリック静的ボイドprintBuddies(ペアP <従業員が延びる?>)//通配符类型解决了不能将子类传递给父类 { 従業員の最初= p.getFirst()。 従業員二= p.getSecond()。 System.out.println(first.getName()+ "と" + second.getName()+ "は仲間です。")。 } パブリック静的ボイドminmaxBonus(マネージャー[] A、ペア結果<スーパーマネージャ?>) { IF(a.length == 0)のリターン; マネージャ分= [0]。 (INTのためにI 1 =; I <a.length。 { IF(min.getBonus()> [I] .getBonus())分= [I]。 IF(max.getBonus()<[I] .getBonus())MAX = [I]。 } result.setFirst(分)。 result.setSecond(最大)。 } パブリック静的ボイドmaxminBonus(マネージャー[] A、ペア結果<スーパーマネージャ?>) { minmaxBonus(結果)。 PairAlg.swapHelper(結果); // SavaHelp捕获通配符类型 } //无法写入公共静态<T超级管理器> ... } クラスPairAlg { パブリック静的ブールhasNulls(<?>ペアP) { 戻りp.getFirst ()== NULL || p.getSecond()== NULL。 } パブリック静的ボイドスワップ(ペアP <?>){swapHelper(P)。} パブリック静的<T>ボイドswapHelper(ペア<T> P) { T T = p.getFirst()。 p.setFirst(p.getSecond())。 p.setSecond(T)。 } }
ペア:
パッケージpair3; / ** * @version 1.00 2004-05-10 * @authorケイHorstmann * / publicクラスペア<T> //はタイプTの変数紹介ジェネリッククラス定義 { プライベートまずTを。 第2のT専用; //変数型を使用し、型のメソッドの戻り型は、変数指定 公共ペア(){まず= NULLを、SECOND = NULL;} 公共の対(T第一、第二Tは)= {まずthis.first; this.secondを=秒;} パブリックT getFirstと(){リターンまず;} パブリックT getSecond(){戻りSECOND;} 公共ボイドsetFirst(T newValueに){まず= newValueに;} 公共ボイドsetSecond(T newValueに){SECOND = newValueに;} }
社員:
パッケージpair3。 輸入java.time *。; パブリッククラスEmployee { プライベート文字列名; プライベートダブル給与; プライベートLOCALDATE hireDay。 公共の従業員(文字列名、ダブル給料、int型年、int型の月、INT日) { this.name =名; this.salary =給与; hireDay = LocalDate.of(年、月、日)。 } パブリック文字列のgetName() { 戻り名。 } 公共ダブルgetSalary() { 戻り給料。 } 公共LOCALDATE getHireDay() { hireDayを返します。 } 公共ボイドraiseSalary(ダブルbyPercent) { ダブルレイズ=給与* byPercent / 100。 給与+ =昇給; } }
マネージャー:
パッケージpair3。 パブリッククラスマネージャは、従業員の拡張 { プライベートダブルボーナスを。 / ** @param名従業員の名前の @paramの給与給与 @param年雇う年 @param月入社月 @param日レンタル日 * / 公共マネージャー(文字列名、ダブル給与、int型の年、int型月、int型日) { スーパー(名前、給与、年、月、日)。 ボーナス= 0; } 公共ダブルgetSalary() { ダブルbaseSalary = super.getSalary()。 baseSalary +ボーナスを返します。 } パブリック無効setBonus(ダブルB) { ボーナス= B。 } 公共ダブルgetBonus() { 戻りボーナス。 } }
次のようにプログラムの結果は以下のとおりです。
あなたは時間に渡された実際のパラメータが存在しない場合、型引数を渡す必要があり、一般的なクラス、ジェネリッククラスを使用する場合、コンパイラは、一般的な警告を提案します。
ワイルドカードの使用に関する:
使用すると、比較的トリッキーなAPIでワイルドカードが、ワイルドカードは、多くの柔軟なAPIコードを作ることができます。
あなたは広く使われているライブラリを作成する場合は、ワイルドカードを使用するのが適切でなければなりません。原則があるワイルドカード、すなわち:.プロデューサー拡張し、消費者・スーパー(PECS)は、典型的な生産、消費者のモデルの問題です。
様々な一般的なリストの親クラスを表すには、ワイルドカードの種類を使用することができ、引数のセットとして疑問符が書き込み、リストを入力するために渡された(?):「?」のリストは、この疑問符の要素を(リスト要素の型が不明であるという意味します)タイプは、任意の型を一致させることができます。
実験概要:(15ポイント)
今週の学習によって、私は再利用、型の安全性と効率性とともにジェネリックプログラミング、ジェネリッククラスとジェネリックメソッドについて学び、ジェネリッククラスはボクシングとアンボクシング値型に運ぶために強制されることはありませんか、参照型は、そのプログラミング性能を向上させるために、ダウンキャストされています。私は、ジェネリックプログラミングの利点は、多くの異なる可能性がコード書くことだと思うのオブジェクトの再利用タイプを。コードの量を削減し、読みやすさを増加させました。先生ジェネリッククラスを聞いて、理論のクラスを学習では、特に難しいことではありませんが、あなたは、実験のコース上でプログラムを実行すると、あまりにも自分のプログラミングでは、まだ大きな問題があり、プログラムの理解ではありません。研究の後、私はこの知識を理解するための複数のプログラムを練習します。