0

我需要在一个类中创建一个最终字符串并从一个方法中对其进行初始化,我在互联网上搜索了一些人说它可能有人说不是!
我忽略了这一点,在接受的答案中,他说构造函数有可能对非构造函数方法只字未提

但是,如果您删除静态,您可以这样做:

class A  {    
    private final int x;

    public A()
    {
        x = 5;
    } }

就我而言,在 Android 中我想这样做

public class MyActivity extends Activity
{
    final String DOWNLOADS_FOLDER_PATH;
    @Override
    public void onCreate(Bundle savedInstanceState)
    { ....

   DOWNLOADS_FOLDER_PATH=Environment.getExternalStorageDirectory().getPath()+"/downloads/";
    // i cant do that neither
    // DOWNLOADS_FOLDER_PATH="s";
    }
}

我需要从一个方法初始化,因为我有一个调用

Environment.getExternalStorageDirectory().getPath()

任何想法?

4

4 回答 4

5

为什么不能立即初始化?getExternalStorageDirectory是静态方法,所以:

static final String DOWNLOADS_FOLDER_PATH = Environment.getExternalStorageDirectory().getPath() + "/downloads/";
于 2013-09-10T11:48:58.700 回答
4

您不能从方法初始化最终变量 - 只有构造函数和初始化程序块。这样做的原因是变量在其所属对象的整个生命周期内不得更改其值('final' 关键字背后的含义)。

如果您可以使用普通方法对其进行初始化,让我们在对象创建和使用过程中分析最终变量的值:

  1. 对象被创建,final成员的值没有初始化,所以为null;
  2. 构造函数返回,对象被其余代码使用。最终变量也被使用。
  3. 您调用一个将值分配给最终成员的方法。最终值有效地改变了。
于 2013-09-10T11:45:08.380 回答
0

您也可以使用构造函数

public class MyActivity extends Activity
{
    final String DOWNLOADS_FOLDER_PATH;

    // constructor
    MyActivity(){
       super();
       DOWNLOADS_FOLDER_PATH=Environment.getExternalStorageDirectory().getPath()+"/downloads/";
    } 

    @Override
    public void onCreate(Bundle savedInstanceState)
    { ....

    }
}
于 2013-09-10T11:50:22.837 回答
0

来自 JLS:

最终变量只能分配一次。

但是在这里,如果您在构造函数以外的任何方法中为最终变量分配一个值,那么它可能会被重新分配。这就是为什么除了构造函数之外的方法中不允许分配最终变量的原因。

构造函数确保为每个新的最终变量完成分配。

于 2013-09-10T11:56:07.023 回答