很简单的代码问题,外行初学JAVA。见笑!!
public class test{
int a;
test(){
System.out.println(a);
}
public void puts(){
System.out.println(b);
}
int b;
public static void main(String[] args){
test d=new test();
d.puts();
int c;
System.out.println(c);
}
}
为什么ab能初始化为0,而c却编译时报错未初始化。是不是abc在内存的分布不一样,哪位高手能详细的讲解一下原因以及abc在内存的分布?
问题点数:50、回复次数:31Top
1 楼zhutouzip(醒了的鸟)回复于 2005-04-22 23:20:42 得分 5
这个是java,和c的变量分配机制不一样,c中如果没有分配值给变量而直接使用会出错,在java中,如果没有初始化,每个定义的变量都有一个literal(字面值,默认),这样即使没有初始化再使用也不会出错!
但最好不要这样做,在使用这些变量之前最好初始化!Top
2 楼cm2004(贫下中农)回复于 2005-04-22 23:23:06 得分 0
现在没机子调试 只好帮楼主定咯 :)Top
3 楼helpall(was jl)回复于 2005-04-22 23:26:10 得分 5
a和b是成员变量,在类生成时自动初始化为0,而c是当地变量,没有自动初始化,在使用前需要赋值.Top
4 楼eureka0891(迷茫中...)回复于 2005-04-22 23:39:42 得分 0
楼上说的对,建议看看thinking in javaTop
5 楼libo0208(费格)回复于 2005-04-22 23:44:02 得分 0
请问helpall:成员变量和当地变量的主要区别在哪里,学好JAVA是不是要把变量在内存的分布弄清楚一点。是不是当地变量放在stack里,成员变量放在heap里,Top
6 楼libo0208(费格)回复于 2005-04-22 23:47:14 得分 0
我正在看这本书的英文版,在做第四章的题的时候遇到的此问题。以后估计是这里的常客了呵呵Top
7 楼june7(麦田)回复于 2005-04-23 00:04:42 得分 0
是不是当地变量放在stack里,成员变量放在heap里
这些东西都是原理,Think in java里面讲的好像太详细,不知道初学是不是适合。
我觉得初学得看几编才行吧?第一次看到这个我基本不知道有什么用,后来才知道一点点。Top
8 楼helpall(was jl)回复于 2005-04-23 00:35:33 得分 10
当地变量放在stack里,成员变量放在heap里------->
我的理解,对初学者,最好不要碰这些.在C/C++里这些概念很重要,但JAVA是想把它们屏蔽掉.
但学到后来,需要知道这些,因为在做堆栈操作要快得多,尤其在考虑一些耗时较多的算法时.Top
9 楼007remember(绿原)回复于 2005-04-23 00:49:57 得分 0
学习
Top
10 楼dingoslove(幻风)回复于 2005-04-23 01:01:08 得分 0
来晚了。学习一下Top
11 楼xiaofeng3385(爱情老是缺货,轮也不会轮到我)回复于 2005-04-23 01:09:17 得分 5
暂时记为全局变量不需要初始化,不是全局的就初始化Top
12 楼wangsheng1028(java菜)回复于 2005-04-23 02:27:02 得分 15
类变量和局部变量的内存地址是不一样的;
类变量放在堆栈中,jvm会将他初始化为默认的值;
而局部变量存放在栈中,方法执行完毕立刻回收,而jvm不做初始化动作,故需要你自己赋值初始化,
不然编译要报错的。Top
13 楼jnzsk()回复于 2005-04-23 08:07:03 得分 0
learningTop
14 楼miao378(做人要厚道)回复于 2005-04-23 08:10:39 得分 0
难Top
15 楼wxcwuxuchun(清风)回复于 2005-04-23 08:12:47 得分 0
类成员变量被默认初始化。Top
16 楼deadcode(树欲静,而风不止.)回复于 2005-04-23 08:29:06 得分 0
to wangsheng1028(java菜)
堆栈到底是指堆还是栈?这个说法应该是指stack就是栈了,我觉得类的实例变量和方法的局部变量都是放在栈也就是stack中的,只有动态的内存分配,比如new一个对象是在heap上的.类的实例变量之所以会被赋值是因为类有一个初始化过程<init>,这个方法将实例变量初始化,而方法的局部变量是不会被初始化的Top
17 楼libo0208(费格)回复于 2005-04-23 08:29:58 得分 0
谢谢各位的回答,基本上已经弄懂了。有人说对初学者不用关心数据在内存的分布情况,可是其他书上(张孝详)说了解数据在内存中的分布可以减少编程中的错误,不知各位有何高见,给我一些启示做参考,谢谢了。是不是分太低了,我可以再加!!1Top
18 楼magicfire(岩岩)回复于 2005-04-23 08:47:19 得分 0
我怎么觉得那个 int b;应该放在puts方法前面啊,难道可以在还没声明变量前就使用变量吗?
我是初学,请大虾不要见怪,请多多指教。。Top
19 楼libo0208(费格)回复于 2005-04-23 08:54:06 得分 0
to magicfire
我刚看完关于初始化的章节。生成一个对象后先要完成对基本类型数据的初始化,有静态变量的要现对静态变量赋值初始化。在调用方法时,一些类成员变量都已经初始化完了。Top
20 楼weblogical(初学者)回复于 2005-04-23 09:20:02 得分 0
为什么我在sun网站下载的j2se jdk不能安装?请众位高手指教!Top
21 楼qiongtumlL(海上孤魂)回复于 2005-04-23 12:01:19 得分 0
类变量会被默认初始化,故类变量可以不做初始化处理(例如假设int b;b被定义成类变量,那么它将被初始化为0),而局部变量必须做初始化处理,否则compile errorTop
22 楼007remember(绿原)回复于 2005-04-23 13:28:42 得分 0
顶下先
学习下Top
23 楼libo0208(费格)回复于 2005-04-23 14:24:35 得分 0
基本上应该是类成员变量和局部变量的区别了吧,不知还有何异议。我还是想请教各位高手内存存储问题,是否对初学者学好JAVA有所帮助。Top
24 楼dog0883(笨狗一条)回复于 2005-04-23 16:59:41 得分 10
若某个主数据类型属于一个类成员,那么即使不明确(显式)进行初始化,也可以保证它们获得一个默认
值。
主类型默认值
boolean false
char '\u0000'(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
一旦将变量作为类成员使用,就要特别注意由Java 分配的默认值。这样做可保证主类型的成员变量肯定得到
了初始化(C++不具备这一功能),可有效遏止多种相关的编程错误。
然而,这种保证却并不适用于“局部”变量——那些变量并非一个类的字段。所以,假若在一个函数定义中
写入下述代码:
int x;
那么x 会得到一些随机值(这与C 和C++是一样的),不会自动初始化成零。我们责任是在正式使用x 前分
配一个适当的值。如果忘记,就会得到一条编译期错误,告诉我们变量可能尚未初始化。这种处理正是Java
优于C++的表现之一。许多C++编译器会对变量未初始化发出警告,但在Java 里却是错误。Top
25 楼asola()回复于 2005-04-23 18:08:06 得分 0
有收获,以前没注意这些Top
26 楼libo0208(费格)回复于 2005-04-23 19:22:57 得分 0
第一次在这个板块发贴就有这么多好心人支持帮助,感觉这里的氛围太好了,小弟深受感动,谢谢各位了。
我还是想问一下内存方面的问题,希望高手继续帮忙解答。
哪位大哥能留个联系方式啊,以后常联系。我正在北京读书!Top
27 楼edward0716(雲威龍)回复于 2005-04-23 20:15:20 得分 0
实例化一个对象后,自动对其属性进行初始化了吧。
也就是说当你用了这条语句的时候,已经初始化了:test d=new test();Top
28 楼znforce(鑫的一天)回复于 2005-04-23 20:29:36 得分 0
java中 局部变量 必须 初始化Top
29 楼hiland()回复于 2005-04-23 20:31:37 得分 0
学习,真是受益非浅啊Top
30 楼woanon(嗳老虎游)回复于 2005-04-23 21:06:30 得分 0
友情upTop
31 楼plovej(把自己变为挣钱的机器)回复于 2005-04-23 21:23:51 得分 0
恩,不错,值得学习!Top




