构造函数和实例变量之间的区别

时间:2018-12-18 14:46:58

标签: java constructor instance-variables

我需要了解构造函数和实例变量。我的问题是构造函数是在第1行中初始化的,而我可以通过在第2行中创建实例变量来实现。为什么我需要使用构造函数来初始化值,而我可以使用实例变量来初始化值?

class ExampleConstructor{
    int value;
    ExampleConstructor(int value){
        this.value=value;
    }
}
public class Main{
    public static void main(String[] args){
        ExampleConstructor constructor=new ExampleConstructor(100);/*line 1*/
        System.out.println(constructor.value);
        constructor.value=10;/*line 2*/
        System.out.println(constructor.value);
    }
}

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

有时候会更好。您的第2行更像是setter之类的builder.setValue(2);

现在来看:

import numpy as np

df['profitable'] = np.where(df['revenue'] > df['budget'], 1, 0)

一行中有四行。

我们也无法访问此类字段,我们应该使用getter和setter。

当您像这样调用构造函数时,只需在创建对象时将值分配给该字段即可。使用设置器时,您可以随时访问字段。

抱歉我的英语。希望你能理解。

答案 2 :(得分:0)

有时您需要确保变量在一定范围内。例如,当您将RandomObject与字段probability一起使用时,您需要确保该概率介于0和1之间。第二个原因,有时我们想确保该字段不能被更改(以防止错误)。从课堂之外。因此,我们不能从类外部分配值,因此我们需要使用构造函数(或方法)进行赋值。第三件事是有时我们使用相同的参数来计算几个字段(例如areaside)。还有很多其他原因,例如,防止代码重复,使代码更易于阅读或提及先前的封装。

答案 3 :(得分:0)

构造函数用于创建类的实例。

如果您不关心值会被多个代码所编辑并影响每个人,那么可以将value设为static,并在不使用构造函数的情况下使用它。了解实例变量和静态变量之间的差异非常重要,因为在某些地方静态是有意义的。

在您的情况下,您正在通过调用类ExampleConstructor的构造函数并将其分配给变量constructor来创建实例。然后将“实例变量” value更改为10。您不必将值传递到构造函数中,可以有一个空的构造函数,并在实例化对象后设置该值。

如果将成员value设为static(例如static int value;),并在没有构造函数(例如ExampleConstructor.value)的情况下使用它,则它会起作用。但是问题是,如果另一段代码将ExampleConstructor.value设置为2828,则该行之后的每一段代码在打印ExampleConstructor.value时都会得到2828。

如果您不希望发生这种情况,那么更改一个地方的代码会影响到其他地方。然后,应将成员value定义为实例变量,并使用构造函数实例化对象并使用实例变量。

IMO,您对类和变量的命名很容易引起读者的困惑。

检查下面的代码块,以获得更好的解释。

public class HelloWorld{

     public static void main(String []args){
        System.out.println("Printing static value from TestClass.");
        // Observe that the TestClass is not being instantiated to operate on staticValue;
        System.out.println("TestClass.staticValue:  " + TestClass.staticValue);
        changeStaticValue();
        System.out.println("\nPrinting static value from TestClass after editing.");
        System.out.println("TestClass.staticValue:  " + TestClass.staticValue);

        TestClass instance1 = new TestClass();
        TestClass instance2 = new TestClass(123);
        System.out.println("\nPrinting instance value of both instances right after instantiation.");
        System.out.println("instance1.instanceValue:  " + instance1.instanceValue);
        System.out.println("instance2.instanceValue:  " + instance2.instanceValue);
        instance1.instanceValue = 888;
        instance2.instanceValue = 999;
        System.out.println("\nPrinting instance values after editing.");
        System.out.println("instance1.instanceValue:  " + instance1.instanceValue);
        System.out.println("instance2.instanceValue:  " + instance2.instanceValue);

     }

     private static void changeStaticValue()
     {
         TestClass.staticValue = 11111;
     }
}


class TestClass
{
    public static int staticValue;
    public int instanceValue;

    public TestClass()
    {

    }
    public TestClass(int instVal)
    {
        this.instanceValue = instVal;
    }
}