【问题标题】:Passing values from one nonstatic method to another from main?将值从一个非静态方法传递到另一个从主方法?
【发布时间】:2019-01-20 00:50:06
【问题描述】:

我在使用非静态方法时遇到问题。我试图从一个方法中获取我的“side”变量的值,并将它们插入另一个计算面积的方法中。有没有办法在不将方法更改为静态的情况下做到这一点?这里之前回答的问题都没有帮助,我的教科书也没有。

import java.util.*;
public class CubeVolume
{
    int side1;
    int side2;
    int side3;

public void getSides()
{
    Scanner input = new Scanner(System.in);
    System.out.println("Enter the length of side1");
    side1 = input.nextInt();
    System.out.println("Enter the length of side2");
    side2 = input.nextInt();
    System.out.println("Enter the length of side3");
    side3 = input.nextInt();
}

public int getVolume(int side1, int side2, int side3)
{
    int volume = side1 * side2 * side3;
    return volume;
}
public static void main(String[] args)
{
    CubeVolume cube = new CubeVolume();
    cube.getSides();
    cube.getVolume(side1, side2, side3);
 }
}

我认为问题出在我的方法调用 cube.getVolume(side1, side2, side3);因为编译器告诉我不能从静态上下文中引用非静态变量。

【问题讨论】:

    标签: java methods static non-static


    【解决方案1】:

    如果您想在 ma​​in() 中使用方法,那么这些方法必须是 static,因为 ma​​in() 是静态的。所以你的方法应该声明为:

    public static void getSides() { .... }
    public static int getVolume(int side1, int side2, int side3) { .... }
    

    但是,如果你告诉你的类的一个实例从你的 main() 方法中的一个非静态方法开始,你可以避免这一切:

    public static void main(String[] args) {
        new CubeVolume().startApp(args);
    }
    
    private void startApp(String[] args) {
        CubeVolume cube = new CubeVolume();
        cube.getSides();
        cube.getVolume(side1, side2, side3);
    }
    

    现在类中的其他方法不需要是静态的,因为您不是从 static main() 调用它们。

    【讨论】:

      【解决方案2】:

      getVolume()不需要传入任何参数,使用类变量即可:

      import java.util.Scanner;
      
      class CubeVolume {
          private int side1;
          private int side2;
          private int side3;
      
          private void getSides() {
              Scanner input = new Scanner(System.in);
              System.out.print("Enter the length of side1: ");
              side1 = input.nextInt();
              System.out.print("Enter the length of side2: ");
              side2 = input.nextInt();
              System.out.print("Enter the length of side3: ");
              side3 = input.nextInt();
              input.close();
          }
      
          private int getVolume() {
              return side1 * side2 * side3;
          }
      
          private void printAppTitle() {
              System.out.println("Cube Volume Calculator");
              System.out.println("======================");
          }
      
          public static void main(String[] args) {
              CubeVolume cube = new CubeVolume();
              cube.printAppTitle();
              cube.getSides();
              String cubeVolumeString = String.valueOf(cube.getVolume());
              System.out.println("The cubes volume is: " + cubeVolumeString);
          }
      }
      

      示例用法:

      Cube Volume Calculator
      ======================
      Enter the length of side1: 3
      Enter the length of side2: 4
      Enter the length of side3: 5
      The cube's volume is: 60
      

      将边长存储在double 数组sides 中并处理getSides() 中可能的无效输入的替代方法:

      import java.util.Scanner;
      
      class CubeVolume {
        private double[] sides;
      
        CubeVolume() {
          sides = new double[3];
        }
      
        private void getSides() {
          Scanner scanner = new Scanner(System.in);
          int currentSide = 0;
          while (currentSide < sides.length) {
            System.out.printf("Enter the length of side %d: ", currentSide + 1);
            double nextSide = 0.0;
            input:
            while (scanner.hasNext()) {
              if (scanner.hasNextDouble()){
                nextSide = scanner.nextDouble();
                if (nextSide > 0) {
                  sides[currentSide] = nextSide;
                  break input;
                } else {
                  System.out.println("ERROR: Input number was too small.");
                  System.out.printf("Enter the length of side %d: ", currentSide + 1);
                }
              } else {
                System.out.println("ERROR: Invalid input, please input a number.");
                System.out.printf("Enter the length of side %d: ", currentSide + 1);
                scanner.next();
              }
            }
            currentSide++;
          }
          scanner.close();
        }
      
        private double getVolume() {
          return sides[0] * sides[1] * sides[2];
        }
      
        private void printAppTitle() {
          System.out.println("Cube Volume Calculator");
          System.out.println("======================");
        }
      
        public static void main(String[] args) {
          CubeVolume cube = new CubeVolume();
          cube.printAppTitle();
          cube.getSides();
          String cubeVolumeString = String.format("%.2f", cube.getVolume());
          System.out.println("The cube's volume is: " + cubeVolumeString);
        }
      }
      

      示例用法 2:

      Cube Volume Calculator
      ======================
      Enter the length of side 1: a
      ERROR: Invalid input, please input a number.
      Enter the length of side 1: -1.1
      ERROR: Input number was too small.
      Enter the length of side 1: 3.4
      Enter the length of side 2: 4.7
      Enter the length of side 3: 5.8
      The cube's volume is: 92.68
      

      【讨论】:

        【解决方案3】:

        您不需要传递边参数来获取值函数,因为您的边变量将可用于获取值函数。

        【讨论】:

          猜你喜欢
          • 2019-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-31
          • 1970-01-01
          • 1970-01-01
          • 2018-11-16
          相关资源
          最近更新 更多