在 Java 中返回字符串方法?

Returning String Methods in Java?

我正在开始编程 class,直到现在,我们已经开始使用方法,但我不完全确定我是否理解其中的很多内容对我来说很有意义"static," "void," 和 "return" 语句。

特别是对于这个作业,我以为我已经弄清楚了,但它在 main 方法的行上说了 "can not find symbol histogram",尽管我显然是从另一个方法返回它。任何人都可以帮助我吗?

作业:“您发现在编写程序时可能经常需要直方图,因此您决定让此程序使用您的程序 310a2 直方图。您可以添加到此程序或将其用作 class。您还将编写一个 class(或方法)来生成各种范围内的随机数。您可能希望星号代表不同的值(1、100 或 1000 个单位)。您可能还希望使用星号以外的字符,例如 $ 来表示图表的单位。运行 程序有足够的次数来说明程序的各种能力。

需要的陈述:输出、循环控制、决策、class(可选)、方法。

示例输出:

10 月份的销售额

日日销量图表

2 37081 *************************************

3 28355 ****************************

4 39158 ******************************************

5 24904 ************************

6 28879 ****************************

7 13348 ************* “

这是我拥有的:

import java.util.Random;

public class prog310t
{ 
  public static int randInt(int randomNum) //determines the random value for the day
  {   
    Random rand = new Random();

    randomNum = rand.nextInt((40000 - 1000) + 1) + 10000;

    return randomNum;
  }

  public String histogram (int randomNum) //creates the histogram string
  {
    String histogram = "";
    int roundedRandom = (randomNum/1000);
    int ceiling = roundedRandom;
    for (int k = 1; k < ceiling; k++)
    {
      histogram = histogram + "*";
    }

    return histogram;   
  }

  public void main(String[] Args)
  {
    System.out.println("Sales for October\n");

    System.out.println("Day        Daily          Sales Graph");

    for (int k = 2; k < 31; k++)
    {
      if (k == 8 || k == 15 || k == 22 || k == 29)
      {
        k++;
      }

      System.out.print(k + "         ");

      int randomNum = 0;

      randInt(randomNum);

      System.out.print(randomNum + "       ");

      histogram (randomNum);

      System.out.print(histogram + "\n");
    }
  }
}

编辑:谢谢你们,现在我明白了静态的意思了。现在我有一个新问题;程序运行,但直方图返回为空。有人可以帮我理解为什么吗?新代码:

import java.util.Random;

public class prog310t
{ 
  public static int randInt(int randomNum) //determines the random value for the day
  {   
    Random rand = new Random();

    randomNum = rand.nextInt((40000 - 1000) + 1) + 10000;

    return randomNum;
  }

  public static String histogram (int marketValue) //creates the histogram string
  {
    String histogram = "";
    int roundedRandom = (marketValue/1000);
    int ceiling = roundedRandom;
    for (int k = 1; k < ceiling; k++)
    {
      histogram = histogram + "*";
    }

    return histogram;   
  }

  public static void main(String[] Args)
  {
    System.out.println("Sales for October\n");

    System.out.println("Day        Daily          Sales Graph");

    for (int k = 2; k < 31; k++)
    {
      if (k == 8 || k == 15 || k == 22 || k == 29)
      {
        k++;
      }

      System.out.print(k + "         ");

      int randomNum = 0;

      int marketValue = randInt(randomNum);

      System.out.print(marketValue + "       ");

      String newHistogram = histogram (randomNum);

      System.out.print(newHistogram + "\n");
    }
  }


}

在调用 histogrom (randomNum) 之前,您需要将直方图设为静态或将具有直方图的对象声明为方法

例如

prog310t myClass = new prog310t();

myClass.histogram()

你是对的,你的问题根源于不理解 static。这方面有很多资源,但在这里足以说明 static 属于 Class 而不是静态的属于特定 实例。也就是说

public class A{
    public static int b;

    public int x;
    public int doStuff(){
        return x;
    }

    public static void main(String[] args){
        System.out.println(b); //Valid. Who's b? A (the class we are in)'s b.
        System.out.println(x); //Error. Who's x? no instance provided, so we don't know.
        doStuff(); //Error. Who are we calling doStuff() on? Which instance?

        A a = new A();
        System.out.println(a.x); //Valid. Who's x? a (an instance of A)'s x.
    }
}

与您的方法 histogram 不是 static 相关,因此您需要一个实例来调用它。你不应该需要一个实例;只需将方法设为静态即可:

public String histogram(int randomNum) 更改为 public static String histogram(int randomNum)

完成后,行 histogram(randomNum); 生效。但是,您仍然会在 System.out.print(histogram + "\n"); 上遇到错误,因为此处定义的 histogram 是函数,而不是变量。这与 return 语句有关。当显示 return x(对于 x 的任何值)时,它表示终止当前方法调用并将值 x 交给调用该方法的任何人。

例如,考虑表达式 2 + 3。如果你说 int x = 2 + 3,你会期望 x 之后有值 5。现在考虑一个方法:

public static int plus(int a, int b){
    return a + b;
}

和语句:int x = plus(2, 3);。同样在这里,我们希望 x 之后具有值 5。计算完成,等待该值(int 类型)的人接收并使用该值,但是将使用该类型的单个值代替它。例如:

int x = plus(plus(1,2),plus(3,plus(4,1)); -> x 的值为 11。

回到您的示例:您需要为从 histogram(randomNum); 返回的字符串值分配一个变量,例如:

histogram(randomNum) 更改为 String s = histogram(randomNum)

这将使所有编译通过,但您将遇到最后一个障碍:这东西不会 运行!这是因为 运行nable main 方法需要是静态的。因此,将您的主要方法更改为具有签名:

public static void main(String[] args){...}

然后点击绿色按钮!

对于初学者,您的主要方法应该是静态的:

public static void main(String[] Args)

没有实例就无法调用实例方法 class 它们属于可以在没有实例的情况下调用静态方法的地方。因此,如果您想在 main 方法中调用其他方法,它们也必须是静态的,除非您创建一个 prog310t 类型的对象,然后使用该对象调用方法示例:

public static void main(String[] Args)
{
     prog310t test = new prog310t();
     test.histogram(1);
}

但在您的情况下,您可能想要这样做:

public static String histogram (int randomNum)

public static void main(String[] Args)
{
     histogram(1);
}

此外,您没有在主方法中捕获 histogram() 方法的 return,您应该这样做:

  System.out.print(histogram(randomNum) + "\n");

String test = histogram(randomNum);
System.out.print(test + "\n");

静态方法是 class 的一部分,可以在没有实例的情况下调用,但实例方法只能从实例示例中调用:

public class Test
{
    public static void main(String[] args)
    {
        getNothingStatic();// this is ok
        getNothing(); // THIS IS NOT OK IT WON'T WORK NEEDS AN INSTANCE
        Test test = new Test();
        test.getNothing(); // this is ok
        getString(); // this is ok but you are not capturing the return value
        String myString = getString(); // now the return string is stored in myString for later use
    }
    public void getNothing()
    {
    }
    public static void getNothingStatic()
    {
    }
    public static String getString()
    {
        return "hello";
    }
}

Void 表示该方法没有 returning 任何东西,它只是在做一些处理。您可以 return 基本类型或对象类型代替 void,但在您的方法中,如果您不使用 void,则必须指定 return。