Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:构造函数变量与类级别可见的变量_Java - Fatal编程技术网

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

Java:构造函数变量与类级别可见的变量,java,Java,我是Java新手,我继承了这样的代码(来自Python) Q1)在类级别设置变量有什么意义? 区分“this.”和不在构造函数中使用它有什么意义?在python中,我总是用“this”设置构造函数中的变量 公共课程表{ 私有最终字符串id; 私人最终时钟; 私人最终地图工作商店; 私人即时最新更新时间; @注入 公共时间表( 时钟, @命名(“id”)字符串id, ) { 工作存储=新建ConcurrentHashMap(); 这个时钟=时钟; this.id=id; this.lastUpda

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

Q1)在类级别设置变量有什么意义?
区分“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的变量。因此,要区分这两个变量,请使用此关键字

This
This.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.
      }
}