如何在java中将字符串变量传递给新对象

如何在java中将字符串变量传递给新对象,java,Java,我是Java新手,不知道如何正确地使用它 我有一个字符串变量textMain,我想把它传递到一个新对象TextToSpeech。可能吗?如果是,怎么做 我必须在对象之外声明这个变量,不幸的是这个对象没有“看到”这个变量 String textMain = "text text"; textToSpeechSystem = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {

我是Java新手,不知道如何正确地使用它

我有一个字符串变量
textMain
,我想把它传递到一个新对象
TextToSpeech
。可能吗?如果是,怎么做

我必须在对象之外声明这个变量,不幸的是这个对象没有“看到”这个变量

String textMain = "text text";
textToSpeechSystem = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            speak(textMain); // textMain doesn't visible
        }
    }
});

很抱歉,如果我写错了什么,我还不知道正确的命名法。

要传递字符串的对象需要有一个字段来存储值

假设您有一个类TextToSpeech,其构造函数有一个字符串参数,用于在对象创建时设置值

public class TextToSpeech {
  private String textMain;
  ...

  public TextToSpeech(String text, ...) {
    textMain = text;
    ...
  }
}
或者可以使用setter方法在创建对象后设置值

public void setText(String text) {
  textMain = text;
}

这是因为
TextToSpeech.OnInitListener
textMain
在内存中的位置不同:
TextToSpeech.OnInitListener
位于堆中,在当前上下文关闭后可用,但是
textMain
位于堆栈中,在当前上下文关闭后不可用

去修理它。您只需将
textMain
移动到堆中即可

final String textMain = "text text";

在匿名类/lambda中引用局部变量时,需要将该变量声明为final(不可变)


如果您想关闭
textMain
,它需要是
final
。就是这样,太好了,非常感谢!这回答了你的问题吗?最后,正如oleg.cherednik所说,在变量
final
使用final如何使其移动到堆中之前,我添加了一个变量?即使没有final关键字,字符串对象本身也将存储在堆中,引用将存储在堆栈中。使用final可确保捕获变量后,捕获变量的值不会更改。
final String textMain = "text text";
textToSpeechSystem = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
    public void onInit(int status) {
        if (status == TextToSpeech.SUCCESS) {
            speak(textMain); // textMain doesn't visible
        }
    }
});