A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山水游客 中级黑马   /  2012-6-27 16:45  /  2184 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.变量的作用域和生命周期什么关系?

2.java除了在类体和方法体(包括参数)中可以声明变量外,其他位置一定不可以声明变量吗?比如高级别的应用里是不是有例外呢?

3.java源文件中代码的组织方式一定是:
Java code
class ClassName1{//类定义
    //成员变量定义
    //成员方法定义
}
class ClassName2{//类定义
    //成员变量定义
    //成员方法定义
}

//.......



一定是以上这种结构吗?比如在两个类定义之间一定不可能有其他代码吗(注释除外)?类体中除了成员变量和成员方法的定义外一定不可能有其他内容吗?成员变量和成员方法的定义可不可以打乱顺序?

4 个回复

倒序浏览
本帖最后由 韦念欣 于 2012-6-27 16:59 编辑

首先,java除了在类体和方法体(包括参数)中可以声明变量外,其他位置一定不可以声明变量,即使是全局变量也是在类里面声明的。

关于生命周期的一些理解:
1. 类的静态变量在内存中只有一个。静态变量位于方法区,被类的所有实例共享。静态变量的生命周期取决于类的生命周期(即类何时被加载和卸载)。
2. 类的每个实例都有相应的实例变量。实例变量位于堆区中。实例变量的生命周期取决于实例的生命周期(即实例何时被创建及销毁)。
3. 假如成员变量(包括静态变量和实例变量)是引用变量,那么当该成员变量结束生命周期时,并不意味着它所引用的对象也一定结束生命周期。另外还关系到JVM的垃圾回收机制。内存垃圾并不一定马上回收。
变量的生命周期和对象的生命周期是两个不同的概念。
4. 局部变量位于栈区,其生命周期取决于所属的方法何时被调用及结束调用。

也就是说:局部变量位于栈区,静态变量位于方法区,实例变量位于堆区,方法的字节码位于方法区,对象本身位于堆区,对象的引用位于栈区。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 晁喆 于 2012-6-27 17:03 编辑

1.变量的作用域和生命周期什么关系?
——可以理解为基本一致,或者说生命周期决定作用域。

2.java除了在类体和方法体(包括参数)中可以声明变量外,其他位置一定不可以声明变量吗?比如高级别的应用里是不是有例外呢?
   java是面向对象语言,变量要么是某个类的成员变量,要么是方法中的局部变量,若定义在类外部,那在类里的方法里,怎么访问该变量呢?所以在类体外是不可以定义变量的.另外在类的初始块里也可定义局部变量。

3.java源文件中代码的组织方式一定是一定是以上这种结构吗?
——除了成员变量和成员方法的定义外,没有其它了。
——定义的顺序可以打乱,但习惯这么写。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 加油!!

查看全部评分

回复 使用道具 举报
本帖最后由 Forever。 于 2012-6-27 17:38 编辑

这位童鞋一定是初接触java,我尽量用你能听懂的话给你一一解释你的疑问:

第一个问题:变量的作用域和生命周期是什么关系。首先要明白这两个概念的意思,作用域顾名思义:在这个范围内起作用呗,离开了这个范围就失效。
                                                                                                                                  生命周期其实也很简单:也就是变量在他的作用域内都是活的,除了这个范围就死掉了
而他们的关系也就显而易见了,作用域控制着生命周期。

第二个问题:变量的声明。在java里分为成员变量和局部变量,简单的说呢成员变量就是作用域在整个类的;局部变量就是作用域在方法内的。至于在类的外面写变量那一定是没戏的。


第三个问题:简单的讲您写的这种方式是正确的,应该没有再奇怪的写代码的方式了。


下面的问题呢,成员变量和成员方法是可以打乱去定义的 没有顺序之说,但是一般没有人那样做,因为那样会让你的程序看起来可读性很差。一个类包括成员变量和成员方法,而去执行的代码全部在方法里,应该没有别的东西需要写了。
童鞋我建议你把java基础的视频多看看,其实很简单的,一步一步来不要着急。这些问题等你把代码写上几遍以后自然自己就知道了。


楼下的童鞋很细心,还有内部类……


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 陆强强 于 2012-6-27 17:16 编辑

1.类变量也就是前面加了static的变量,随类的加载而加载,随类的消失而消失,可以通过类名.变量名来调用;
实例变量是通过new一个对象产生的,一般代码里的变量都是这一类,方法体中的变量也是这种,所以实例变量是随着对象的消失而消失。

2.这个问题我只能说我目前见到的就是这样,开发中会不会有特殊情况不清楚,因为没相关工作过。

3.除了这种结构还有一种就是内部类;
class ClassName1{//类定义
    //成员变量定义
    //成员方法定义
   class ClassName2{//类定义
    //成员变量定义
    //成员方法定义
   }
}
也可以在方法体里面定义内部类
class outer{

   int x=1;
   void show(){
        final int i=8;
        class Inner{
            void print(){
                 System.out.println(i);
            }
        }
    }
}
成员变量和成员方法顺序是为了代码看上去简洁美观,打乱也没事。类与类之间如果有其他代码那也还是在另一个类中,不然你怎么调用

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马