Java:构造函数变量与类级别可见的变量
我是Java新手,我继承了这样的代码(来自Python) Q1)在类级别设置变量有什么意义?Java:构造函数变量与类级别可见的变量,java,Java,我是Java新手,我继承了这样的代码(来自Python) Q1)在类级别设置变量有什么意义? 区分“this.”和不在构造函数中使用它有什么意义?在python中,我总是用“this”设置构造函数中的变量 公共课程表{ 私有最终字符串id; 私人最终时钟; 私人最终地图工作商店; 私人即时最新更新时间; @注入 公共时间表( 时钟, @命名(“id”)字符串id, ) { 工作存储=新建ConcurrentHashMap(); 这个时钟=时钟; this.id=id; this.lastUpda
区分“this.”和不在构造函数中使用它有什么意义?在python中,我总是用“this”设置构造函数中的变量
公共课程表{
私有最终字符串id;
私人最终时钟;
私人最终地图工作商店;
私人即时最新更新时间;
@注入
公共时间表(
时钟,
@命名(“id”)字符串id,
) {
工作存储=新建ConcurrentHashMap();
这个时钟=时钟;
this.id=id;
this.lastUpdateTime=clock.instant();
}
例如,为什么this.lastUpdateTime
但是工作存储
不是this.workStore
是因为使用了
final
吗?那么为什么this.clock
和this.id
?类上的变量称为实例变量,这意味着当您构建Schedule
的新实例时,它将具有特定于实例的变量
this
关键字基本上是指我的实例,因此在本例中,构造函数使用一个名为clock
的变量,Schedule类也有一个名为clock的变量。因此,要区分这两个变量,请使用此关键字
ThisThis.clock=clock;
将我实例上的变量clock设置为传递给构造函数的clock值。Q1)在类级别使用变量有什么意义?
如果一个变量被声明为静态变量,那么它是类级别的变量。所有其他变量都是实例变量。静态变量特定于类,因此从类创建的任何实例都将共享此变量并可以看到此变量的值。如果一个实例更改此变量的值,那么所有其他实例都将这个类开始看到新的值。在您的示例中,变量声明中没有使用静态关键字。它们都是实例变量
Q2)区分“this.”和不在构造函数中使用它有什么意义
您的构造函数如下所示
public Schedule(Clock clock,String id)
如果观察,构造函数的参数是“clock”和“id”。类中声明的变量的名称也是“clock”和“id”
如果您只是设置clock=clock
和id=id
,编译器将不知道您的意思。通过调用构造函数,您正在创建此类的新实例。通过使用“this”关键字,您的意思是将“id”from参数分配给“this”对象的“id”变量。(您的意思是将id from参数分配给新创建的实例的id)
在这种情况下,如果您的构造函数如下所示
public Schedule(Clock clock1,String id1)
然后,您可以简单地设置
clock = clock1;
id = id1;
由于编译器没有混淆,因此不需要使用“this”关键字。在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.
}
}
建议:试着阅读
这个
和超级
关键词。在阅读了这两个关键词之后,你可以阅读实例与静态
字段和方法。点击第一个google results for java turorialResearch变量范围
这个。
如果类字段在give中是唯一的,可以使用它来处理类字段n scope-aka您没有同名的局部变量。这在Java中通常是可选的。我在这里没有看到任何类级别的变量。它们都是实例变量和局部变量(以及方法参数)。在Java中是“类变量”使用static
修饰符。我不知道足够多的Python来详细说明这些差异,但是在Java中,当一个方法参数和一个成员(在本例中是实例变量)出现时,习语this.id=id
很常见具有相同的名称。this.
引用实例变量,而id
参数将隐藏该变量(阴影).这个
通常不会在Java中使用,除非你了解一些关于内部类的棘手问题,或者你开始链接构造函数。可能是因为python有名称空间。在python中,构造函数之外的任何变量都是可见的,因此被认为是类变量。但我想在Java中,我们强制使用class变量是静态的。所以,所有这些私有变量只对Schedule的实例可见?Schedule A和Schedule B将有不同的id?嗯,我不确定python,但在java中有一个实例世界(实例字段和实例方法)属于对象的,每个对象有一个实例世界。然后我们有静态世界(静态字段和方法)。这是一个类的所有对象共享的。我建议在了解实例世界后阅读有关静态的内容。还请注意,在java中,类级别通常被理解为静态的,因此请在问题中使用实例变量和实例方法,否则您将得到正确的答案,但可能与您的问题关系不大那么为什么会有私有最终时钟?这与此不同。时钟?如果它不同,谁在为私有最终时钟设置值?因此private
final
是Schedule类上该实例变量的修饰符。private
表示您只能
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.
}
}