Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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_Class_Static - Fatal编程技术网

Java静态类变量

Java静态类变量,java,class,static,Java,Class,Static,我正在努力弄清楚为什么下面的Java代码有以下输出 具体来说,为什么ref3的s值每次设置为125,ns值每次设置为0 代码 public class App { int ns; static int s; App (int ns) { if (s < ns) { s = ns; this.ns = ns; } } void doPrint () { System.out.println("ns = " + ns +

我正在努力弄清楚为什么下面的Java代码有以下输出

具体来说,为什么ref3的s值每次设置为125,ns值每次设置为0

代码

public class App {

  int ns;
  static int s;

  App (int ns) {
    if (s < ns) {
      s = ns;
      this.ns = ns;
    }
  }

  void doPrint () {
    System.out.println("ns = " + ns + ", s = " + s);
  }

  public static void main(String[] args) {
    App ref1 = new App(50);
    App ref2 = new App(125);
    App ref3 = new App(100);

    ref1.doPrint();
    ref2.doPrint();
    ref3.doPrint();
  }
}

s
时设置
ns

对于
ref1
您传递
ns
=
50
,但是
s
未初始化,java假设
s
为零,因此它输入
if(s
并将
ref1
的类变量
ns
和静态
ns
设置为
50

对于
ref2
您传递
ns
=
125
s
为50,
if(s
保持为真,因此输入if并将静态变量
s
更新为125,将
ref2
的类变量
ns
更新为125


对于
ref3
您通过
ns
=
100
,但是
s
已经是
125
,因此不会进入if条件,
ns
保持未初始化状态,其值在打印时为零。

有不同的方面发挥作用

默认值 Java中的变量有默认值,即使您没有指定它们。对于
int
这是
0
,因此
应用程序
类的初始值为:

int ns = 0;
static int s = 0;
因此实际上,
ns
并没有“为ref3设置为0”,而是只保留其初始值,而
ref1
ref2
则显式地更改该值

可变范围 让我们看看
应用程序的构造函数

App (int ns) {
  if (s < ns) {
    s = ns;
    this.ns = ns;
  }
}
这将输出:

App.s=0
ref1.ns=50, ref1.s=50, App.s=50
ref2.ns=125, ref2.s=125, App.s=125
ref3.ns=0, ref3.s=125, App.s=125

您可以看到
ref.s
始终等于
App.s
App.s
甚至在您创建第一个实例之前就已经存在。

正如您所知,当用关键字“static”声明变量时,它被称为“类变量”。所有实例共享变量的同一副本


因此,当运行
App ref2=new App(125)
时,
s
125
。在
App ref3=new App(100)
中,
ns
100
,leee大于
s(125)
,因此您的if赋值没有执行,这意味着
ns
保持在初始默认值
0

在Java中,静态大致意味着所有类实例(以及类本身)之间共享一个变量。它是在其他所有操作之前初始化的,当您在一个实例中更新它时,它将反映在所有其他实例中

您的程序执行如下:

  • 将s初始化为0(默认整数)
  • 0<50,因此将两者都设置为50
  • 50<125,因此将两者都设置为125
  • 125>100,因此不执行if分支。ns在构造函数末尾未初始化,因此默认情况下初始化为0

此外,在执行该步骤之后,您将打印值,因此,我们的唯一s被绑定到125

s
的值每次达到125,因为它是一个静态变量,并且静态变量对于类是公共的,因此它们的值不会因您创建的每个对象而改变。当您在所有对象创建之后调用
doPrint
方法时,因此s的最新值是125以及对
doPrint
方法的每次调用的输出

s
的值对于
ref3
被设置为0,因为在构造函数中,您正在比较
s
ns
。创建引用变量
ref3
时,构造函数中会发生这种情况:

    `App (int ns) 
     {
      if (s < ns)   /* s is 125 and ns is 100 so the if statement evaluates 
                     to  false and the assignments don't happen*/
     {
     s = ns;        // this isn't performed
     this.ns = ns;  // even this isn't performed
     }
    }`
`App(int-ns)
{
if(s

因此,当您调用
ref3.doPrint()
ns
的值为0
s
的值为125时,您的输出也是如此。

100小于125,因此您的
if
为false,并且不会执行赋值(并且
ns
保持初始默认值)。
App.s=0
ref1.ns=50, ref1.s=50, App.s=50
ref2.ns=125, ref2.s=125, App.s=125
ref3.ns=0, ref3.s=125, App.s=125
    `App (int ns) 
     {
      if (s < ns)   /* s is 125 and ns is 100 so the if statement evaluates 
                     to  false and the assignments don't happen*/
     {
     s = ns;        // this isn't performed
     this.ns = ns;  // even this isn't performed
     }
    }`