Java 如何使变量可由其他方法使用

Java 如何使变量可由其他方法使用,java,swing,variables,static,localdate,Java,Swing,Variables,Static,Localdate,我正在尝试制作一个程序,计算从今天到出生日期之间的天数(好吧,我还在学习,所以这个想法不是很好)。 该程序从键盘上获取用户写入的日期,并计算差值,然后输出。我已经做了一个getdifference方法来计算它 问题是,我需要一个日、月和年的变量(由用户输入),稍后由getdifference方法使用。 我知道,方法中的变量是局部变量,所以eclipse告诉我将它们转换为静态变量——我想这不是最好的主意,因为它们(至少我认为是这样)是作为默认值启动的,答案总是0 问题是——如何才能生成一个非静态的

我正在尝试制作一个程序,计算从今天到出生日期之间的天数(好吧,我还在学习,所以这个想法不是很好)。 该程序从键盘上获取用户写入的日期,并计算差值,然后输出。我已经做了一个getdifference方法来计算它

问题是,我需要一个日、月和年的变量(由用户输入),稍后由getdifference方法使用。 我知道,方法中的变量是局部变量,所以eclipse告诉我将它们转换为静态变量——我想这不是最好的主意,因为它们(至少我认为是这样)是作为默认值启动的,答案总是0

问题是——如何才能生成一个非静态的、可以在方法中使用的值?我曾经尝试过二传手和接球手,但我认为这可能是一种更简单的方法,只是找不到。我不久前就开始编写代码了,所以任何指导和提示都将不胜感激,因为老实说,我不认识任何java开发人员,所以不能只给别人我的代码检查

public class HowManyDaysTest {


     static String yearinStr;
     static String monthinStr;
     static String dayinStr;
     static String strLong;
     static long daysBetween;
     Temporal birthday;

     public void getDifference() {
     LocalDate today = LocalDate.now();
     try{

     birthday = LocalDate.of(Integer.valueOf(dayinStr),Integer.valueOf(monthinStr), Integer.valueOf(yearinStr)); 
     }
     catch(NumberFormatException ex) {
         System.out.println("Error");
     }
     try{
     daysBetween = ChronoUnit.DAYS.between(birthday, today); }

     catch(NullPointerException e) {
     System.out.println("Error"); }
     strLong = Long.toString(daysBetween);
     System.out.println(strLong);
     System.out.println(daysBetween);
     System.out.println(birthday);
     }


public HowManyDaysTest() {

    JFrame frame= new JFrame("How many days?");
    JLabel question= new JLabel("Please enter your date of birth");
    JTextField d = new JTextField("DD");
    JTextField m = new JTextField("MM");
    JTextField y = new JTextField("YYYY");
    JLabel ans= new JLabel();
    frame.setVisible(true);
    frame.setSize(500, 500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());
    frame.add(question,BorderLayout.NORTH);
    frame.add(d,BorderLayout.WEST);
    frame.add(m,BorderLayout.CENTER);
    frame.add(y,BorderLayout.EAST);
    frame.add(ans,BorderLayout.SOUTH);

    d.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent arg0) {
            d.setText("");

        }

        @Override
        public void focusLost(FocusEvent e) {
            // TODO Auto-generated method stub

        }

    });

    m.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent arg0) {
            m.setText("");

        }

        @Override
        public void focusLost(FocusEvent e) {
            // TODO Auto-generated method stub

        }

    });
    y.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent arg0) {
            y.setText("");

        }

        @Override
        public void focusLost(FocusEvent e) {
            // TODO Auto-generated method stub

        }

    });
    d.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            dayinStr = d.getText();
            Integer.parseInt(dayinStr);

        }

    });
    m.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            monthinStr = m.getText();


        }

    });
    y.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            yearinStr = y.getText();
            odp.setText(strLong);

        }

    });


}



public static void main(String[] args) {

    HowManyDaysTest app = new HowManyDaysTest();
    app.getDifference();

}

}

将日、月和年文本字段声明为实例变量,并在
getDifference()中访问它们。

将日、月和年文本字段声明为实例变量,并在
getDifference()中访问它们
method.

不使用静态方法,而是将它们定义为private并生成setter和getter。
LocalDate.of()
的参数顺序为年、月、月中日。你不小心把它们放在了另一边。@ΦXocę웃Пepeúpaツ, 虽然我一般都赞成GETTER和SETTER,但我认为它们对于只在同一类中使用的私有实例变量来说是多余的。我同意变量不应该是静态的。与其使用静态变量,不如将这些变量定义为私有变量,并生成setter和getter……顺便说一句,
LocalDate.of()
的参数顺序是年、月、月日。你不小心把它们放在了另一边。@ΦXocę웃Пepeúpaツ, 虽然我一般都赞成GETTER和SETTER,但我认为它们对于只在同一类中使用的私有实例变量来说是多余的。我同意变量不应该是静态的。是的,我已经这样做了(将变量更改为private而不是static),但正如我所检查的,值填充为null,getdifference()方法返回错误,因为dayinstr etc为null。填充textfield不会改变任何东西:(您在创建对象后很快调用getDifference()方法,相反,创建一个按钮并在用户单击它时调用getDifference()方法。是的,我已经这样做了(将变量更改为private而不是static),但正如我所检查的,值填充为null,getDifference()值)方法返回错误,因为dayinstr etc为null。填充textfield不会改变任何内容:(您在创建对象后立即调用getDifference()方法,而是创建一个按钮,并在用户单击它时调用getDifference()方法。