我是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.clock
和this.id
又如何呢?
答案 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 = clock
和id = 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.
}
}
建议:尝试阅读有关this
和super
的关键字。在了解了这两个内容之后,您可以了解实例与static
的字段和方法。