Java:使用以前方法中构造的对象

Java:使用以前方法中构造的对象,java,oop,Java,Oop,我正在创建一个程序,其中包含一个Count对象以及某些相关字段和方法 在程序中,Count对象在setupCounter方法中初始化,而其方法实际用于counterControl方法 但是,当我尝试调用之前在setupCounter方法中初始化的Count实例时,我被告知无法解析Count,因此我假设创建的Count实例只有一个局部范围 有人知道如何克服反实例范围不足的问题吗?下面是我的代码: import java.util.Scanner; public class Main { s

我正在创建一个程序,其中包含一个Count对象以及某些相关字段和方法

在程序中,Count对象在setupCounter方法中初始化,而其方法实际用于counterControl方法

但是,当我尝试调用之前在setupCounter方法中初始化的Count实例时,我被告知无法解析Count,因此我假设创建的Count实例只有一个局部范围

有人知道如何克服反实例范围不足的问题吗?下面是我的代码:

import java.util.Scanner;

public class Main {

  static Scanner in = new Scanner(System.in);

  public static void main(String[] args) {
    setupCounter();
    for (;;) {
      counterControl();
    }

  }

  public static void setupCounter() {
    int startVal;
    int incrementVal;

    System.out.println("Please enter the starting value of the counter:");
    startVal = in.nextInt();
    System.out.println("Please enter the increment/decrement amount on the counter:");
    incrementVal = in.nextInt();

    Count count = new Count(startVal, incrementVal);
  }

  public static void counterControl() {
    String control;

    System.out.println("The following controls can be applied to the counter:");
    System.out.println("Increment - i");
    System.out.println("Decrement - d");
    System.out.println("Exit - x");

    control = in.nextLine();

    switch (control) {
      case "i":
        count.increment();
        break;
      case "d":
        count.decrement();
        break;
      case "x":
        System.exit(0);
        break;
    }
  }
}

谢谢。

您的函数没有返回任何内容。您必须在函数末尾使用return关键字,以便它传递它

public static void main(String[] args) {
    Count counter = setupCounter();
    //now you can refer to counter

....

  public static Count setupCounter() {
    int startVal;
    int incrementVal;

    System.out.println("Please enter the starting value of the counter:");
    startVal = in.nextInt();
    System.out.println("Please enter the increment/decrement amount on the counter:");
    incrementVal = in.nextInt();

    return new Count(startVal, incrementVal);
  }
如果它是一个void函数,它不会返回/传递任何内容,因此使用void这个词

编辑:您可能还知道,您正在将该函数用作静态函数。请进一步了解静态函数及其用途,以便更好地理解


编辑2:如果返回的是计数类型的数据,则应将void和static替换为计数

如果代码中有各种损坏的内容。我已经为您创建了count类,我认为您缺少它。把你的方法修好一点

import java.util.Scanner;

public class Main2 {

    static Scanner in = new Scanner(System.in);

    public static void main(String[] args) {
        Count count = setupCounter();
        for (;;) {
            counterControl(count);
        }

    }

    public static Count setupCounter() {
        int startVal;
        int incrementVal;

        System.out.println("Please enter the starting value of the counter:");
        startVal = in.nextInt();
        System.out.println("Please enter the increment/decrement amount on the counter:");
        incrementVal = in.nextInt();

        return new Count(startVal, incrementVal);
    }

    public static void counterControl(Count count) {
        String control;

        System.out.println("The following controls can be applied to the counter:");
        System.out.println("Increment - i");
        System.out.println("Decrement - d");
        System.out.println("Exit - x");

        control = in.nextLine();
        System.out.println(count.getVal());

        switch (control) {
            case "i":
                count.increment();
                break;
            case "d":
                count.decrement();
                break;
            case "x":
                System.exit(0);
                break;
        }
    }

    private static class Count {

    private int startVal, incrementVal;
    private Count(int startVal, int incrementVal) {
        this.startVal = startVal;
        this.incrementVal = incrementVal;
    }

    private void increment() {
        this.startVal += this.incrementVal;
    }

    private void decrement() {
        this.startVal -= this.incrementVal;
    }
    private int getVal(){
        return val;
    }
    }
}
或者你也可以这样做。。。这更像是你想做的,但不像java那么好

import java.util.Scanner;

public class Main2 {

    static Scanner in = new Scanner(System.in);
    private static Count count;
    public static void main(String[] args) {
        setupCounter();
        for (;;) {
            counterControl();
        }

    }

    public static void setupCounter() {
        int startVal;
        int incrementVal;

        System.out.println("Please enter the starting value of the counter:");
        startVal = in.nextInt();
        System.out.println("Please enter the increment/decrement amount on the counter:");
        incrementVal = in.nextInt();

        count = new Count(startVal, incrementVal);
    }

    public static void counterControl() {
        String control;

        System.out.println("The following controls can be applied to the counter:");
        System.out.println("Increment - i");
        System.out.println("Decrement - d");
        System.out.println("Exit - x");

        control = in.nextLine();

        System.out.println(count.getVal());
        switch (control) {
            case "i":
                count.increment();
                break;
            case "d":
                count.decrement();
                break;
            case "x":
                System.exit(0);
                break;
        }
    }

    private static class Count {

        private int val, incrementVal;
        private Count(int startVal, int incrementVal) {
            this.val = startVal;
            this.incrementVal = incrementVal;
        }

        private void increment() {
            this.val += this.incrementVal;
        }

        private void decrement() {
            this.val -= this.incrementVal;
        }
        private int getVal(){
            return val;
        }
    }
}

前面的答案很接近。Amir只是忘记了将setupCounter的方法签名从返回void更改为Count

基本上,您只需要有一个静态变量来保持对您创建的Count对象的引用。为什么它需要是静态的?因为使用它的方法(如计数器控制)是静态的

public class Main {
  static Count count;

  ....

  public static void main(String[] args) {
    count = setupCounter();
    for (;;) {
      counterControl();
    }

  }

  public static Count setupCounter() {
    ...    
    return new Count(startVal, incrementVal);
  }