本系列文章经补充和完善,已修订整理成书《Java编程的逻辑》,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接http://item.jd.com/12299018.html


赋值

上节我们说了数据类型和变量,通过声明变量,每个变量赋予一个数据类型和一个有意义的名字,我们就告诉了计算机我们要操作的数据。

有了数据,我们能做很多操作。但本文只说说对数据做的第一个操作:赋值。声明变量之后,就在内存分配了一块位置,但这个位置的内容是未知的,赋值就是把这块位置的内容设为一个确定的值。

Java中基本类型、数组、对象的赋值有明显不同,本文介绍基本类型和数组的赋值,关于对象后续文章会详述。

我们先来说基本类型的赋值,然后再说数组的赋值。

基本类型的赋值

整数类型

整数类型有byte, short, int和long,分别占用1/2/4/8个字节,取值范围分别是:

类型名 取值范围
byte -2^7 ~ 2^7-1
short -2^15 ~ 2^15-1
int -2^31 ~ 2^31-1
long -2^63 ~ 2^63-1

我们用^表示指数,2^7即2的7次方。这个范围我们不需要记的那么清楚,有个大概范围认识就可以了,大多数日常应用,一般用int就可以了。后续文章会从二进制的角度进一步分析表示范围为什么会是这样的。

赋值形式很简单,直接把熟悉的数字常量形式赋值给变量即可,对应的内存空间的值就从未知变成了确定的常量。但常量不能超过对应类型的表示范围。例如:

byte b = 23;
short s = 3333;
int i = 9999;
long l = 32323;

但是,在给long类型赋值时,如果常量超过了int的表示范围,需要在常量后面加大写或小写的L,即L或l,例如:

long a = 3232343433L;

这个是由于数字常量默认为是int类型。

小数类型

小数类型有float和double,占用的内存空间分别是4和8个字节,有不同的取值范围和精度,double表示的范围更大,精度更高,具体来说:

类型名 取值范围
float

1.4E-45 ~ 3.4E+38

-3.4E+38 ~-1.4E-45

double

4.9E-324 ~1.7E+308

-1.7E+308 ~ -4.9E-324

取值范围看上去很奇怪,一般我们也不需要记住,有个大概印象就可以了。E表示以10为底的指数,E后面的+号和-号代表正指数和负指数,例如:1.4E-45表示1.4乘以10的-45次方。后续文章会进一步分析小数的二进制表示。

对于double,直接把熟悉的小数表示赋值给变量即可,例如:

double d = 333.33;

但对于float,需要在数字后面加大写F或小写f,例如:

float f = 333.33f;

这个是由于小数常量默认为是double类型。

除了小数,也可以把整数直接赋值给float或double,例如:

float f = 33;
double d = 3333333333333L;

boolean类型

这个很简单,直接使用true或false赋值,分别表示真和假,例如:

boolean b = true;
b = false;

字符类型

字符类型char用于表示一个字符,这个字符可以是中文字符,也可以是英文字符。在内存中,Java用两个字节表示一个字符。赋值时把常量字符用单引号括起来,不要使用双引号,例如:

char c = 'A';
char z = '中';

关于字符类型有一些细节,后续文章会进一步深度解析。

一些说明

上面介绍的赋值都是直接给变量设置一个常量值。但也可以把变量赋给变量,例如:

int a = 100;
int b = a;

变量可以进行各种运算(后续文章讲解),也可以将变量的运算结果赋给变量,例如:

int a = 1;
int b = 2;
int c = 2*a+b; //2乘以a的值再加上b的值赋给c

上面介绍的赋值都是在声明变量的时候就进行了赋值,但这不是必须的,可以先声明变量,随后再进行赋值。

数组类型

赋值语法

基本类型的数组有三种赋值形式,如下所示:

1. int[] arr = {1,2,3};

2. int[] arr = new int[]{1,2,3};

3. int[] arr = new int[3];
arr[0]=1; arr[1]=2; arr[2]=3;

第一种和第二种都是预先知道数组的内容,而第三种是先分配长度,然后再给每个元素赋值。

第三种形式中,即使没有给每个元素赋值,每个元素也都有一个默认值,这个默认值跟数组类型有关。数值类型的值为0,boolean为false, char为空字符。

数组长度可以动态确定,如下所示:

int length = ... ;//根据一些条件动态计算
int arr = new int[length];

虽然可以动态确定,但定了之后就不可以变,数组有一个length属性,但只能读,不能改。

一个小细节,不能在给定初始值的同时还给定长度,即如下格式是不允许的:

int[] arr = new int[3]{1,2,3}

这是可以理解的,因为初始值已经决定了长度,再给个长度,如果还不一致,计算机将无所适从。

数组和基本类型的区别

一个基本类型变量,内存中只会有一块对应的内存空间。但数组有两块,一块用于存储数组内容本身,另一块用于存储内容的位置。

用一个例子来说明,有一个int变量a,和一个int数组变量arr,其代码,变量对应的内存地址和内存内容如下所示:

代码 内存地址 内存数据
int a = 100; 1000 100
int[] arr = {1,2,3}; 2000 3000
  3000 1
  3004 2
  3008 3

基本类型a的内存地址是1000,这个位置存储的就是它的值100。

数组类型arr的内存地址是2000,这个位置存储的值是一个位置3000,3000开始的位置存储的才是实际的数据1,2,3。

为什么数组要用两块空间

不能只用一块空间吗?我们来看下面这个代码:

int[] arrA = {1,2,3};

int[] arrB = {4,5,6,7};
arrA = arrB;

这个代码中,arrA初始的长度是3,arrB的长度是4,后来将arrB的值赋给了arrA。如果arrA对应的内存空间是直接存储的数组内容,那么它将没有足够的空间去容纳arrB的所有元素。

用两块空间存储,这个就简单的多,arrA存储的值就变成了和arrB的一样,存储的都是数组内容{4,5,6,7}的地址,此后访问arrA就和arrB是一样的了,而arrA {1,2,3}的内存空间由于无人引用会被垃圾回收,如下所示:

arrA        {1,2,3}

\

\

arrB  ->  {4,5,6,7}

由上,也可以看出,给数组变量赋值和给数组中元素赋值是两回事。给数组中元素赋值是改变数组内容,而给数组变量赋值则会让变量指向一个不同的位置。

上面我们说数组的长度是不可以变的,不可变指的是数组的内容空间,一经分配,长度就不能再变了,但是可以改变数组变量的值,让它指向一个长度不同的空间,就像上例中arrA后来指向了arrB一样。

小结

给变量赋值就是将变量对应的内存空间设置为一个明确的值,有了值之后,变量可以被加载到CPU,CPU可以对这些值进行各种运算,运算后的结果又可以被赋值给变量,保存到内存中。

数据可以进行哪些运算?如何进行运算呢?

------------------

未完待续,查看最新文章,敬请关注微信公众号“老马说编程”(扫描下方二维码),深入浅出,老马和你一起探索Java编程及计算机技术的本质。原创文章,保留所有版权。

-----------

更多相关原创文章

计算机程序的思维逻辑 (1) - 数据和变量

计算机程序的思维逻辑 (3) - 基本运算

计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算

计算机程序的思维逻辑 (5) - 小数计算为什么会出错?

计算机程序的思维逻辑 (6) - 如何从乱码中恢复 (上)?

计算机程序的思维逻辑 (7) - 如何从乱码中恢复 (下)?

计算机程序的思维逻辑 (8) - char的真正含义

Java编程的逻辑 (2) - 赋值的更多相关文章

  1. Java编程的逻辑 (51) - 剖析EnumSet

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  2. Java编程的逻辑 (93) - 函数式数据处理 (下)

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  3. Java编程的逻辑 (91) - Lambda表达式

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  4. Java编程的逻辑 (87) - 类加载机制

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  5. 《Java编程的逻辑》 - 文章列表

    <计算机程序的思维逻辑>系列文章已整理成书<Java编程的逻辑>,由机械工业出版社出版,2018年1月上市,各大网店有售,敬请关注! 京东自营链接:https://item.j ...

  6. Java编程的逻辑 (12) - 函数调用的基本原理

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  7. Java编程的逻辑 (1) - 数据和变量

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  8. Java编程的逻辑 (3) - 基本运算

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  9. Java编程的逻辑 (4) - 整数的二进制表示与位运算

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

随机推荐

  1. JVM学习笔记(三):类文件结构

    代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 实现语言无关性的基础是虚拟机和字节码存储格式.Java虚拟机不和包括Java在内的任何语言绑定,只与&quo ...

  2. Hard to prepare 2018 徐州赛区网络预赛

    题意: 就是由2k 个数 每次选一个 可以选同样的 围成一个圈 使得相邻的数同或为真  求方案数 解析: 第一个数有2k 种选择 之后的n-2个数 都有2k-1 种选择 第n个数 我们要考虑 它的左右 ...

  3. Day25-JSONP跨域请求

    1.  json 是一种数据格式, jsonp 是一种数据调用的方式.你可以简单的理解为 带callback的json就是jsonp. 2. Python里面有个模块requests, request ...

  4. 【BZOJ1970】[AHOI2005]矿藏编码(模拟)

    [BZOJ1970][AHOI2005]矿藏编码(模拟) 题面 BZOJ 洛谷 题解 随便写个高精度模拟一下就完了. #include<iostream> #include<cstd ...

  5. 【BZOJ1083】[SCOI2005]繁忙的都市(最小生成树)

    [BZOJ1083][SCOI2005]繁忙的都市(最小生成树) 题面 BZOJ 洛谷 题解 模板题. #include<iostream> #include<cstdio> ...

  6. Vitrualbox 桥接网卡界面名称未指定、Filters currently installed on the system have reached the limit、不能为虚拟电脑 打开一个新任务

    1. 桥接网卡界面名称未指定 http://wenku.baidu.com/link?url=VFG0hknsDX3VPXQoX5f-g1wUX_LBl-lOj0ZqD222kM31iVCPJKVu3 ...

  7. Linq查询条件里有可空字段比较时报错variable '<>h__TransparentIdentifier2' of type referenced from scope '', but it is not defined

    当我运行下面的linq查询时报了这个错,   1: var result = (from so in svcContext.new_sales_orderSet 2: join soitem in s ...

  8. 洛谷 P5108 仰望半月的夜空 解题报告

    P5108 仰望半月的夜空 题目描述 半月的夜空中,寄托了多少人与人之间的思念啊 曦月知道,这些思念会汇集成一个字符串\(S(n = |S|)\) 由于思念汇集的过于复杂,因此曦月希望提炼出所有的思念 ...

  9. 14.会场安排问题(L4)

    时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就是安排学校 ...

  10. AngularJs分层结构小demo

    后端mvc分层,前端也要分层才对嘛.分层的好处不言而喻.简直太清晰,容易维护.反正清爽的一逼.不信你看. 思路:分为controller层和service层.controller层再提取一个公共的层. ...