Java类继承组织

时间:2012-11-02 00:12:43

标签: java class inheritance

我很难找到我需要的东西,并弄清楚如何要求它所以请考虑一下:

public class Environment {
    int x = 0;
    int y = 0;
    Operations op = new Operations();

    public Environment(){
        Operations.changeSuper();
    }
}

public class Operations extends Environment {
    public void changeSuper(){
        x++;
        y--;
    }
}

这是我已经尝试过的简单表示。但是我不认为初始化环境中的操作是正确的,因为它会导致构造函数循环。但是,如果我不这样做,那么当我尝试调用changeSuper()时,我会得到空指针。

这是使用扩展的正确方法吗?是否有更好的方法从类文件中抽象出方法。

长话短说,我想从类文件中移出方法,但仍允许它们影响它的局部变量

4 个答案:

答案 0 :(得分:2)

Environment不是Operations ..所以不。 听起来你需要合成。你应该让你的课程Operation不是Operations

所以有这样的事情:

public class Environment {
    int x = 0;
    int y = 0;
    Operation op ;

    public Environment(){
         op=new Operation(this);

    }

    public void changeEnvironment() {}
    public void incrementX(){}
    public void incrementY() {}
}

public class Operation   {
    Environment e;
    public Operation(Environment e){
        this.e = e;
        e.incrementX();
        e.decrementY();
    }
    public void changeEnvironment()
    {   
       e.changeEnvironment() ;
    }
}

如果更改仅在Environment中完成,那么它可以使维护更容易,同时也可以保留封装。

答案 1 :(得分:1)

您不能通过继承在超类中引用子类Operations。相反,将Environment设为抽象类,并将changeSuper定义为抽象方法,如下所示:

 public abstract class Environment {
    int x = 0;
    int y = 0;
    public abstract void changeSuper();

    public Environment(){
     changeSuper();
    }
  }

然后定义Operations类以扩展Environment并实施changeSuper()方法,如下所示:

  public class Operations  extends Environment {
     @Override
     public void changeSuper(){
           x++;
           y--;
     }
  }

现在,如果您在main类中创建Operations方法:

public static void main(String[] args) {
    Environment env = new Operations();
    System.out.println("x="+env.x+"&y="+env.y);//<- it will print x=-1&y=-1
}

答案 2 :(得分:0)

我相信changeSuper应该是静态的。

答案 3 :(得分:0)

我认为你不希望操作同时

  • 环境的子类型和

  • 环境

  • 的实例变量

如果Environment是操作的超类型 - 它们将自动共享非私有实例变量(无需一个调用另一个)。 如果不是超类型,则通过直接访问实例变量来破坏封装是不好的做法。

试试这个:

public class Environment {
    int x = 0;
    int y = 0;

    public Environment(){
    }
}

and:

public class Operations extends Environment {
    public void changeState(){
        x++;
        y--;
    }
}

and:

public class MasterControl {
   Operations op = new Operations();
   op.changeState();
}

<强>替代地

public class Environment {
    int x = 0;
    int y = 0;
    Operations op = new Operations();

    public Environment(){
        op.changeState();
    }

    public int getX() {return x;}
    public setX(int x) {this.x = x;}
    public int getY() {return y;}
    public setY(int x) {this.y = y;}

}

public class Operations {
    public void changeState(Environment env){
        env.setX(env.getX+1);
        env.setY(env.getY-1);
    }
}

此处环境负责存储环境状态并使其可用于其他对象。这里,Operations正在进行专业操作以修改环境状态。

凯?