IDEにビルドにプロジェクト以下に示すクラス図によって、この記事、対応するコードの製造は、実際にはJavaの継承を認識し、重合、合成(合成)、関連する依存関係の手このプロジェクトの終了後、これらいくつかの理解は、誰かがあなたにハンズオンクラス図を与えた場合にも、絵クラス図も強調しすぎる方法を知って、将来の深遠な経験を持っています。
継承
相続の最大があり、承継がクラスとインタフェース、インタフェースが飛ぶ最初の動物、鳥、ガチョウ、アヒル、ペンギンのクラスに分割され、人々は、インターフェイスが作成された場合に言うと、継承が叶います。以下のように分類クラスとコード変換関係は次のとおりです。
方法一時的に達成するために関連する他の関係とはどの実装のプロパティとメソッドを持って、各クラス。する必要があるこの鳥自体が敷設振る舞い(メソッド)を持っているということです、それは実際に親鳥が卵の行動を産む書き換えるクラスペンギン振る舞い(メソッド)を敷設、ガチョウ、アヒルを継承しています。
また、書き換え方法カバーと呼ばれる継承された多型、しばしば混乱を区別するための方法で過負荷を書き換えます。
過負荷:メソッドは、特定のパラメータリストの違いによって呼び出され、同じクラス、同じメソッド名(同じ名前のメソッドを表示されます)、で。
表紙:クラス階層では、同じ親クラス名とメソッド、戻り値の型、および同じ番号とパラメータリストの同じタイプのサブクラスメソッドは、このメソッドは、カバレッジ呼び出された場合。参照方法を被覆する方法として、現在、参照されるオブジェクトのタイプに従って実行されているバージョンを決定するために、親クラス、Java(登録商標)によって呼び出されます。
リファレンスにスーパーキーワードを形成するために、親クラスのメンバへの参照:
..スーパースーパーメンバ変数またはメンバメソッド(パラメータ)
工法のため、参照である:スーパー(パラメータ)
class SuperClass {
int a;
SuperClass(){
a = 10;
}
public void printA() {
System.out.println("父类中a ="+a);}
}
class SubClass extends SuperClass {
int a;
SubClass(int a) {
this.a = a;
}
public void printA() {
System.out.println("子类中a = "+a);
}
}
public class OverrideDemo {
public static void main(String args[]) {
SubClass s1 = new SubClass(10);
s1.printA();
}
}
方法printAサブクラスを呼び出す結果コードとして。
メソッドのサブクラスの場合、メソッド名、戻り値の型、および親クラスと一致した方法が、パラメータリストのみが異なっている、サブカテゴリーのカウント方法のオーバーロードこのような場合、代わりに上書きします。
ときにカバー:サブクラスの注意「親クラスから継承したものと同じ名前の親クラスのメンバ変数は、メンバ変数は、同じ名前の親クラス、息子で定義された親クラスのメンバ変数のサブクラスとメンバー変数を操作することができます。クラスこの変数を参照するとき、デフォルトでは、同じ名前の親クラスの非表示メンバーにカバーを意味し、「カバー」親クラスからのメンバ変数から継承された独自の定義のメンバ変数への参照です。
について多型注意事項私が持っていますこれらの要約:
1、いいえメンバー変数多型
2、親クラス・オブジェクト・サブクラスは、変換タイプ完了することができ
、主に変数とメソッドは、部材をカバー部材を完了する方法を理解する多型サブクラス参照の視点から見た3、。
4、親クラスの観点から、サブクラスのオブジェクト参照が多型を見て、それさえも親クラスのサブクラスオブジェクトの基準点を見つけるでしょう、独自のメンバ変数のまだ唯一の直接の操作親クラスの親クラスと親クラスのメンバーへの参照を呼び出します。親参照は(、新しいメソッドのサブクラスすることはできません、ここでの方法は、サブクラスでなければならない親クラスをオーバーライドする)間接業務サブクラスのメンバ変数にサブクラスのメソッドを呼び出す必要があります。A 重要使用方法:最後に動的結合方法、ノートキーワードのinstanceofいます。
ここでは、この例では、多型の見解を反映していない子クラスのオブジェクトを呼び出すために、親クラスの観点から参照されるJava多型と言う点で、それは要約言及の唯一の最後の段落、あまり話します。このインスタンスを続けます。
依存関係
名前が示すように、DO XX A依存性は、動物が酸素と水代謝、借り関係、Aになる依存Bを必要とする事例のように、Bを必要とされているAも変更する必要がありとき、Bが変化します。依存依存引数としてクラス、またはコールがクラスA、クラスBまたはクラスBの静的メソッドの例を作成するいくつかの方法であることクラスメソッドのコードのパフォーマンス。
そして、この例の依存性を達成することができます(私は彼らが望むだけの方法があり、新しいアイデアがあるかどうかを自分で考えることができ、もちろん多くの他の方法です)
Animal.java
public class Animal {
public char living; //是否有生命
public void metabolism(Oxygen oxygen,Water water) { //新陈代谢
System.out.print("进行新陈代谢 ");
oxygen.needOxygen();
water.needWater();
}
public void reproduce() {
System.out.print("我是可以繁殖的!"); //繁殖
}
Oxygen.java
package edu.hut.software.zqh;
class Oxygen{ //依赖关系空气
public void needOxygen() {
System.out.print("被依赖类氧气 ");
}
}
class Water{ //依赖关系水
public void needWater() {
System.out.print("被依赖类水 ");
}
}
関連性
アソシエーションは、1つのクラスまたは強い依存間のセマンティックレベルのインターフェイスと、二つのクラスに反映され、それはプロパティおよび別のクラスへのクラスの方法は、この関係は、非常に強い依存性よりも強いが偶発的ではないことを知っています一時的な、しかし長期的には、コード・レベルに反映比較的対等な関係は、クラスAとクラスBに表示されるクラス属性の形で関連している、それは、参照があるクラスに関連付けられてもよいですクラスBのグローバル変数は、関連付けられています。例のペンギンや気候として、彼らの関係は、ペンギンのクラスはクラス属性の気候クラスを持つべきであるということです、彼らは「持っている」関係のようなものがあります。
実装コードは次のとおりです。
Climate.java
package edu.hut.software.zqh;
public class Climate {
public void changeClimate() {
System.out.print("关联关系“天气”");
}
}
Penguin.java
package edu.hut.software.zqh;
public class Penguin extends Bird{
private Climate climate; //关联关系
public Penguin(Climate climate) {
this.climate=climate;
}
public void layEggs() {
System.out.print("我是企鹅所以我生企鹅蛋 ");
climate.changeClimate();
}
}
関連性
重合は、関連の特別な場合であり、重合の強い相関がある個体間の全体の関係は、次に全体の一部を分離することができ、彼らのライフサイクルを持っていることを、オブジェクトの複数の部分に属していてもよい、複数であってもよいですこのようなCPU間の関係、及び会社員として、コンピュータ、;オブジェクト共有高分子コードに関連付けられているが、同じレベルで、意味論からアップ区別することができます。
集約関係は明らかでの2つの異なるレベルで重合領域文法のJava近すぎる相関および凝集、クラス階層の関連において、達成するインスタンス変数を使用することです。
個々ガチョウガチョウの複数からなる本実施ガチョウおよびガチョウなど、ガチョウは、独立して存在することができ、どちらもガチョウを、左。
実装コード:
WideGoose.java
package edu.hut.software.zqh;
public class WideGoose extends Bird implements Fly{
public void layEggs() {
System.out.print("我是大雁所以我生大雁蛋");
}
public void fly() {
System.out.print("我能够飞翔");
}
}
WideGooseAggregate.java
package edu.hut.software.zqh;
public class WideGooseAggregate {
private WideGoose[] arrayWideGoose; //这里暂时不知道应该怎么给那些属性赋值,感觉没太大用,就不赋值了
public void horizontalFly() {
System.out.printf("雁群一字型飞行队列");
}
public void vFiy() {
System.out.printf("雁群一字型飞行队列");
}
}
Java実装と関連して、コードの観点から区別しないが、二つのクラス階層ではありません。
(組み合わせ)の関係の合成
組み合わせは、重合よりも強く、重合は強力な関係で、組合関係の特殊なケースです。また、全体と部分との間の関係を反映しているが、この時間の終わりには、全体的なライフサイクルの全体と不可分である部分もライフサイクルの端部、およびその逆を意味しています。このような脳と人間、この場合の鳥と羽のように、ではないが、鳥の翼は本当に恐ろしいのように。
次のようにコードは次のとおりです。
Wing.java
package edu.hut.software.zqh;
public class Wing {
public void wing() {
System.out.print("合成关系“有翅膀”");
}
}
Animal.java
package edu.hut.software.zqh;
public class Bird extends Animal{
public int feather; //是否有羽毛
public int mouse; //嘴巴是否是有角质喙而没有牙齿
private Wing wing;
public Bird() {
wing=new Wing();
wing.wing();
}
public void layEggs() { //下蛋
System.out.print("不同种类的鸟下蛋种类不同!");
}
}
そしてまた、コード内の関連する差異を欠い
遂に
プロセスでは、私は、コードのほとんどを与えてくれた、と次のように残りの部分は、クラスの継承であります:
package edu.hut.software.zqh;
public class DonaldDuck extends Duck implements Speak{
public void speak() {
System.out.print("大家好,我是唐老鸭,我和其他鸭子不一样的是我继承了讲人话接口,会说话");
}
}
package edu.hut.software.zqh;
public class Duck extends Bird{
public void layEggs()
{
System.out.print("我是鸭子所以我生鸭蛋");
}
}
package edu.hut.software.zqh;
public interface Speak {
public abstract void speak();
}
interface Fly{
public abstract void fly();
}
public static void main(String args[]) { //调用继承的方法并输出相关语句验证各种关系是否实现
Penguin penguin=new Penguin(new Climate());
System.out.print(" ");
penguin.layEggs();
System.out.print(" ");
penguin.metabolism(new Oxygen(), new Water());
System.out.print(" ");
penguin.reproduce();
System.out.println();
DonaldDuck donaldduck=new DonaldDuck();
System.out.print(" ");
donaldduck.layEggs();
System.out.print(" ");
donaldduck.metabolism(new Oxygen(), new Water());
System.out.print(" ");
donaldduck.reproduce();
System.out.print(" ");
donaldduck.speak();
System.out.println();
WideGoose widegoose=new WideGoose();
System.out.print(" ");
widegoose.layEggs();
System.out.print(" ");
widegoose.metabolism(new Oxygen(), new Water());
System.out.print(" ");
widegoose.reproduce();
System.out.print(" ");
widegoose.fly();
}
}
すべてのコードがアップロードされている、あなたは、実行の実行中の順序を見ることができます