Java:构造函数变量与在类级别可见的变量

时间:2019-04-03 19:05:50

标签: java

我是Java新手,并且已经继承了这样的代码(来自Python)

Q1)在类级别拥有变量有什么意义?
Q2)区分“ this”有什么意义?而不在构造函数中使用它?在python中,我总是在构造函数中使用“ this”设置变量

public class Schedule {
    private final String id;
    private final Clock clock;
    private final Map<String, WorkJob> workStore;             
    private Instant lastUpdatedTime;

    @Inject
    public Schedule(
            Clock clock,
            @Named ("id") String id,

    ) {
        workStore = new ConcurrentHashMap<>();
        this.clock = clock;
        this.id = id;
        this.lastUpdatedTime = clock.instant();
   }

例如,this.lastUpdatedTime为何workStore不是this.workStore

是因为使用了final吗?那么this.clockthis.id又如何呢?

3 个答案:

答案 0 :(得分:3)

该类上的变量称为实例变量,这意味着在构造Schedule的新实例时,它将具有特定于该实例的那些变量。

this关键字基本上是在说我的实例,因此在此示例中,构造函数使用一个名为clock的变量,而Schedule类也有一个名为Clock的变量。因此,您可以使用此关键字来区分两者。

this.clock = clock;将实例上的变量clock设置为传递给构造函数的clock的值。

答案 1 :(得分:2)

问题1)在类一级拥有变量有什么意义?

如果将变量声明为静态变量,则它是类级变量。所有其他变量都是实例变量。静态变量特定于类,因此从类创建的任何实例都将共享此变量,并且可以看到该变量的值。如果一个实例更改了该变量的值,则该类的所有其他实例将开始看到新值。在您的示例中,变量声明中没有使用static关键字。它们都是实例变量。

问题2)区分“ this”有什么意义?而不在构造函数中使用它

您的构造函数如下

public Schedule(Clock clock,String id)

如果您观察到,则构造函数的参数为​​'clock'和'id'。并且在类中声明的变量的名称也为“ clock”和“ id”。

如果仅设置clock = clockid = id,则编译器将不知道您的意思。通过调用构造函数,您正在创建此类的新实例。通过使用'this'关键字,您说的是将参数中的'id'分配给'this'对象的'id'变量。 (您说的是将参数中的id分配给您新创建的实例的id)。同样,this.clock = clock

如果您的构造函数如下所示,

public Schedule(Clock clock1,String id1)

然后您只需设置

clock = clock1;
id = id1;

由于编译器不会造成混乱,因此您无需使用'this'关键字。

答案 2 :(得分:1)

在Java对象中,引用可以访问。始终需要引用来访问实例变量(状态)和实例方法(行为)。 现在,当我们从同一类的构造函数或实例方法中调用实例方法或状态时,引用为this。不需要明确地指出这一点。仅当局部变量与实例变量具有相同的名称时才需要,然后使用this来区分实例变量。

  public class Student {
        private int roll;
        private String name;
        public Student(int roll, String n){
              // we have roll as method parameter and also a private int roll, both has same name, jsing this. we can distinguish.
              this.roll = roll;
              name = n; // this.name = n; is also valid but as names do not conflict hence explicitly using this is nkt needed.
      }
}

建议:尝试阅读有关thissuper的关键字。在了解了这两个内容之后,您可以了解实例与static的字段和方法。