-3

我一直在玩这段代码一段时间,这让我感到困惑,为什么这个方法调用似乎返回了一个数字,尽管它最初没有设置为 0

public class MainProg {
    public static void main(String[] args) {
        FixedCapacitySizeOfStrings s = new FixedCapacitySizeOfStrings(3);
        System.out.println("(" + s.size() + " left on stack)");

    }
}

这是 API 代码

public class FixedCapacitySizeOfStrings {
    private String[] a;
    private int N;  

    public FixedCapacitySizeOfStrings(int cap) {
        a = new String[cap];
    }

    public boolean isEmpty() {
        return N == 0;
    }

    public int size() {
        return N;  //why is this line doing the right thing?? N was never initialized to 0
    }

    public void push(String item) {
        a[N++] = item;
    }

    public String pop() {
        return a[--N];
    }
}
4

5 回答 5

5

原始实例变量默认初始化为 0。这包括intlongdoublefloatshort和。(并且所有非原始实例变量都初始化为)bytecharnull

请注意,这仅与实例变量(字段)有关-未初始化局部变量。

于 2013-08-12T04:53:02.017 回答
4

实例变量由编译器初始化为默认值,如果你不提供任何初始化
这些是不同类型实例变量的默认值。

   
数据类型 默认值
布尔假
字符 \u0000
int,short,byte / long 0 / 0L
浮动/双 0.0f / 0.0d
任何引用类型 null

有关默认初始化的更多详细信息。

于 2013-08-12T04:55:47.703 回答
1

当您在方法内部时,必须显式初始化变量。在方法 0 之外,默认值整数被初始化为隐式。

因此,即使您的整数N未在FixedCapacitySizeOfStrings其值内分配,也隐含为零,因为它被声明为实例变量(类变量)。

但是,您的测试用例会抱怨,因为整数s没有显式设置为任何值,而是在方法中声明。

于 2013-08-12T04:51:59.560 回答
0
    FixedCapacitySizeOfStrings s = new FixedCapacitySizeOfStrings(3);

它将调用构造函数,但在构造函数之前,它被称为初始化代码部分,该部分现在为空并private int N;取 0 值。比System.out.println("(" + s.size() + " left on stack)");将返回 0 值。

于 2013-08-12T04:55:58.897 回答
0

它给出 s.size()=0 因为 N 是实例变量,并且您知道它具有默认值,如果您想更正值然后写为

公共整数大小(){

    return N=a.length;
         }

上面给出正确的结果...

于 2013-08-12T05:41:19.873 回答