CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

一个Java变量赋值的弱问题

楼主addcplus(一打就倒)2005-02-04 19:09:28 在 Java / J2SE / 基础类 提问

以下这段语句是正确的语句:  
  public   class   ClassExample{  
  //   声明成员属性,可以是静态的或非静态的  
  int   i;  
  static   int   j;  
   
              //   静态初始化语句块  
  static{  
  j=10;  
  System.out.println("In   static   initializer.");  
  }  
   
  //实例初始化语句块  
  {  
  i=10;  
  System.out.println("In   instance   initializer.");  
  }  
   
  //   构造方法  
  public   ClassExample(){  
  System.out.println("In   constructor.");  
  }  
  public   static   void   main(String[]   args){  
  new   ClassExample();  
  }  
  }  
   
  但是,我如果把整个“实例初始化语句块”注释掉,这样对i赋值:  
  int   i;  
                    i   =10;         //但如果直接采取int   i=10;的赋值形式也可以编译通过  
  static   int   j;                    
  则显示这样的错误:  
   
  ClassExample.java:8:   <identifier>   expected  
                i=10;  
                  ^  
  ClassExample.java:8:   cannot   resolve   symbol  
  symbol     :   class   i  
  location:   class   ClassExample  
                i=10;  
                ^  
  2   errors  
   
  怎么回事呢?呵呵  
   
  问题点数:20、回复次数:7Top

1 楼zealVampire(白鹤泉)回复于 2005-02-04 19:26:57 得分 0

我倒   你要么直接就这样  
  private   int   i   =10;就好了的啊  
  要么就在方法里面赋值  
  怎么可以  
  private   int   i;  
  i   =   10;  
  Top

2 楼addcplus(一打就倒)回复于 2005-02-04 19:53:00 得分 0

为什么不可以呢?不太理解呀,呵呵Top

3 楼xxzxzx(xxzxzx)回复于 2005-02-04 20:04:43 得分 0

java的规据就是多Top

4 楼sbgphl(十八哥)回复于 2005-02-04 22:03:17 得分 0

关注!Top

5 楼apollo333()回复于 2005-02-04 22:07:11 得分 14

兄弟的问题是个好问题啊,以前没注意。找了一下,建议去看《JAVA   IN   A   NUTSHELL》第3章,3。2   CREATING   AND   INTIALIZING   OBJECTS。就都明白了。  
   
  看你的名字应该是从C++转过来的吧。因为JAVA是纯面向对象语言,就是说所有的东西都是类,包括已经存在的API库和任何人要编的JAVA程序。在类里只能有2种东西存在。一个是变量,一个是方法。所以用任何一种都合理。  
  private   int   i   =10;这个就是变量。合理。  
  如果写成这样  
  private   int   i;  
  i   =   10;  
  很明显第2个不是方法。所以JAVA说出错。  
   
  但是JAVA语言里除了定义变量和方法外,还定义了构造函数。和方法类似。就是没有返回。  
  这个构造函数不管你定义不定义都存在。不定义,JAVA就自动生成,来默认。  
   
  当你写成这样的时候,  
    int   i;  
  static   int   j;  
   
  //   静态初始化语句块  
  static{  
  j=10;  
  System.out.println("In   static   initializer.");  
  }  
   
  //实例初始化语句块  
  {  
  i=10;  
  System.out.println("In   instance   initializer.");  
  }  
   
  //   构造方法  
  public   ClassExample(){  
  System.out.println("In   constructor.");  
  }  
   
   
  JAVA实际做的是把  
  int   i;  
  和这个块  
  {  
  i=10;  
  System.out.println("In   instance   initializer.");  
  }  
  放到构造函数里,就象  
   
  public   ClassExample(){  
   
  int   i;  
   
  i=10;  
   
  System.out.println("In   instance   initializer.");  
   
  System.out.println("In   constructor.");  
  }  
  这样的来执行。  
  同样,对于静态的,JAVA也有个默认的构造函数在后台。静态的声明和静态块都放到那里。Top

6 楼zrtl(刚从软件园回来)回复于 2005-02-04 22:26:18 得分 6

在变量声明完成之后的赋值操作一定要在类方法里操作,int   i=10;是直接在声明时赋初值当然可以的,而写在  
  {  
  i=10;  
  System.out.println("In   instance   initializer.");  
  }  
  里,因为这是一个匿名方法,已经有了方法的概念,所以也可以编译通过。Top

7 楼addcplus(一打就倒)回复于 2005-02-04 23:05:32 得分 0

apollo333和zrtl两位兄弟都分析的很透彻啊,呵呵  
   
  void   ClassBodyDeclaration()   :  
  {}  
  {  
      LOOKAHEAD(   {   isInitializer()   }   )  
      Initializer()  
  |  
      LOOKAHEAD(   {   isNestedClassDeclaration()   }   )  
      NestedClassDeclaration()  
  |  
      LOOKAHEAD(   {   isNestedInterfaceDeclaration()   }   )  
      NestedInterfaceDeclaration()  
  |  
      LOOKAHEAD(   {   isConstructorDeclaration()   }   )  
      ConstructorDeclaration()  
  |  
      LOOKAHEAD(   {   isMethodDeclaration()   }   )  
      MethodDeclaration()  
  |  
      FieldDeclaration()  
  }  
   
  其中  
   
   
  void   VariableInitializer()   :  
  {}  
  {  
      ArrayInitializer()  
  |  
      LOOKAHEAD(1,   <BOOLEAN>   |   <BYTE>   |   <CHAR>   |   <DOUBLE>   |   <FALSE>   |   <FLOAT>   |   <INT>   |  
                                <LONG>   |   <NEW>   |   <NULL>   |   <SHORT>   |   <SUPER>   |   <THIS>   |   <TRUE>   |  
                                <VOID>   |   <INTEGER_LITERAL>   |   <FLOATING_POINT_LITERAL>   |  
                                <CHARACTER_LITERAL>   |   <STRING_LITERAL>   |   <IDENTIFIER>   |   <LPAREN>   |  
                                <BANG>   |   <TILDE>   |   <INCR>   |   <DECR>   |   <PLUS>   |   <MINUS>)  
      Expression()  
  }  
   
  Top

相关问题

  • 变量赋值!
  • 能否给javascript的date变量赋值java的java.util.date变量
  • 变量的赋值问题?
  • 类变量间的赋值
  • 变量赋值的问题?
  • 变量赋值的问题
  • 关于 变量的赋值
  • 去急救,高手请出招。js里能把var变量的值赋值给java变量吗?
  • 急救,高手请出招。js里能把var变量的值赋值给java变量吗?
  • select 语句中变量赋值问题

关键词

  • 语句
  • 函数
  • classexample
  • 赋值
  • 变量
  • 静态
  • lookahead
  • 构造函数
  • 初始化语句块
  • 方法

得分解答快速导航

  • 帖主:addcplus
  • apollo333
  • zrtl

相关链接

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

广告也精彩

反馈

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