posts - 24,  comments - 29,  trackbacks - 0
一、变量的声明

        变量是程序中最重要的内容之一,在Java中声明的任何一个变量必须分配一个类型,声明一个变量时,应该先写上所声明变量的类型,随后再写上变量的名字,而且名字的后面要加上一个西文状态下的“;”。
        这个分号是必须写的,这是Java语句结束符号。

        变量命名的规则重点强调以下几点:
        1)变量名中不能有空格;
        2)变量名大小写很重要;
        3)变量名是不限长度的;
        4)保留字及关键字不能作变量名。

        同一类型的不同变量,可以声明在一行,也可以声明在不同的行。如果声明在同一行,不同的变量之间要用逗号分隔。

二、变量的含义

        所谓变量就是“在变量的有效作用范围内,向物理内存申请的一段内存空间,在程序运行过程中,空间内的值是变化的“。为了程序操作的方便,我们对内存空间起了个名字,这个名字就是变量名,内存空间内的值就是变量值。由此我们可以得出这样一个结论:申请了内存空间,并不意味着空间内就要有值,要想使空间内有值,必须要放入值。例如:我们声明某个变量,可以这么来表示:“int a;”,其中a就是变量名,但现在没有相应的值,也就是说在内存空间内没有值,如果令“int a = 3;”,现在我们不但申请了内存空间,并且把3放入了内存空间,a是变量名,3是变量值。

三、变量的分类

        根据不同的分类方法,变量有不同的名称。

        1)根据作用范围
         根据作用范围,变量可分为全局变量局部变量
         全局变量:是在类的整个范围内,都起作用的变量。它的影响范围也是在整个类之内,在类的任何位置都可以对该变量进行操作。例如:

/*测试全局变量的操作*/

public class GlobalVar
{
  int a = 10;
  double b = 20;
  public static void main(String[] args)
  {
    GlobalVar globalVar = new GlobalVar();
    System.out.println("the value a = " + globalVar.a);
    globalVar.print();
    System.out.println("after changed the value a = " + globalVar.a)
   }
public void print()
 {
    System.out.println("the global variable a = " + a + ",b = " + b);
    a = 30;
    System.out.println("the global variable a = " + a + ",b = " + b);
 } 
}
输出结果:
                  before changed value a = 10
                  the global variable a = 10 ,b = 20.0
                  the globa variable a  = 30 ,b = 20.0
                  after changed the value a =30
        分析:
        a与b是在print方法外面定义的,但可以在方法内部访问到并对a的值进行了修改,在main方法内部我们也可以访问到a的值。
        所谓全局变量就是在程序运行的全过程中,由程序自动向内存申请的内存空间,空间的内容可以在程序全过程中进行操纵或修改。

        局部变量:局部变量是针对于全局变量的,在程序运行的局部过程中,由程序自动向内存申请的内存空间,空间的内容在程序的局部范围内可以被操纵或修改。例如:

/*测试局部变量的操作*/

public class LocalVar
{
  public static void main(String[] args)
   {
    LocalVar localVar = new LocalVar();
    localVar.print();
   }
 public void print()
  {
   int a = 10;
   double b = 20;
   System.out,println("the local variable a = " + a + ",b = " + b);
   a = 30;
   System.out.println("the local variable a = " + a + ",b = " + b);
   }
}

输出结果:
                  the local variable a = 10,b = 20.0
                  the local variable a = 30,b = 20.0
             分析:
             局部变量只能在它的定义范围内才能被操作。这是很重要的,在写程序时一定要清楚知道自己所定义的变量的访问范围是多大,不要试图在范围以外访问变量。

          2)按照类型分 
          按照类型分,可以将变量分为基本类型变量和对象类型变量。
          所谓基本类型变量,就是指我们前面讲述的八种基本类型,除了基本类型变量以外的其它变量,都看成是对象变量。对象类型变量又可称为实例变量。

          3)按照所属范围分
          按照所属范围分,可以将变量分为类变量、成员变量。
          所谓类变量,就是用关键字static声明的全局变量,它是属于类本身的,不代表任何对象的状态。
          所谓成员变量,就是与类变量相对的,没有用static声明的其它的实例变量,它是与具体对象相关的,保持对象的状态。
         
四、变量的引用

         在java中变量的引用主要有两种方式:传值引用与值址引用。

         1、内存的分配
          java中变量主要保存在六个地方:

         1)寄存器
          对于java来讲,这是最快的保存区域。位于计算机CPU的内部,因为寄存器的数量十分有限,所以寄存器是很据需要由编译器自主分配的,寄存器没有任何控制权,在程序中也找不到任何寄存器的操作踪迹。

         2)栈
         它是仅次于寄存器的保存区域,又被称为随机访问存储区域。它是通过栈指针来进行操作的,基本类型的变量就是放在这里。但这并不是惟一放到这里的内容,还要有一个概念,那就是对象句柄,对象句柄也是放在这里的。

         3)堆
         这是一种常规用途的内存池,也就是RAM区域。在Java中我们的任务基本上都是在堆中进行,一直所说的对象就位于堆中。

         4)静态存储
         这里所说的静态是的“位于固定位置”。程序在运行期间,静态的数据将随时等候调用,它也是位于RAM中。在Java中可用static关键字指出一个对象的特定元素是静态的,但Java对象本身永远不可能置于静态存储空间。

         5)常量存储
         常最存储通常直接写在程序代码中,在Java中我们通常是用final来声明的,这样做的目的可以保证它们的值永远不被改变。

         6)非RAM存储
         这主要是针对程序外部的资源而言的。也就是说数据完全独立于程序之外,程序不运行时仍然可以存在,并在程序的控制范围之外。

         2、传值引用
          传值引用:主要是针对基本类型而言。所谓传值引用就是在进行变量的传递过程中,传递变量实际的值,是一个新的拷贝,一个变量值的改变不会影响另一个变量的改变。例如:

/*传值引用的实质*/

public class ValueReference
{
   int a = 10;
public static void main(String[] args)
   {
   ValueReference aValue = new ValueReference();
   aValue.print();
   }
public void print()
   {
   int b = a; //我们将a的值传给了b
   System.out.println("before changed value a = " + a + ",b = " + b);
   a = 30;  //现在将a的值改变,按照传值引用的理论,b的值应该是a的原来的值
   System.out.println("after changed value a = " + a + ",b = " + b);
   }
}

输出结果:
                 before changed value a = 10, b = 10
                 after changed value a = 30 , b = 10
分析:
         变量a的值传给了变量b,变量a值的改变并没有影响到变量b的值。这就是传值引用的实质,传递过去的是值的一个拷贝。

         3、传址引用
         传址引用:主要是针对对象操作的。也就是形成了多个变量操纵一个对象的状态,这种现象的结果就是任何一个对于句柄操作的变量,都会影响到其它的变量。例如:

/*传址引用的实质*/

public class Student
{
   String strName;
public static void main(String[] args)
   {
    Student aStudent = new Student();
//得到对象Student类的一个句柄aStudent
    aStudent.setStudentName("张楠");
    System.out.println("aStudent name is " + aStudent.getStudentName());
    Student bStudent = aStudent;  //将aStudent句柄复制给nextStudent
    bStudent.setStudentName("唐僧");
    System.out.println("bStudent name is " + bStudent.getStudentName());
    String name = aStudent.getStudentName();
//再看一下句柄aStudent的内容是否改变
    System.out.println("after bStudent the aStudent name is" + name);
   }
public String getStudentName()
   {
    return strName;
   }
public void setStudentName(String name)
   {
    strName = name;
    }
}

输出结果:
                 aStudent name is 张楠
                 bStudent name is 唐僧
                 after bStudent the aStudent name is 唐僧
分析:
          对象传递是传址引用。对于对象,它传递的是一个句柄的拷贝,不同的句柄操纵是一个对象,也称按址传递。
          
posted on 2007-04-28 11:04 心随Wǒ动 阅读(803) 评论(2)  编辑  收藏

FeedBack:
# re: 变量
2007-08-17 15:37 | paul
今天遇到一个基础的问题,如果全局变量和局部变量同名的话,且在局部变量作用域内该变量值已经改变,那在局部变量作用于外该变量的值是否会被改变那?我的测试的代码
class ter
{
public String s="c";
public static void main(String[] args)
{
ter er = new ter();
er.t();
System.out.println("the global s value="+er.s);
}

public void t()
{
String s="b";
System.out.println("the local s value="+s);
}
}
  回复  更多评论
  
# re: 变量[未登录]
2007-08-28 15:55 | 我心依旧
全局和局部变量名字一样也没有冲突,正如你的测试代码er.t(); 调用t方法当然是打印局部的s变量。而下边是直接用类名引用的全局变量s。

你在方法里直接使用变量s默认顺序是先找局部的,局部的找不到在去找全局的。

你用(类名.变量),当然就是直接调用全局的了。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

QQ群:9028409
QQ:29850994
点击这里给我发消息

留言簿(2)

随笔档案

积分与排名

  • 积分 - 30798
  • 排名 - 1350

最新评论

阅读排行榜

评论排行榜