将类A设置值的值从A类获取到B-并将值从B类返回到A.

时间:2014-02-17 14:27:07

标签: java pass-by-reference pass-by-value

我正在努力学习这个获取价值 - 设定价值 - 从编码风格中返回价值。我听说这是一种“通过价值或参考”的问题,做了我的研究,仍然坚持这个问题。无论如何,这是我的源代码:

System.out.println(x);
int x = object2.getX(); **//I HAVE A PROBLEM HERE** 
int x2 = rand.nextInt(100);
int y = rand.nextInt(100);
int xpost = rand.nextInt(300);
int ypost = rand.nextInt(150);
allField[x] = new JTextField(String.format("        %s + %s", x2 , y));
allField[x].setBounds(xpost, ypost, 100, 30);
allField[x].setEnabled(false);
add(allField[x]);
object2.setX(x++); **//I HAVE A PROBLEM HERE TOO**

我试图通过object2.getX()获取另一个类的值;从那里它将设置数组的索引。完成数组的设置后,仍然为0,我想增加它(x ++),并将该值传递给另一个类并设置它。

这是另一个类:

public class TimerTutorial extends JFrame {
    JLabel promptLabel, timerLabel;
    int counter, x = 0;
    int changeTest;
    JTextField tf;
    JButton button;
    Timer timer;

    public int getX(){**//I HAVE A PROBLEM HERE**
        return x;
    }
    public int setX(int y){**//I HAVE A PROBLEM HERE**
        x = y;
        return this.x;
    }
}

如果您需要整个代码,但问题在此之前说明:

import java.awt.event.*;
import java.awt.*;
import java.util.Random;
import javax.swing.*;

public class TimerTutorial extends JFrame{
    JLabel promptLabel, timerLabel;
    int counter, x = 0;
    int changeTest;
    JTextField tf;
    JButton button;
    Timer timer;

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


    public TimerTutorial(){
        setLayout(new GridLayout(2,2,5,5));

        tf = new JTextField();
        add(tf);

        promptLabel = new JLabel("Enter seconds:", SwingConstants.CENTER);
        add(promptLabel);

        button = new JButton("Start Timing");
        add(button);

        timerLabel = new JLabel("Waiting...", SwingConstants.CENTER);
        add(timerLabel);

        event e = new event();
        button.addActionListener(e);
    }
    public class event implements ActionListener{
        public void actionPerformed(ActionEvent e){
            int count = (int)(Double.parseDouble(tf.getText()));
            timerLabel.setText("Time left:" +count);

            TimeClass tc = new TimeClass(count);
            timer = new Timer(1000, tc);
            timer.start();
        }
    public class TimeClass implements ActionListener{
        int counter;

        public TimeClass(int counter){
            this.counter = counter;
        }

        public void actionPerformed(ActionEvent tc){//every time timer updates this will spark
            counter--;
            JTextField[] allField = new JTextField [20];
            TimerTutorial object2 = new TimerTutorial();
            Random rand = new Random();
            System.out.println(x);
            int x = object2.getX();
            int x2 = rand.nextInt(100);int y = rand.nextInt(100);
            int xpost = rand.nextInt(300); int ypost = rand.nextInt(150);
            allField[x] = new JTextField(String.format("        %s + %s", x2 , y));
            allField[x].setBounds(xpost, ypost, 100, 30);
            allField[x].setEnabled(false);
            add(allField[x]);
            object2.setX(x++);
            if(counter>=1) {
                timerLabel.setText("Time left: "+counter);
            } else {
                timer.stop();
                timerLabel.setText("Done!");
                Toolkit.getDefaultToolkit().beep();
            }
        }
    }
    }
    public static void main(String args[]){
        TimerTutorial gui = new TimerTutorial();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(800,800);
        gui.setVisible(true);
    }
}

实际上代码工作正常。我的目标是以秒为间隔随机发布JTextFields,其中包含随机位置和值。这里的问题是x不会增加。这使我的JTextFields索引[0]。 PS:还是Java的新手,任何提示都将不胜感激

2 个答案:

答案 0 :(得分:0)

您的问题是类和类实例的混淆。此外,传递价值意味着什么。你不会将值传递给类或实例,只是传递给方法

你有actionPerformed方法:

TimerTutorial object2 = new TimerTutorial();
...
int x = object2.getX();
...
object2.setX(x++);

(遗漏代码与标有...的问题无关) 第一个创建一个新的(!)对象TimerTutorial。下一个从这个新对象获取一些数据,但因为它是新的并且没有在中间更改,所以在actionPerformed方法的每次运行中它都是相同的值。

最后一次setX调用是荒谬的,因为object2很快会被垃圾收集,所以设置一个值是没有意义的。顺便说一下,你设置的值和以前一样。

注意:我没有解释post / pre递增/递减运算符。 除非你100%理解它们,否则不要使用它们!!!!

<强>从不

<强>自从

对于您还不了解的所有其他语言结构也是如此。

答案 1 :(得分:-1)

问题1

您的第一个问题在于您使用++运算符:

object2.setX(x++);

这里发生的是x的值作为参数传递给setX()并随后递增。一般来说,x++会增加x,但语句的值仍然是旧的x

int x = 0;
System.out.println(x++); // 0
System.out.println(x);   // 1

您可以使用++xx+1来避免这种情况。

问题2

修复++运算符的使用对您没有多大帮助,因为每次执行动作侦听器方法时都会创建一个新的TimerTutorial对象。

public void actionPerformed(ActionEvent tc){
    ...
    TimerTutorial object2 = new TimerTutorial(); //new object is create which initializes it's instance variable x to 0
    ...
    int x = object2.getX(); //returns the instance variable x of object2 which is 0
    ...
    object2.setX(x++); //explained in problem 1
    //After here object2 is never used again in this method
    ...
} //at the end of the method, the scope of the variable object2 ends and the object it points to will be garbage collected

我希望您现在每次执行动作侦听器时都能看到x0。如果要保留对象及其在另一个范围内的状态,则必须在该范围内声明该变量。在您的情况下,动作侦听器已经是TimerTutorial的内部类,因此您甚至可能不需要新的TimerTutorial对象。你可以使用外部类。我仍然不确定你的计划应该达到什么目标,但我认为这将是最佳选择:

public void actionPerformed(ActionEvent tc){
    ...
    //TimerTutorial object2 = new TimerTutorial(); <= not needed
    ...
    int x = getX(); //returns the instance variable x of the outer class
    ...
    setX(x+1); //sets the instance variable x of the outer class
    ...
} //next time this method is called, the state of x will be preserved in the outer class