类变量和构造函数中的参数之间有什么区别?

时间:2013-11-04 07:13:29

标签: java parameters constructor class-variables

我在回答this answer时问这个问题。

我正在使用VariableVar的示例 - 修改请注意我在问{i}}或Var的使用位置:

Variable

Class NewClass {

    private  String Variable = "";

    Public Class (String Var)
    {
        NewClass.Var = Variable;
    }
}

哪些是类变量,这与参数有何不同,哪些在哪里?

修改

我应该补充一下,因为这是在链接的答案中,但似乎人们没有看过它:

  

因为函数的参数特别令人困惑   与类变量具有完全相同的名称,但是Patient.ptNo   与参数ptNo不是同一个变量。 (其实,   Patient.ptNo应该是this.ptNo,因为它属于这个   该类的特定实例。 Patient.ptNo会指单个   患者类型的所有对象共有的值。)

所以当人们说 private String Variable = ""; Public Class (String Variable) { NewClass.Variable = Var; // OR WHATEVER OTHER COMBINATIONS IT MAY BE. } } 时,我仍然对什么是什么感到困惑。

4 个答案:

答案 0 :(得分:3)

使用变量作为构造函数参数没有问题,因为它是构造函数的局部变量。

class NewClass {

    private  String Variable = "";

    Public NewClass (String Variable)
    {
        this.Variable = Variable;
    }
}

                       or

class NewClass {

    private  String Variable = "";

    Public NewClass (String Var)
    {
        this.Variable = Var;
    }
}
两个都很好。

this.Variable表示当前对象变量。

尝试阅读命名约定。

答案 1 :(得分:2)

this.Variable将引用该类的Variable字段,而Variable将是传递给构造函数的参数。

private String Variable = ""; - 这不是静态的

因此你的构造函数看起来像谎言

public NewClass(String Var/iable) {
    this.Variable = Variable; // this must be used, where this.Variable is the class variable and just Variable is the constructor parameter.
}

注意:您已使用仅允许该类的静态字段的ClassName.fieldName。如果this.fieldName不是Variable,则应为static。此外,Public不应该是大写字母,构造函数名称应该是类名。关键字class应该很小而不是Class

如果您想使用您放入代码的方式,则类中的Variable应该是静态的。像这样的东西

private static String Variable = "";
public NewClass(String Var/iable) {
    NewClass.Variable = Variable; // Since Variable is static now, you use the classname to access the static field.
}

编辑:完全可以使用相同的名称,只要您可以区分它们。在这种情况下,this.Variable表示类变量,而Variable只是引用在创建此类实例时传递给构造函数的参数。

class Variable = Variable passed to the constructor; // This is what the below statement means
this.Variable = Variable;

答案 2 :(得分:2)

类变量是由类定义为static字段的类变量,参数是由方法定义的参数。就是这么简单。还有实例变量(在类级别定义但不是静态的)和局部变量(在方法中定义,但不作为输入参数)。

public class Foo {
    private static String someName; // this is a class variable
    private String someOtherName; // this is an instance variable

    public Foo(String anotherName) { // anotherName is a constructor parameter
        int yetAnother = 1; // yetAnother is a local variable
        someOtherName = "foo"; // assign a value to someOtherName
    }

这两个变量完全不同。他们甚至不必拥有相同的类型!您的示例中唯一的复杂因素是两个变量碰巧具有相同的名称。当发生这种情况时,编译器将优先于类变量的构造函数参数(或方法参数或局部变量)。为了“强制”使用类变量,请在其前面添加this.

要记住的是,无论名称如何,这两个变量都是完全独立的。

所以这个:

class NewClass {

    private  String Variable = "";

    Public NewClass (String Variable)
    {
        NewClass.Variable = Variable;
    }
}

与此完全相同:

class NewClass {

    private  String Variable = "";

    Public NewClass (String someOtherVariableName)
    {
        NewClass.Variable = someOtherVariableName;
    }
}

......它也与此完全相同:

class NewClass {

    private  String Variable = "";

    Public NewClass (String Var)
    {
        NewClass.Variable = Var;
    }
}

对参数使用与类变量相同名称的约定只意味着您不必在变量名称上提出无意义的变体。

答案 3 :(得分:1)

class NewClass {

private  String variable = "";

public NewClass (String variable)
{
    this.variable = variable;
}
}

this.variable指当前对象实例。 请遵循命名惯例