Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Superclass resets already active objects

Tags:

java

It's a little bit difficult but i'll try to explain my problem. I've created a program with a superclass (RichIndustrialist) two subclasses (PredecessorRichIndustrialist and another one I didn't add) and 4 subclasses to these subclasses (CrazyRichIndustrialist and another 3). Now, the program is too difficult to explain but the problem is actually simple. My constructor is in the superclass and every subclass use it to initilize. Every time I create a new subclass object like CrazyRichIndustrialist, it resets all the already existed subclasses (from any subclass) to the value of the new object. I don't know how to fix this. Thank you in advance...

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);
    }

}
like image 635
user1918284 Avatar asked Dec 02 '22 20:12

user1918284


2 Answers

Most of your fields are static. What that means is that all the instances of your classes share the same value. When you call the constructor, the static fields are modified, which affects all the existing instances.

For example:

this.Name = Rich_Name;

should actually have been written:

RichIndustrialist.Name = Rich_Name;

You can read about the difference between instance and class (or static) members in this tutorial.

like image 67
assylias Avatar answered Dec 04 '22 09:12

assylias


The following fields should be declared as non-static. When these fields are declared as static each RichIndustrialist instance will share these fields and their assigned values. Declaring them as non-static allows each RichIndustrialist instance to have its own copy of these fields, which is autonomous from the other instances of RichIndustrialist.

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

Here is a good description of static from the Java Tutorial

Sometimes, you want to have variables that are common to all objects. This is accomplished with the static modifier. Fields that have the static modifier in their declaration are called static fields or class variables. They are associated with the class, rather than with any object. Every instance of the class shares a class variable, which is in one fixed location in memory. Any object can change the value of a class variable, but class variables can also be manipulated without creating an instance of the class.

like image 21
Kevin Bowersox Avatar answered Dec 04 '22 10:12

Kevin Bowersox