Java静态类变量
我正在努力弄清楚为什么下面的Java代码有以下输出 具体来说,为什么ref3的s值每次设置为125,ns值每次设置为0 代码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 +
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
}
}`