CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

很简单的代码问题,外行初学JAVA。见笑!!

楼主libo0208(费格)2005-04-22 23:11:25 在 Java / J2SE / 基础类 提问

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

相关问题

  • 初学,见笑。
  • 初学JAVA,简单问题请别见笑
  • 初学Java, n多问题,还望大家不要见笑,多多帮助!
  • 初学ASP,请大家别见笑
  • 初学activex的问题,请勿见笑。
  • 初学java
  • 初学Java
  • java初学者
  • JAVA初学
  • 请教:Java应用程序如何发布?那一堆class如何打包为可直接运行的EXE?初学Java,见笑的说

关键词

  • c++
  • 内存
  • 分布
  • 数据
  • 变量
  • 初始化
  • 局部变量
  • 初学
  • 赋值
  • 成员

得分解答快速导航

  • 帖主:libo0208
  • zhutouzip
  • helpall
  • helpall
  • xiaofeng3385
  • wangsheng1028
  • dog0883

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo