Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java初学者:初始化类变量_Java_Constructor_Initialization_Declaration - Fatal编程技术网

java初学者:初始化类变量

java初学者:初始化类变量,java,constructor,initialization,declaration,Java,Constructor,Initialization,Declaration,我刚刚阅读了SUN java代码约定;非常好的文件顺便说一句,我读过这个 6.3 初始化: 尝试初始化声明的局部变量。不初始化 声明的变量是初始值是否取决于首先发生的某个计算 我想知道类变量是否有相同的建议,例如: public class NNmatrix { protected ArrayList<ArrayList<Double>> matrix; // line 1 public NNmatrix() { matrix =

我刚刚阅读了SUN java代码约定;非常好的文件顺便说一句,我读过这个

6.3 初始化: 尝试初始化声明的局部变量。不初始化 声明的变量是初始值是否取决于首先发生的某个计算

我想知道
类变量
是否有相同的建议,例如:

public class NNmatrix {

    protected ArrayList<ArrayList<Double>> matrix;     // line 1
    public NNmatrix() {
        matrix = new ArrayList<ArrayList<Double>>();     // line 2
    }
    /**
     * 
     * @param otherMtrx
     */
    public NNmatrix(final ArrayList<ArrayList<Double>> otherMtrx) {
        final int rows = otherMtrx.size();
        matrix = new ArrayList<ArrayList<Double>>(rows);  // line3
        for (int i = 0; i < rows; i++) {
            this.matrix.add(new ArrayList<Double>(otherMtrx.get(i)));
        }
    }
}
public类矩阵{
受保护的ArrayList矩阵;//第1行
公共矩阵(){
矩阵=新的ArrayList();//第2行
}
/**
* 
*@param otherMtrx
*/
公共NNmatrix(最终阵列列表其他MTRx){
final int rows=otherMtrx.size();
矩阵=新数组列表(行);//第3行
对于(int i=0;i
编辑代码#如果我要初始化变量声明的位置(在类中),我会删除“第2行”并保留“第3行”,因为性能问题#如您所知,在内存中保留(行)

问题是:

  • 这样做是一个好的实践还是初始化问题只适用于方法内部的局部变量等
  • 如果可以的话,我想知道如果我做了编辑代码#初始化@第3行还是初始化@第1行,哪一个会首先出现
  • 这些是实例变量,而不是类变量。实例变量属于特定的对象,而类变量则不属于(抱歉吹毛求疵)

    我认为在声明变量的地方初始化变量更简单,也更容易读取


    jvm开始初始化文件顶部的实例变量和实例初始值设定项块,然后向下运行,只有在初始化所有变量并运行初始值设定项块之后,jvm才会执行构造函数。

    您引用的行仅指局部变量。因为在Java中,局部变量不需要在作用域的顶部声明,而是可以在使用它们之前在任何地方声明,所以这很有意义

    对于类和实例变量,我个人的偏好是在声明变量的地方初始化变量。在许多情况下,除了默认构造函数之外,我没有任何其他构造函数,这就不需要编写默认构造函数,因为编译器会自动提供一个。我发现这会清理并缩短我的代码

    在您提供的第二个构造函数中,可以很好地说明在构造函数中初始化的情况


    对于类变量,我发现有几次我希望在实例化块中进行初始化,而不是在声明中进行内联初始化。

    您有两个不同的选项,它们可能都属于微优化。通常,除非您在并发环境中使用静态变量,或者执行类似于池类的时髦操作,否则这些类型的优化就不太重要了

  • 没有理由不能在构造函数或其他类似于所述的方法中初始化变量。就我个人而言,我更喜欢尽可能在变量声明时初始化变量

  • 根据我的理解,如果初始化发生在构造函数和at声明中,那么初始化将在大致相同的时间发生。我从来都不需要知道在实践中哪个是第一位的,但是你可以做一个简单的System.out测试来找出答案


  • 我会支持你的代码保持原样

    虽然通常我喜欢在声明时初始化实例变量,但当我必须在某些构造函数中重新初始化它们时,我不喜欢这样做。我更喜欢在声明中初始化,或者在每个构造函数路径中初始化(可能只是在每个其他构造函数调用的单个构造函数中)。纯声明表示正在发生更复杂的事情,而将最简单的初始化移到声明中可以隐藏这一点