《Java基础篇》"一页知求 "(三)变量、基本数据类型、及其类型转换问题

如果你想学好Java编程语言,最最基本的,你要搞懂变量的概念。

一、变量

1、概念

jvm在其管理的内存中开辟的、用来存储数据的存储空间。我们使用变量名称来操纵(使用)这些存储空间。

2、命名规则

我们用名称来标识存储空间,因此,变量名称的命名要符合标识符语法规则

  • 可以由字母,数字,_和$任意多个组成,但是数字不能开头
  • 大小写字母敏感,需要特别注意
  • 可以使用汉字,但是不建议使用
  • 不能使用关键字,如int,for,if等
  • 尽量做到见名知意,多个单词时需要符合驼峰命名法

3、使用规则

我们是通过操作变量名来访问存储空间的,需要符合一些语法规则:

(1)变量名必须先声明和初始化

声明的含义:因java是强类型语言,因此在定义变量名时,必须先声明类型,强调该变量要存储的数据类型
                     格式: 数据类型名   变量名;
初始化含义:存储空间第一次存储数据。    
                     格式:   变量名 = 初始化值。
初始化时机:
                 1)   使用前进行初始化:int a;a = 3;
                 2)   声明类型时直接初始化:int a = 3;

(2)可以对变量中的值进行存取操作

变量是存储数据的空间,可以对其赋值,更改和操作;要把对变量的操作理解为是对其所存储的数据的操作
int  a  =  100;
a  =  a  +  200; // 将变量a中的值取出加上200的结果在存入变量a中

(3)变量的操作必须与类型匹配

int   salary;     
salary = 2000.65;//编译不通过,因为类型不匹配
double  d = 12345.6;  
int  n = d%2;//编译不通过,d%2的结果为double类型

(4)变量是有自己的作用域

作用域:从声明处开始,一直到所在大括号的结束符号为止。在此作用域中,仅能声明一次;出了作用域,变量失效,需要重新声明才能使用

4、变量的分类

按照声明时所在的位置分类:

成员变量:方法外部,类的内部定义的变量。
局部变量:方法内部定义的变量

注意:类外面不能有变量的声明

按照数据类型进行分类:

基本数据类型变量
引用数据类型变量

对于不同数据类型的变量,在内存中占得空间大小也不相同。

二、基本数据类型

java语言中的数据类型可以概括为两大类:基本数据类型和引用数据类型。

基本数据类型中共有八种: byte,short,int,long,double,float,char,boolean。我们可以把这八种基本数据类型再次归类:

整数类型:byte,short,int,long
浮点类型:float,double
字符类型:char
布尔类型:boolean

1、整数类型​​​​​​ 

Java各整数类型都有固定的表数范围和字段长度,这样不受具体OS的影响,保证了java的可移植性。

1)int类型

int是最常用的整数类型,是java语言中的整数字面量的默认类型。一个int类型的变量在内存中在用4个字节大小(32位二进制)。最大表示范围为: -2^31  ~ 2^31 -1,即 -2147483648 ~ 2147483647。

封闭式运算

两个整数运算时,可以能会出现溢出情况,即超出整数范围的运算。正数溢出,会变成负数;负数溢出,会变成正数。我们也称之为封闭式运算。

2)long类型

在表示整数时,如果int类型的范围不够用,我们可以使用long类型,一个long类型的变量在内存中占用8个字节大小(64位)。其最大表示范围为:-2^63 ~ 2^63-1。即-9223372036854775808 ~ 9223372036854775807。

在往long类型的变量中存储整数字面量时,需要以L或者l结尾。换句话说,long类型的字面量需要添加L/l字符。

时间毫秒数来存储日期和时间

JDK提供了System.currentTimeMillis()方法,返回1970年1月1日0点0分0秒时间点到当前系统时间点所经历的毫秒数,其数据类型为long,该方法经常用于计时操作。

long类型进行较大整数运算

当long类型参与较大整数运算时,需要注意int的封闭式运算问题。

2、浮点数类型

与整数类型类似,Java 浮点类型也有固定的表数范围和字段长度,不受具体OS的影响。

Java 的浮点型字面量默认为 double 型声明 float型字面量时,须在后加 f或 F。

浮点型常量有两种表示形式:

  • 十进制数形式        如:5.12       512.0f        .512   (必须有小数点)
  • 科学计数法形式    如:5.12e2      512E2     100E-2

1)范围

float和double的范围是由指数的位数来决定的。float的指数位有8位,而double的指数位有11位,分布如下:

float

1bit(符号位)

8bit(指数位)

23bit(尾数位)

double

1bit(符号位)

11bit(指数位)

52bit(尾数位)

因此,我们可以得出,float的指数范围为-127~128,而double的指数范围为-1023~1024;其中负指数决定了浮点数所能表达的绝对值最小的非零数,而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。

float的范围为-2^128 ~ 2^128,也即-3.40E+38 ~ 3.40E+38;double的范围为-2^1024 ~ 2^1024,也即-1.79E+308 ~ 1.79E+308。

2)精度

float和double的精度是由尾数的位数来决定的。

float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;

double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

3)计算误差

二进制系统中无法精确的表示1/10,就好像十进制系统中无法精确表示1/3一样。所以,2进制表示十进制会有一些舍入误差,对于一些要求精确运算的场合会导致代码的缺陷。

如: double  money  =  3.0;
        double  price  =  2.9;
        System.out.println(money-price);//看输出结果

如果需要精确运算,可以考虑使用BigDecimal类型来实现。

3、字符类型

char类型用来表示字符。字符字面量必须用单引号(‘ ’)括起来,且只有一个字符,涵盖世界上所有书面语的字符。

1)转义字符 "\"

对于不方便输出的字符,采用转义字符来表示,例如:

2)字符集

事实上,char也是一个16位无符号整数,整数范围为0~65535。每个整数都是对应字符的编码。java字符类型采用了Unicode字符集编码。Unicode是世界通用的定长字符集,所有的字符都是16位。

赋值方式有三种:

  1. 可以赋值字符,使用单引号,能且只能是一个字符
  2. 可以赋值十进制整数,范围为0~65535。
  3. 可以赋值Unicode形式:’\uXXXXX’,XXXX表示16进制数
    乱码问题(思考题)

3)char计算

因为char也是无符合整数,因此可以参与整数计算。

4、布尔类型

boolean 类型适于逻辑运算,表示某个条件是否成立。一般用于程序流程控制:

1)分支控制结构语句

2)循环控制结构语句

boolean类型数据只允许取值true和false,true表示条件成立,false表示条件不成立。

boolean类型变量经常用于存储关系运算的结果,所谓关系运算就是比较两个变量的大小相等等关系。

三、类型转换

在java语言开发过程中,我们会经常遇到基本数据类型的转换问题。

1、自动类型转换(隐式类型转换):

占内存空间小的类型自动转换为占内存空间大的数据类型。数据类型按占内存大小排序为:

当有多种类型的数据混合运算时,系统首先自动将所有数据转换成占内存空间最大的那种数据类型,然后再进行计算。

byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。

2、强制转换

占内存空间大的类型转换为占内存空间小的数据类型(参考上图),需要强制语法:(需要转成的类型)变量

注意:强制转换有可能出现精度损失或溢出

案例:

int a = 100;
int b = 200;
long c = a + b;//自动将int转换成long

long num = 1024L * 1024*1024*4;
int j = (int) num;//会产生溢出

double pi = 3.141592653589793;
float f = (float) pi;//会造成精度损失

------------------------------------如有疑问,敬请留言--------------------------------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值