在 Java 语言中,所有的对象都是在堆 ( heap ) 上动态分配的。
这点和 C/C++ 有所不同。在 C/C++ 语言中,对象既可以在堆 ( heap ) 上分配,也可以在栈 ( stack ) 上动态分配。
在 C/C++ 语言中,如果我们使用了 new
关键字来分配一个对象,对象在堆(heap)上分配。其它情况下,只要不是静态或全局的对象,都是在栈 ( stack ) 上分配的。
在 Java 语言中,当我们只是声明了一个变量的类型时,如下所示,只是简单的创建了一个引用,实际上并没有为该对象分配任何内存。
Object person;
要为对象分配内存,我们必须使用 new
关键字。因此,Java 中的对象始终都是在堆(heap)上分配的。
例如下面的代码,编译时会报错,提示 "Error here because t is not initialized"
JavaTester.java
public class JavaTester { void show() { System.out.println("Test::show() called"); } public static void main(String[] args) { JavaTester t; // 编译错误,因为 t 并未初始化 t.show(); } }
编译结果如下
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester JavaTester.java:13: 错误: 可能尚未初始化变量t t.show(); ^ 1 个错误
如果要修正这个错误,我们必须使用 new
关键字来初始化一个对象
public class JavaTester { void show() { System.out.println("Test::show() called"); } public static void main(String[] args) { JavaTester t = new JavaTester(); t.show(); } }
编译运行上面这段代码,输出结果如下
[yufei@www.twle.cn java]$ javac JavaTester.java && java JavaTester Test::show() called
目前尚无回复