1.1 变量与常量

  我们在开发中会经常听到常量和变量,那么常量和变量指的又是什么呢?顾名思义,在程序执行过程中,其值不能被改变的量称为常量,其值能被改变的量称为变量。变量与常量的命名都必须使用合法的标识符。

1.1.1 常量

  在程序运行过程中一直不会改变的量称为常量(constant),通常也被称为“final变量”。常量在整个程序中只能被赋值一次。在为所有的对象共享值时,常量是非常有用的。常量是不能改变的值。常量通常会被修饰为final static,final意味着这是不能修改的值,static是静态,被static修饰的值可以直接通过类名调用,减少了因为对象创建而在内存空间分配内存,减轻了内存空间的压力。常量可以是基本数据类型,也可以是引用类型,如我们常见的单例。

1.1.1.1 常量的声明以及注意事项

  在Java语言中声明一个常量,除了要指定数据类型外,还需要通过final关键字进行限定。声明常量的标准语法如下:

    final 数据类型 常量名称[=值]

  常量名通常使用大写字母,但这不是必须的。很多Java程序员使用大写字母表示常量,是为了清楚地表明正在使用的常量。

  当定义的final变量属于“成员变量”时,必须在定义时就设定他的初值(这和类的加载有关系,当类被加载完成后再动态为常量赋值会产生错误,但是如果我们的常量指向的是另一个索引,那么我们发现常量就变得并非不可改变了,如 String str1 = str2 String str2 = "123",此时由于str2是可以改变的,所以会造成常量str1的实际内容发生改变,但是常量str1的索引指向却是始终指向str2的),否则将会产生编译错误。当常量要被静态方法引用时,那么必须将常量静态化或者通过实例调用(通常将常量final static也是我们的一个选择组合)。

  注意:在静态方法中不能调用非静态的方法和引用非静态的成员变量?如何理解?

  答:有static修饰的方法或变量,在程序运行时先初始化静态的方法和变量。在这之前非静态的还未初始故不能调用。若需调用要先静态化。

1.1.1.2 常量的分类

  Java中常量主要分为两大类:字面值常量和自定义常量

字面值常量又下面几种:

  • 整数常量:所有整数,无穷多,正整数、负整数,例如:1、2、0等;对于整数有四种表现形式
  • 小数常量:包含所有小数,也叫浮点数,例如:1.2、2.0、等;
  • 布尔型常量:较为特殊的常量只包含两个数值(true\false);
  • 字符常量:将一个字符或符号用‘ ’标识;
  • 字符串常量:将一个或多个字符用“ ”标识;
  • Null常量:只有一个数值就是null;

【例4.13】创建一个类ConstantPractice,被对其进行一些验证;

class ConstantPractice{
static final double dou = 23.23; //定义的final变量属于“成员变量”时,必须在定义时就设定他的初值,当它会在静态方法中被引用时,那么必须让它成为静态常量,否则将会产生编译错误"无法从静态上下文中引用非静态"
final boolean boo = true ;
public static void main(String[] args){
final int a ;
int s = 34 ;
a = 23 ;
// a = 23 ; //当我们已经声明一个常量并对其赋值,那么再次赋值会出现错误"可能已分配变量"
System.out.println(a);
System.out.println(dou);
}
}

  注意:常量和变量有一点不同,变量可以在运行时赋值,所以成员字段可以未经初始化就被使用,但是常量不能在运行时改变,所以常量应该在声明时就初始化,否则编译不通过。

1.1.2 变量

1.1.2.1 变量的原理和声明

  变量的使用是程序设计中一个十分重要的环节。定义变量就是要告诉编译器(compiler)这个变量的数据类型这样编译器才知道需要配置多少空间给它,以及它能存放什么样的数据。在程序运行时空间内的值是变化的,这个内存空间就称为变量。为了便于操作给这个空间取个名字,称为变量名。变量的命名必须是合法的标识符。内存空间内的值就是变量值。在声明变量时可以是没有赋值,也可以是直接赋给初值。

  从本质上讲,变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个变量使用前必须要先申请(声明),然后必须进行赋值(填充内容),才能使用

简单来说我么可以将其总结为下面这几点:

变量的概念

² 内存中的一个存储区域

² 该区域有自己的名称(变量名)和类型(数据类型)

² 该区域的数据可以在同一类型范围内不断变化

为什么要定义变量

² 用来不断的存放同一类型的常量,并可以重复使用

使用变量注意

² 变量的作用范围(一对{}之间有效)

² 初始化值(成员变量不赋值是有默认值的)

变量的声明(注:格式是固定的,记住格式,以不变应万变。

数据类型    变量名  =  初始化值;

 

 

理解:变量就如同数学中的未知数。

【例4.14】创建一个VariablePractice类,并进行一些操作,进而分析。

class VariablePractice{
static int age ; //当变量要被静态方法引用时,变量要静态化
static char char1 = 'r' ;
public static void main(String[] args){
age = 78 ;
int 年龄 = 26 ;
System.out.println("大龄青年你的年龄是: "+年龄);
System.out.println(age);
System.out.println(char1);
}
}

假设上面两个变量定义在方法体中,则程序加载到程序区中。当执行此行程序代码时,会在数据区配置空间给出这两个变量。

1.1.2.2  变量的命名

  变量虽然是由程序与所命名的,但是变量的命名却不是任意的,需要遵循一定的规则。Java中变量的命名规则如下:

  • 变量名必须是一个有效的标识符。变量名必须使用Java语言中合法的标识符,即以字母、数字和下划线及$组成,且首字母不能是数字,还不可以使用关键字。
  • 变量名不能重复。如果存在两个相同的变量名(成员变量和局部变量不在此列),那么程序在运行时就不知道调用哪个变量了。
  • 变量名称应该见名知意。命名最好能够通过变量名知道变量的内容,增加可读性;方便维护。

  在Java语言中允许使用汉字或其他语言文字作为变量名,如“int 年龄 = 21”,在程序运行时并不会出错,但还是建议不要这么命名。

  变量名实际上只是一个指针指向内存中变量的那块内存区域。

1.1.2.3 变量的有效范围---成员变量、局部变量

  由于变量被定义出来后只能被暂放到内存中,等到程序执行到某一个点,该变量会被释放掉,也就是说变量有它的生命周期。因此,变量的有效范围是指程序代码能够访问该变量的区域,若超出该区域则在编译时出现错误。在程序中一般根据变量的“有效范围”将变量分为“成员变量”和“局部变量”。

成员变量

  在类体中被定义的变量称为成员变量(也叫字段),成员变量在整个类中都有效。类的成员变量又可分为两种,即静态变量和实例变量。下面我们通过一段代码来了解一下。

【例4.15】声明静态变量和实例变量,示例代码如下:

class var{
int x = 45 ;
static int y = 90 ;
}

  其中,x为实例变量,y为静态变量(也称类变量)。如果在成员变量的类型前面加上关键字static,这样的成员变量称为静态变量。静态变量的有效范围可以跨类,甚至可以达到整个应用程序之内。对于静态变量,除了能在定义它的类中存取,还能直接以“类名.静态变量”的方式在其他类中使用。

局部变量

  在类的方法体中定义的变量(方法内部定义,“{”与“}”之间的代码中声明的变量)称为局部变量。局部变量只在当前代码块中有效。通俗的理解就是在其所在的一对大括号中有效,出了这个大括号就没有效了,在其它类体中不能调用该变量。

  在类的方法中声明的变量,包括方法的参数,都属于局部变量。局部变量只在当前定义的方法内有效,不能用于类的其他方法中。局部变量的生命周期取决于方法,当方法被调用时,Java虚拟机为方法中的局部变量分配内存空间,当该方法的调用结束后,则会释放方法中局部变量占用的内存空间,局部变量也将会销毁。

  局部变量可与成员变量的名字相同,此时成员变量将被隐藏,即这个成员变量在此方法中暂时失效。举例证明如下:

【例4.16】在VariablePractice类中我们进行如下测试

class VariablePractice{
static int age ; //当变量要被静态方法引用时,变量要静态化
static char char1 = 'r' ;
final int test = 99 ;
public static void main(String[] args){
age = 78 ;
int 年龄 = 26 ;
int test = 87 ;
System.out.println("大龄青年你的年龄是: "+年龄);
System.out.println(age);
System.out.println(char1);
System.out.print(test);
}
}

  如上我们发现当存在一个成员变量时,我们在定义一个局部变量,且它们名字相同,这时在该局部变量所在方法中,成员变量暂时失效。

  成员变量和局部变量都有各自的有效范围:

1.1.2.4 从内存看局部变量和成员变量

  上面我们了解了成员变量和局部变量,这节我们从内存角度来看看局部变量和成员变量。成员变量不管是类成员还是实例成员,它们都会存放在方法区或堆中,在这两区域有一个共同点,那就是线程共享,这就意味着,这两个变量的声明周期会随着线程的调用而产生生命周期,随着线程的消亡或垃圾回收而死亡。局部变量则不同了,局部变量定义在方法体中(或者局部代码块),而方法的运行是在栈中的,栈是线程私有的,也就是每个线程都会有自己的栈空间,方法被调用则进栈,此时局部变量存放在局部变量表中,方法执行完毕则出栈此时局部变量表也会随之消亡,从上面我们可以看到局部变量和成员变量存放的位置不同,其生命周期是很大差别的,往往成员变量要比局部变量的生命周期要长一些;

Notes 20180306 : 变量与常量的更多相关文章

  1. Java程序,基本数据类型、、数据类型转换、变量和常量、常用运算符

    一.基本数据类型 整数类型:byte.short. int(常用).long(较常用)     定义某个变量          int  a=10: 浮点类型(小数):float.double(常用) ...

  2. PHP中的变量与常量详解

    几乎所有的编程语言都会涉及到变量和常量这两个概念,PHP也不例外.本节将介绍PHP语言中的变量和常量的应用方法. 一.什么是变量和常量 在程序执行的过程中,变量存储的值可以随时改变,而常量存储的值是不 ...

  3. Java 静态变量,常量和方法

    static 关键字 例如:在球类中使用PI这个常量,可能除了本类需要这个常量之外,在另外一个圆类中也需要使用这个常量.这时没有必要 在两个类中同时创建PI这个常量,因为这样系统会将这两个不在同一个类 ...

  4. [.net 面向对象编程基础] (5) 基础中的基础——变量和常量

    [.net面向对象编程基础]  (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...

  5. iOS开发Swift篇—(二)变量和常量

    iOS开发Swift篇—(二)变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3.9倍 ...

  6. php标记,变量,常量

    php标记 语法:有4种书写格式 1.<?php ... ?>  强烈推荐使用. 如果当前 php的代码段,是整个文档的最后一段,可以省略结束标记?(建议省略) 每句语句都要以分号;结束. ...

  7. Swift学习笔记--变量与常量

    1.Swift是一门强类型语言,不能为变量赋予其自身数据类型之外的值: 2.声明变量使用var关键字,声明常量使用let关键字: 3.声明变量或常量时没有对其指定类型且赋予了初值,则编译器会自动推断常 ...

  8. Oracle基础 PL-SQL编程基础(1) 变量和常量

    一.什么是PL-SQL PL-SQL是结合了Oracle过程语言和结构化查询语言(SQL)的一种扩展语言.具体来说,PL-SQL就是在普通的SQL语句的基础上增加了编程语言的特点,将数据操作和查询语句 ...

  9. 李洪强iOS开发Swift篇—02_变量和常量

    李洪强iOS开发Swift篇—02_变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3. ...

随机推荐

  1. 第1章 初识CSS3

    什么是CSS3? CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari.firefox.opera.甚至360都已经支 ...

  2. 小任务之Canvas绘制时钟

    背景图的绘制(大圆.数字.小圆点) 掌握基础知识:圆的绘制(arc方法),关于圆的弧度的计算,数学中关于sin cos的用法 圆的弧度为2*Math.PI 12个数字分得弧度每个为2*Math.PI/ ...

  3. js对象之间的继承

    js的对象之间的继承抛弃了原型与构造器的概念,而转为字面量对象之间进行属性拷贝的方式进行继承. 首先我们来写一个封装好的继承函数: function extend(parent){ var child ...

  4. require'模块化jquery和angular问题

    require 模块化开发问题,正常自己写的模块 是exports 导出一个模块 //模块化引入jquery 不同和问题 require 引入jquery swiper .... 插件和库的时候需要 ...

  5. json字串转换成泛型类

    webrequst发送到指定的url using System; using System.Collections.Generic; using Newtonsoft.Json; using Syst ...

  6. SQL Server ->> PERCENTILE_CONT、PERCENTILE_DISC 和 PERCENT_RANK 函数

    PERCENTILE_CONT和PERCENTILE_DISC都是为了计算百分位的数值,比如计算在某个百分位时某个栏位的数值是多少.他们的区别就是前者是连续型,后者是离散型.CONT代表continu ...

  7. 【Leetcode】【Medium】Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  8. 在win7 windows 上编译 beego 上传到 linux 去执行

    在beego的项目目录下,执行: GOOS=linux GOARCH=amd64 go build So easy!但是却搞了好久! 参考连接:http://blog.csdn.net/changji ...

  9. linux中进入mysql时报错Access denied for user 'root'@'localhost' (using password: YES)解决方案

    之前在linux中装完mysql后直接在命令行窗口输入mysql就会进入数据库了,但是今天输入mysql命令后直接报错,如下图: 之后输入:mysql -uroot -p 提示输入密码:***** 还 ...

  10. 如何深入理解一套MQ消息中间件

    怎样算是理解了一套MQ中间件呢?原来一知半解的我列了几个维度:demo跑起来,理解其投递次数的语义,理解其事务的特性等等.这是一种角度,但总有种看山不是山的一知半解的感觉.再问一层,比如为什么Kafk ...