Java - 通过pass-by-value更改变量

时间:2016-01-31 01:33:51

标签: java pass-by-value

所以,我已经阅读了Java的传值特性,并且我已经尝试通过让函数再次返回变量将函数传递给函数来更改变量。我没有成功。

我的代码

public class Logic {
    private int position;

    public class Logic(){
        position = 1;
    }

    public void appendPosition(){
        position = calculatePosition(position);
    }
}

这是准系统代码。我从Logic的实例中调用此方法,该实例在另一个类中实例化:

public class MainLogic {
    ILogic L;

    public MainLogic(ILogic L){
        this.L = L;
    }

    public void start(){
        L.appendPosition();
    }
}

通过反复调试,我感到沮丧的是position变量根本没有变化。传递给position的{​​{1}}变量正如预期的那样变化很好。我错过了什么?我尝试过变量calculatePositionpublic

calculatePosition

static

3 个答案:

答案 0 :(得分:0)

public class Logic {
private int position;

public Logic(){
    position = 1;
}
//to get position.....................

public int getPosition(){
    return this.position;
}
public void appendPosition(){
    position = calculatePosition(position);
}
private int calculatePosition(int position){
    position += 6;
    if(snakeLocations[position]>0) {
        position -= 6;
    }
    else if(ladderLocations[position]>0) {
        position += 6;
    }
    return position;
}

private final int[] snakeLocations = 
        new int[] {0,0,0,0,0,0,0,0,0,9,0,0,0,13,0,0,0,0,0,19,0,0,0,0,0};
private final int[] ladderLocations = 
        new int[] {0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,15,0,0,0,0,20,0,0,0,0};
}

//next class

public class MainLogic {

Logic L;

public MainLogic(Logic L){
    this.L = L;
}

public void start(){
    L.appendPosition();
}

public static void main(String[] args) {
    Logic L = new Logic();
    MainLogic ml = new MainLogic(L);
    System.out.println(ml.L.getPosition());
    ml.start();
    System.out.println(ml.L.getPosition());
}

}

答案 1 :(得分:-1)

让我们读你的代码。

// There is a logic class.
public class Logic { 

    // So Logic has a position. it starts with zero.    
    private int position;

    // Logic also has an inner class, also called Logic.
    public class Logic(){
        position = 1;
        // When a new Logic().Logic() is created, the instance
        // variable of the parent instance gets set to one. WHAT?!?
    }
    // ... lots of code
}

所以,这有点像Yo Dawg! meme - 我听说你喜欢Logic,所以我们把一个逻辑实例放到你的Logic实例中,这样你就可以在你的逻辑中使用逻辑。

您可能需要构造函数

// So this is Logic.
public class Logic {

    private int position;

    // When an Logic instance is created, position starts with 1.
    public Logic(){
        this.position = 1;
    }

确定。所以我们不是在谈论Yo Dawg Memes。 所以让我们谈谈价值传递。

按值传递意味着课程就像非常自负的孩子:除非他们告诉你,否则你不能玩他们的玩具。

这是一个好东西®,因为这意味着只允许拥有的实例更改其私有状态。相信我,它可以防止相当多的破坏。

允许外部世界实际更改状态的一种方法是使用查询和mutator方法。回到当天,我们曾经称他们为 getter and setter ,但这听起来太简单了,所以软件架构师通常会使用更高级的术语。

但是...... 所有这些都不适用,因为在{1}}定义了逻辑。糟糕。

我们试试这个:

  1. 重命名一些实例变量
  2. 帮助调试器有点冗长。宝贝步骤。
  3. (另外,为了赞成票而放下一些笑话)。

    calculatePosition()

    所以......这有效吗?

答案 2 :(得分:-2)

我找到了答案。这通常是我在这里发布的错误。我试图尽可能地删除我的代码以减轻你们的工作量,但有时问题出在我所提供的范围之外,因为我缺乏理解或疏忽。

我实际上是从上面的两个级别调用MainLogic

public mainFrame() {
        initComponents();
        logic = Factory.getMainLogic();
    }

其中

public static class Factory {
    public MainLogic getMainLogic(){
        PlayerLogic pL = new PlayerLogic();
        ImageLogic iL = new ImageLogic();
        DieLogic dL = new DieLogic();
        MainLogic mainLogic = new MainLogic(pL,iL,dL);

        return mainLogic;
    }
}

我忘了我不小心把Factory作为static。我最诚挚地为浪费你的时间道歉。