【Java基础系列】2- Java的变量与数据类型
1. 内存
存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存),辅助存储器又称外存储器(简称外存)。
1.1 什么是内存
内存指的就是主板上的存储部件,CPU直接与之沟通,并用其存储数据的部件,存放当前正在使用的(即执行中的)数据和程序,它的物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路,内存只用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失。
言而总之,内存即是一块瞬时状态的存储空间,有一定的容量;
特点:内存处理速度快、存储容量小、断电后信息丢失;
1.2 什么是外存
外存包括软盘、硬盘和光盘,存放在其中的数据靠磁来维持,因此可永久保存数据。
外存处理速度慢、存储容量大、信息永久保存;
1.3 内存与硬盘的区别
- 内存的造价比较高,整个的计算机硬件资源是比较稀缺的;(所以内存得省着点用)
- 工业上的瓶颈,多数大容量的内存都是由多个内存条组成的;
1.4 计算机给java
程序多大的内存空间
java
虚拟机(java
程序),默认分配的物理内存容量是计算机1/8
;(省着点使用)
1.5 计算机存储容量的基本单位
bit
位 (8bits = 1 Byte
)Byte
字节 (1024 Byte = 1KB
)KB - MB - GB - TB - PB - EB - ZB - YB - BB - NB - DB - CB - XB
(1024进制)
2. 变量
2.1 变量的概念
- 概念:计算机内存中的一块存储空间,是存储数据的基本单元
- 整个内存就像是酒店,当中包含了多个房间;
- 房间的容量大小不同,比如:单人间、双人间…
- 每个房间都有一个唯一的门牌号;
- 酒店的房间 — 变量的组成
- 房间的类型 — 数据类型
- 房间的门牌号 — 变量名
- 房间的住客 — 值
2.2 变量的定义流程
变量的定义流程
声明
数据类型 变量名;
int money; >>> 开辟整数变量空间
赋值
变量 = 值; (= 即为赋值运算符)
money = 100; >>> 将整数值赋给变量
代码如下:
public class TestVariable {public static void main(String[] args) {// 声明变量,语法:数据类型 变量名;int money; // 在内存中开辟了一块整数空间// 赋值,语法:变量名 = 值;money = 100; // 将100赋值给 money 变量空间System.out.print(money);System.out.println("money");System.out.println("print 与 println 的区别:自动换行");System.out.println(money); // 打印变量中的值System.out.println("money"); // 双引号:打印文本} }
在
.java
文件的当中目录下打开cmd
编译:注意
.java
是强类型语言,变量的类型必须与数据的类型一致;也就是说,当money
被声明为整数int
,赋值的时候就只能赋值为整数,不能赋值其他的数据类型,不能会抛出,转换为int
会有损失的异常;
2.3 赋值运算符
- 概念:为变量进行赋值
- 变量名 = 值; 即将等号右边的值,赋值给等号左边的变量(存值)
2.4 不同类型的编程语言
- 强类型编程语言:变量的类型必须与数据的类型一致;(比如:
java、c++、c#
) - 弱类型编程语言:变量的类型无需与数据的类型一致;(比如:
JavaScript
)
2.5 变量的多种定义方式
声明变量的三种方式:
先声明,再赋值:
数据类型 变量名;
变量名 = 值;
声明并赋值:
数据类型 变量名 = 值;
多个同类型变量的声明与赋值:【了解】
数据类型 变量1 , 变量2 , 变量3 = 值3 , 变量4 , 变量5 = 值5;
举个例子:
public class TestVarDefined{public static void main(String[] args){// 声明并赋值int age = 10; // 将声明的语法与赋值的语法合二为一System.out.println(age);// 同时声明多个同类型的变量int a, b, c, d = 44, e = 55;a = 11;b = 22;c = 33;System.out.println(a);System.out.println(b);System.out.println(c);System.out.println(d);System.out.println(e);} }
打开
cmd
完成编译以及运行,如下图:
3. 数据类型
Java
中的变量具有严格的数据类型区分。(强类型语言)在
Java
语言中,任何一个值,都有其对应类型的变量;- java中的数据类型
- 基本数据类型(8种)
- 整数 - 4
- 小数 - 2
- 布尔 - 1
- 字符 - 1
- 引用数据类型
- 字符串
- 数组
- 对象
- 基本数据类型(8种)
- java中的数据类型
3.1 基本数据类型(整数)
类型 | 字节 | 取值范围(二进制) | 取值范围(十进制) | 数量 |
---|---|---|---|---|
byte | 1字节 | -2^7 ~ 2^7-1 | -128 ~ 127 | 256 |
short | 2字节 | -2^15 ~ 2^15-1 | -32768 ~ 32767 | 65536 |
int(Integer ) | 4字节 | -2^31 ~ 2^31-1 | -2147483648 ~ 2147483647 | 42亿左右 |
long | 8字节 | -2^63 ~ 2^63-1 | -9223372036854775808 ~ 9223372036854775807 |
注意:int
为整数的默认类型,如需为long
类型赋值较大整数时(超过int
类型的取值范围),需在值的后面追加L
或者小写l
;
/**基本数据类型(整数)
*/
public class TestType{public static void main(String[] args){// 数据类型 变量名 = 值;byte b = -128; // -128 ~ 127 (共计256个整数)>>> 超过取值范围会抛出异常System.out.println(b);short s = -32768; // -32768 ~ 32767 (共计65536个整数)System.out.println(s);int i = -2147483648; // -2147483648 ~ 2147483647 (共计42亿多个整数)System.out.println(i);// Java中所有的“整数字面值”的默认类型是int,当整数字面值超过int的取值范围时,则提醒“过大的整数”// 那么什么是整数字面值呢// 如上面声明的变量中,等号右边的值即为字面值long l = -9223372036854775808L; // 显示告知JVM,此值为long类型 -9223372036854775808 ~ 9223372036854775807System.out.println(l);}
}
int
类型的取值范围包含byte、short
,为什么还要有byte
以及short
呢?
因为内存是稀缺的,使用byte
存得下的时候,用byte
赋值时最合适的;
而又考虑到应用的高频性,我们不做太严格的区分,又或者说不做这样的内存节省,将来可以通过其他方式来进行优化和调整,也是可以将其这一块的内存节约出来;int
类型比较常用;
3.2 基本数据类型(小数/浮点数)
类型 | 字节 | 负数取值范围 | 正数取值范围 |
---|---|---|---|
float | 4字节 | -3.4E+38 ~ -1.4E-45 | 1.4E-45 ~ 3.4E+38 |
double | 8字节 | -1.7E+308 ~ -4.9E-324 | 4.9E-324 ~ 1.7E+308 |
- 浮点型数值采用科学计数法表示:
- 2E3 等价于 2 * 10 ^ 3(结果:2000.0)
- 3E5 等价于 3 * 10 ^ 5(结果:300000.0)
注意:double
为浮点数的默认类型,如需为float
类型赋值时,需要在值的后面追加“F”
举个例子:
/**基本数据类型(小数/浮点数)
*/
public class TestType2{public static void main(String[] args){// float 单精度浮点型,double 双精度浮点型double d = 1.2;System.out.println(d);double d2 = 1;System.out.println(d2);float f = 1.5F; // 任何“小数字面值”默认类型都是double,如果要存储到float变量中,需显示追加“F”System.out.println(f);// 科学计数法double d3 = 2E3; // 2 * 10 ^ 3System.out.println(d3);double d4 = 2E7; // 2 * 10 ^ 7 20000000.0System.out.println(d4);float f2 = 5E4F; // 5 * 10 ^ 4 追加F代表floatSystem.out.println(f2);// 取值范围的差异// float正数取值范围:0.0000000000000000000000000000000000000000000014F ~ 340000000000000000000000000000000000000.0Ffloat floatMin = 0.0000000000000000000000000000000000000000000014F; // float的最小正数 小数点右边44个0float floatMax = 340000000000000000000000000000000000000.0F; // float的最大正数System.out.println(floatMin);System.out.println(floatMax);// float负数取值范围:-340000000000000000000000000000000000000.0F ~ -0.0000000000000000000000000000000000000000000014Ffloat floatMin2 = -340000000000000000000000000000000000000.0F; // 计数单位:个、十、百、千、万、亿、兆、京、垓、秭、穰、沟、涧、正、载、极、恒河沙、阿僧祇、那由他float floatMax2 = -0.0000000000000000000000000000000000000000000014F;System.out.println(floatMin2);System.out.println(floatMax2);// double 正数取值范围double doubleMin = 4.9E-324;double doubleMax = 1.7E308;System.out.println(doubleMin);System.out.println(doubleMax);}}
3.3 基本数据类型(布尔)
类型 | 字节 | 取值范围 | 描述 |
---|---|---|---|
boolean | 1字节 | true/false | 仅可描述“真”或者“假” |
- 可直接赋值
true
/false
- 也可赋值一个结果为
true
/false
的表达式 - 注意:
Java
中的boolean
不能参与算数运算;
举个例子:
public class TestType3{public static void main(String[] args){boolean b1 = true;System.out.println(b1);boolean b2 = false;System.out.println(b2);boolean b3 = 5 > 4;System.out.println(b3);}
}
3.4 基本数据类型(字符)
3.4.1 ASCII 编码
前置知识:
ASCII
(American Standard Code for Information Interchange)美国信息交换标准代码- 基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言
ASCII
是最通用的信息交换标准,为英文字符设定了统一并且唯一的二进制编码
ASCII编码对照表:http://ascii.911cha.com/
3.4.2 Unicode 编码
前置知识:
Unicode
(万国码)是计算机科学领域里的一项业界标准,包括字符集、编码方案- 它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求(其中包含了
ASCII
编码)
我们使用jsons.cn
在线工具网站 http://www.jsons.cn/unicode/
转换一下:
3.4.3 基本数据类型(字符)
类型 | 字节 | 取值范围 | 字符编码 |
---|---|---|---|
char | 2字节 | 0 ~ 65535 | Unicode 字符集(万国码) |
Unicode
中每个字符都对应一个二进制整数,可以使用多种方式赋值- 字符赋值:
char c1 = 'A';
// 通过''
描述为字符赋值 - 整数赋值:
char c2 = 65;
// 通过十进制数65在字符集中对应的字符赋值 - 进制赋值:
char c3 = '\u0041'
// 通过十六进制数41在字符集中所对应的字符赋值
- 字符赋值:
举个例子:
public class TestType4{public static void main(String[] args){char c1 = 'A'; // 字符赋值,原生、基本的赋值方式(常用)System.out.println(c1);char c2 = 65; // 整数赋值(十进制)System.out.println(c2);char c3 = '\u0041'; // 进制赋值(十六进制)System.out.println(c3);}
}
3.4.4 转义字符
如果需要在程序中输出一个单引号字符,该如何完成?
错误用法如下:
package demo;public class TestChar {public static void main(Stringp[] args){char c = ''';}
}
编译以上的代码,将会抛出未结束的字符文字;
那么,为了解决这一问题,java
采用了转义字符来表示单引号和一些特殊符号;
转义字符 | 描述 |
---|---|
\n | 换行符 |
\t | 缩进(制表符) |
\\ | 反斜线 |
\’ | 单引号 |
\" | 双引号 |
举个例子:
public class TestSign{public static void main(String[] args){char c1 = '\'';System.out.println(c1);System.out.println("\"");System.out.println("Hello\tWorld"); // \t 制表符System.out.println("Hello\nWorld"); // \n 换行符System.out.println("\\");System.out.println("u0041");System.out.println("\u0041"); // 加了 \ 即转换为十六进制}
}
3.5 引用数据类型(字符串)
类型 | 取值范围 | 字符编码 |
---|---|---|
String | 任何 “” 之间的字面值 | Unicode 字符序列 |
- String 类型的字面取值
- String str1 = “你好”;
- String str2 = “Hello”;
- String str3 = “测试架构师”;
- String str4 = “Test Engineer”;
举个例子:
public class TestString{public static void main(String[] args){String str1 = "HelloWorld";System.out.println(str1);System.out.println("HelloWorld");String str2 = "Hello Everyone";System.out.println(str2);}
}
4. 类型转换
4.1 自动类型转换
- 自动类型转换(满足以下两种条件,才会自动转换成功,编译通过):
- 两种类型相互兼容
- 目标类型大于源类型
例如:
package demo;public class TestAutoConvert {public static void main(String[] args){short s = 123;int i = s;}
}
举个例子:
public class TestAutoConvert{public static void main(String[] args){// 整数 >> 整数short s = 123;int i = s; // 将源类型值存入到目标类型变量中(自动类型转换)System.out.println(i);byte b = 100;short s2 = b; // 自动类型转换System.out.println(s2);// 小数 >> 小数float f = 100.0F;double d = f;System.out.println(d);// 小数 >> 整数int i2 = 100;double d2 = i2;System.out.println(d2);// 字符 >> 整数char c = 'A';int i3 = c; // 自动类型转换System.out.println(i3);// 字符 >> 小数char c2 = 'a';double d3 = c2;System.out.println(d3);// boolean 无法与其他类型进行转换// boolean bool = true; // true|false// int i4 = bool; // 不兼容的类型}
}
4.2 强制类型转换
- 强制类型转换
- 两种类型相互兼容
- 目标类型小于源类型
例如:
package demo;public class TestForceConvert {public static void main(String[] args){short s = 123;byte b = s; // 将一个较大的数据类型放进一个较小的数据类型,自动转换失败,编译错误}
}
将一个较大的数据类型放进一个较小的数据类型,自动转换失败,编译错误,可以使用强制转换,代码如下:
package demo;public class TestForceConvert {public static void main(String[] args){short s = 123;byte b = (byte)s; //强制类型转换:(目标类型)值}
}
强制类型转换规则:
整数长度足够,数据完整
例: int i = 100; byte b = (byte)i; // b =100
整数长度不够,数据截断
例:int i = 10000; byte b = (byte)i; // b = 16(符号位变化,可能变为负数)
小数强转整数,数据截断
例: double d = 2.5; int i = (int)d; // i = 2(小数位舍掉)
字符整数互转,数据完整
例:char c = 65; int i = c; // i = 65
boolean 的取值为
true
/false
,不可与其他类型转换
举个例子:
public class TestForceConvert {public static void main(String[] args){// 长度足够,数据完整short s = 123;byte b = (byte)s; //强制类型转换:(目标类型)值System.out.println(b);// 长度不够,数据截断short s2 = 257;byte b2 = (byte)s2; // 强制类型转换(数据截断)System.out.println(b2);short s3 = 130;byte b3 = (byte)s3;System.out.println(b3);// 小数 强转 整数double d = 2.999;int i = (int)d;System.out.println(i);// 字符 强转 整数char c = 'A';int i2 = c; // 自动类型转换System.out.println(i2);char c2 = (char)i2; // 强制类型转换System.out.println(c2);// 字符与整数转换的注意事项short s4 = 97; // 两个字节的存储空间 取值范围 -32768 ~ 32767char c3 = (char)s4; // 强制类型转换System.out.println(c3);// 当我们把一个整数强转为一个char类型时,如果希望它可以正常呈现出字符内容,一定要保证它的整数是一个正数,它才能在我们的ASCII或者Unicode编码当中查找到对应的字符,并且保存在char的变量中加以正确的呈现short s5 = -1; // 它(-1)在ASCII编码中没有对应的字符,呈现出来的内容将会被替代为问号(无法识别)char c4 = (char)s5; System.out.println(c4);}
}
打开cmd
并编译运行:
如上图,b2
和b3
的值经过强制类型转换之后,为什么会变成1
和 -126
呢?
根据一个十进制数的组成写出其二进制,一个32位系统低八位的值分别是128,64,32,16,8,4,2,1.从大往小选择,选择可以组成该数的数字,相应的位置上写1,其余位全为0;
在我们的二进制表现形式上,每个格子下,如果有1的话,就意味着是有这个值(格子里面的值)的,如果每个值相加等于的就是我们现在的二进制的表现形式的整数;
符号位>> 0:代表正数;1:代表负数
short
类型的257
强制转换为byte
类型,由于长度不够,发生高位截断(保留128、64、32、16、8、4、2、1),因为截断之后的符号位为0,所以结果为正数1;
short
类型的130
强制转换为byte
类型,由于长度不够,发生高位截断(保留128、64、32、16、8、4、2、1),因为截断之后的符号位为1,所以结果为正数-126;
字符与整数转换的注意事项:
当我们把一个整数强转为一个char
类型时,如果希望它可以正常呈现出字符内容,一定要保证它的整数是一个正数,它才能在我们的ASCII
或者Unicode
编码当中查找到对应的字符,并且保存在char
的变量中加以正确的呈现;如果char
类型的变量接收的整数为负数,在ASCII
编码中没有对应的字符,呈现出来的内容将会被替代为问号(无法识别);
【Java基础系列】2- Java的变量与数据类型相关推荐
- Java基础系列【导读】
Java基础系列导读 Java基础 JaveWEB Java基础 基础系列[一]-- Java语言介绍 基础系列[二]-- 环境搭建 基础系列[三]-- Java基础语法 基础系列[四]-- 面向对象 ...
- 基础的java增删改查,Java基础系列(基础):Java使用Cookie增删改查操作!
什么是Cookie? Cookie是由W3C组织提出,最早由NetScape社区发展的一种机制. Cookie是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个co ...
- java中this_夯实Java基础系列7:一文读懂Java 代码块和执行顺序
目录 #java中的构造方法 #构造方法简介 #构造方法实例 #例-1 #例-2 #java中的几种构造方法详解 #普通构造方法 #默认构造方法 #重载构造方法 #java子类构造方法调用父类构造方法 ...
- [转载] 夯实Java基础系列8:深入理解Java内部类及其实现原理
参考链接: Java内部类 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tut ...
- 知其然,知其所以然之Java基础系列(一)
相信大家在最初接触Java基础学习的时候,也只是跟着课本上的描述学习,知其然,不知所以然,要想成为一个Java老鸟,不仅要学会怎么用,也要知道为何这么用.在Java基础系列的博客中,我会列举一系列大家 ...
- 夯实Java基础系列9:深入理解Class类和Object类
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 夯实Java基础系列22:一文读懂Java序列化和反序列化
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 夯实Java基础系列15:Java注解简介和最佳实践
Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...
- 夯实Java基础系列14:深入理解Java枚举类
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
最新文章
- ios 裁剪框大小_iOS实现裁剪框和图片剪裁功能
- laravel debug,http模式,日志
- HTML去掉列表前面的符号!
- SCI论文写作中的注意事项
- dorado开发模式下实现动态查询
- Win10系统添加 Win10 LTSC2019闹钟
- OpenShift 4 - 锁定被保护的 OpenShift 资源,禁止删除和修改操作
- Java中final、finally、finalize的理解
- 留存光明延续大爱 80后父母捐病儿角膜感动冰城
- FreeSWITCH mod_callcenter 整理
- Dev-C++的下载和安装
- 将Python文件打包成so文件
- R语言经纬度度分秒转小数点
- PowerDesign逆向生成数据表结构PDM文件
- 《Graphene-SGX: A Practical Library OS for UnmodifiedApplications on SGX (ATC‘17)》笔记
- 银行硬件维护维修工单小程序开发制作
- 【上海落户-个人感受】想到一个城市落户,需要提前打算。
- Linux--命名管道(FIFO)
- Python PIL.Image之制作GIF图片
- vscode 函数定义跳转与回退