4

少し難しいですが、私の問題を説明しようと思います。RichIndustrialistスーパークラス ( ) 2 つのサブクラス (PredecessorRichIndustrialistおよび追加しなかった別のサブクラス) と、これらのサブクラスへの 4 つのサブクラス (および別の 3 つ)を持つプログラムを作成しましたCrazyRichIndustrialist。さて、プログラムを説明するのは難しすぎますが、問題は実際には単純です。私のコンストラクターはスーパークラスにあり、すべてのサブクラスはそれを使用して初期化します。のような新しいサブクラス オブジェクトを作成するたびにCrazyRichIndustrialist、既存のすべてのサブクラス (任意のサブクラスから) が新しいオブジェクトの値にリセットされます。これを修正する方法がわかりません。前もって感謝します...

RichIndustrialist:

package Mortal;

import java.util.Random;

public class RichIndustrialist implements Mortal {

    private static String Name;
    private static double holdings;
    private static int Alive;

    public RichIndustrialist(String Rich_Name, double Rich_holdings) {
        this.Name = Rich_Name;
        this.holdings = Rich_holdings;
        this.Alive = 1;
    }

    public int isAlive() {
        return (this.Alive);
    }

    public void setHoldings(double new_holdings) {
        this.holdings = new_holdings;
    }

    public double getHoldings() {
        return (this.holdings);
    }

    public String getName() {
        return (this.Name);
    }

    public void die() {
        this.Alive = 0;
    }

    public void getHeritage(double heritage) {
        this.holdings = this.holdings + heritage;
    }
}

PredecessorRichIndustrialist:

package Mortal;

import java.util.Arrays;

public class PredecessorRichIndustrialist extends RichIndustrialist {

    private static String Name;
    private static double holdings;
    private RichIndustrialist[] successors = {};
    private static int Alive;

    public PredecessorRichIndustrialist(String Rich_Name, double Rich_holdings) {
        super(Rich_Name,Rich_holdings);
    }

    public void die() {
        super.die();
    }

    public void Inheritance(double holdings, RichIndustrialist[] successors) {
        int i = 0;
        while (i < successors.length) {
            int Alive = successors[i].isAlive();
            System.out.println(Alive);
            if (Alive == 0) {
                removeSuccessor(successors[i]);
                i++;
            } else {
                i++;
            }
        }
    }

    public void addSuccessor(RichIndustrialist new_successor) {
        RichIndustrialist[] new_successors = new RichIndustrialist[successors.length + 1];
        if (successors.length == 0) {
            new_successors[0] = new_successor;
            successors = new_successors;
        } else {
            for (int i = 0; i < successors.length; i++) {
                new_successors[i] = successors[i];
            }
            new_successors[new_successors.length - 1] = new_successor;
        }
        this.successors = new_successors;
    }

    public void removeSuccessor(RichIndustrialist removed_successor) {
        RichIndustrialist[] new_successors = new RichIndustrialist[this.successors.length - 1];
        int j = 0;
        for (int i = 0; i < this.successors.length; i++) {
            if (!this.successors[i].equals(removed_successor)) {
                new_successors[j] = this.successors[i];
            } else {
                j--;
            }
            j++;
        }
    }

    public RichIndustrialist[] getSuccessors() {
        return successors;
    }
}

CrazyRichIndustrialist:

package Mortal;

import java.util.Random;

public class CrazyRichIndustrialist extends PredecessorRichIndustrialist {

    private RichIndustrialist[] successors = {};
    private static String Name;
    private static double holdings;
    private static int Alive;

    public CrazyRichIndustrialist(String Rich_Name, double Rich_holdings) {
        super(Rich_Name,Rich_holdings);
    }
    public void die() {
        super.die();
        Inheritance(getHoldings(),getSuccessors());
    }   

    public void addSuccessor(RichIndustrialist new_successor) {
        super.addSuccessor(new_successor);
    }

    public void removeSuccessor(RichIndustrialist removed_successor) {
        super.removeSuccessor(removed_successor);
    }

    public void Inheritance (double holdings , RichIndustrialist[] successors) {
        super.Inheritance(holdings, successors);
        for (int i=0; i<successors.length-1; i++)
        {
            double random = new Random().nextDouble();
            double amount = this.holdings * random;
            successors[i].getHeritage(amount);
            holdings = this.holdings - amount;
        }
        successors[successors.length-1].getHeritage(this.holdings);
        this.holdings = 0;
    }

    public String getName(){
        return super.getName();
    }
    public double getHoldings(){
        return super.getHoldings();
    }
    public RichIndustrialist[] getSuccessors(){
        return super.getSuccessors();
    }
    public void setHoldings(double new_holdings){
        super.setHoldings(new_holdings);
    }
    public int isAlive() {
        return super.isAlive();
    }
    public void getHeritage(double heritage) {
        super.getHeritage(heritage);
    }

}
4

4 に答える 4

7

あなたのフィールドのほとんどはstatic. つまり、クラスのすべてのインスタンスが同じ値を共有するということです。コンストラクターを呼び出すと、静的フィールドが変更され、既存のすべてのインスタンスに影響します。

例えば:

this.Name = Rich_Name;

実際に書かれているはずです:

RichIndustrialist.Name = Rich_Name;

このチュートリアルでは、インスタンスとクラス (または静的) メンバーの違いについて読むことができます。

于 2012-12-20T10:04:07.330 に答える
6

次のフィールドは、非静的として宣言する必要があります。これらのフィールドが静的として宣言されると、各RichIndustrialistインスタンスはこれらのフィールドと割り当てられた値を共有します。それらを非静的として宣言すると、各RichIndustrialistインスタンスがこれらのフィールドの独自のコピーを持つことができます。これは、の他のインスタンスから自律的ですRichIndustrialist

private String Name;
private double holdings;
private int Alive;

これは、Javaチュートリアルからの静的の良い説明です

すべてのオブジェクトに共通の変数が必要な場合があります。これは、静的修飾子を使用して実行されます。宣言に静的修飾子が含まれているフィールドは、静的フィールドまたはクラス変数と呼ばれます。それらは、オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の1つの固定された場所にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。

于 2012-12-20T10:04:16.113 に答える
3

プロパティ/変数は静的です。静的変数はすべてのオブジェクト間で共有されていることがわかっています。

これが、最後のオブジェクトが変数の既存の値を置き換える理由です。

提案:

静的修飾子をインスタンス修飾子に変更します

から

private static String Name;
private static double holdings;
private static int Alive;

private String Name;
private double holdings;
private int Alive;

あなたの問題は解決すると確信しています。

于 2012-12-20T10:12:43.827 に答える
2

Nameすべてのクラスでメンバーフィールドを宣言しているので、-classでのみ宣言しsuper、他のsub-classesに(再)使用させる必要があります。

さらに、フィールドをとして宣言しましたstatic。クラスのすべてのインスタンスが同じフィールドを使用しますが、これはおそらく意図したものではないため、そのstatic部分を削除してください。

他のすべてのメンバーフィールドについても同じことが言えます。

:メンバーフィールドを大文字で開始しないでください:Nameとして定義して使用する必要がありますname。一方、クラス名は大文字で始める必要があります。これは一般的に受け入れられているJava規則であり、物事をより明確/分離します。

于 2012-12-20T10:05:08.650 に答える