java 1.1 变量和数据类型
不管是java程序还是你电脑里运行的任何程序,程序都是在内存运行的.
电脑加了根内存条,有时候会发现,程序运行的流畅了,因为计算机程序都是在内存运行的,内存不够,当然会卡
程序运行是在内存里,程序的数据也必然是保存在内存里的.
那在内存里保存一个数据,他是会有一个地址的,计算机保存的地址会是一个16进制的数字.
这也就意味着日后想要调用这个保存的数据,那么就必须找到这个数据所对应的地址,这是一个萝卜一个坑的.
这样太麻烦了,第一地址不好表示在程序当中,第二地址不方便记忆
所以这时候就需要用到变量了,可以用变量来代替不方便的地址
比如说可以用字母来表示这些数据,用a代替这个,用b来代替那个,这样就不用去操作地址了
变量:就是用来方便表示数据在内存中的内存地址的,变量对应的数据是可以改变的
变量的使用:
分为三个步骤
1.声明变量(变量最终目的是为了储存数据,数据是储存在内存地址里的,声明变量实际上就是在创建内存地址,创造个坑让你放内容数据)
2.变量初始化(给变量赋值,说的通俗化一点,就是刚刚把地址建好了,现在得把内容放进去了,让这个变量指向这个值)
3.使用变量
java当中声明变量,相对而言比起其他要麻烦一点,因为java是一种"强类型语言",他把数据分为不同的类型,就像进图书馆一样,有地理类书籍,文学类书籍,都分类进行管理,这样更方便.
在java当中,任何一个数据它都是拥有自己类型的
所以声明变量的语法格式是:数据类型 变量名;
结尾要加上封号结束,就像写完一句话加个句号一样.
变量赋值的语法:变量名 = 值;
等于号在java中就是赋值的意思
使用变量的语法:打印输出,进行计算(以后学了方法,可以方法传参)
注意:变量初始化了才能使用(这个很好理解,你要有这个变量你才能用,你没有变量你怎么用呢?)
接下来我们就按照这个步骤去写一下
数据类型还没有学,等等学,那就先写一个java里的类型
使用方式1:
1.声明变量
(int表示整数类型)
int a;
2.初始化变量
(初始化变量指在程序运行前为变量分配一个初始值的过程)
(因为int表示整数,所以赋值的内容就只能是一个整数)
a = 10;
3.使用变量
System.out.println(a);
(快捷键sout+tab)
(注意括号里的a是变量,变量是不加引号的,加了引号就不是变量的含义了)
(System.out.println(),是一个用于在控制台输出内容的方法)
(运行后,程序的输出结果就是10,a代表的就是10,输出a,就是输出10)
使用方式2:
1.声明变量 2.初始化变量
(第一步和第二步放在一起实现简写)
int b = 20;
(变量名不要重名)
3.使用变量
System.out.println(b);
(运行后,程序的输出结果是20)
使用方式3:
(变量可以连续定义)
int c,d,e = 10;
(这句化中 同时声明了三个变量)
(但需要注意的是,有个特别容易混淆的概念,其中c和d并没有被赋值,只有e被赋值成10)
这句话相当于int c ;int d; int e = 10;
标识符的命名规则
标识符(包含变量名,类名,包名,方法名...)
1.标识符只能由数字,字母,下划线,$组成
2.标识符不能使用数字开头 a1(对) 1a(错)
3.标识符不能使用java中的保留字和关键字(关键字有哪些慢慢学就都知道了)
4.标识符要使用驼峰命名法
大驼峰(首字母大写,而后每一个单词首字母都大写),应用在类名、接口名
比如说:HelloWorld
小驼峰(首字母小写,而后每一个单词首字母都大写),应用在变量名、方法名
比如说:productNumber
5.见名知意(特别是项目开发中)
数据类型
(回顾一下,前面说了使用变量有三个步骤,声明变量,变量赋值,使用变量)
(其中声明变量中包含数据类型和类型名,接下来就开始学习数据类型)
数据类型(java是强类型语言,在定义变量的时候必须要指定数据类型)
java里数据类型主要分为两大类
1.基本数据类型(在java语言语法中已经定义好了的类型)
(基本数据类型里又分为四小种,八类)
(1).整数类型
一.byte
二.short
三.int
四.long
(2).浮点类型(小数)
一.float
二.double
(3).布尔类型
一.boolean
(4).字符类型
二.char
定义byte类型的变量
byte a = 10;
输出一下
System.out.println(a)
输出结果是10
定义short类型的变量
short b = 30;
System.out.println(b);
输出结果是30
定义int类型的变量
int c = 100;
System.out.println(c);
输出结果是100
定义long类型的变量
long d = 101;
System.out.println(d);
输出结果是101
那这四个类型都能表示整数,有什么区别呢?
范围上的区别,超出类型的取值范围就会报错,下面是类型取值范围.
| 类型 | 所占字节 | 所占位数 | 取值范围 |
|---|---|---|---|
| byte | 1字节 | 8位 | -2^7 ~ 2^7-1 |
| short | 2字节 | 16位 | -2^15 ~ 2^15-1 |
| int | 4字节 | 32 | -2^31 ~ 2^31-1 |
| long | 8字节 | 64 | -2^63 ~ 2^63-1 |
那为什么取值范围规定成这样,是以什么标准规定的?
一个8位的二进制数最多能表示256个不同的数
最大的8位二进制数是11111111,这个数字代表255,那为什么说可以表示256个数,因为还有一个00000000,加上去就是256个数了.
所以可以简单理解为,8位的二进制数总共有2^8=256种不同的编码组合
实际运用当中,最高位并非代表数字,而是一个符号位,用于表示正负数.
最高位是"0"就表示这个数是一个正数
最高位是"1"就表示这个数是一个负数
所以byte的最大数是01111111=127,最小数是10000000=-128
那问题又来了,都说了1代表负数,那10000000,不代表负零嘛?
计算机没有这么傻,如果10000000代表负0,那00000000算什么,代表正零嘛?零有正负嘛?
所以很明显如果10000000用来表示负零,这就是浪费空间,所以干脆呢,就把计算机的这个数字设定成一个明数,就告诉你,这个数字,就是"-128",就不再是表示负零了.
平时开发就用int,如果int表示不了,这个时候用long
定义float类型的变量(要特别注意,float定义小数的时候需要在后面加上F,F的大小写不区分,不加F表示不了)
float e = 1.1F;
输出一下
System.out.println(e)
输出结果是1.1
定义double类型的变量(double后面就不需要加上字母d,当然你加了也不影响)
double f = 1.2
System.out.println(f)
输出结果是1.2
那float和double的区别是什么呢?
也是范围上的区别,double能表示小数的精确度,要比float要高
| 类型 | 所占字节 | 所占位数 | 取值范围 | 有效位数 |
|---|---|---|---|---|
| float | 4字节 | 32位 | ±3.4E+38 | 7位 |
| double | 8字节 | 64位 | ±1.7E+308 | 16位 |
这个取值范围怎么推导出来的,这里就不讲了
平时开发就用double,double的精确度比float要高,可以达到16位,那如果有小数用double都表示不了了呢?那就表示不了了
定义boolean类型的变量(布尔类型表示真假,所以只有两个取值,true 真,false 假)
boolean h = true;
System.out.println(h)
输出结果是true
定义char类型的变量(注意:在java中""表示字符串,''表示字符,char是字符类型,不是字符串,不要搞错了,char类型只能表示一个字符)
字符:各个国家的文化符号
每一个文化符号都对应有一个字符编码编译完后的二进制的数字,所以能存在计算机里.
字符编码有,ASCII码,UTF-8,GBK等等
char有三种表示方式,
方式一:使用''表示
char i = 'a'; (单引号内超过两个字符会报错,因为char只能表示一个字符)
System.out.println(i)
输出结果是a
方式二:使用数字表示(因为一个char占两个字节,1个字节8位,2个字节就是16位,16位最多可以表示多少数字呢?2^16=65536,还要包含零,所以char的范围是0~65535)
char j = 97;
System.out.println(j)
输出结果是a(Ascii码表里,97就是代表a,98代表b)
方式三:可以使用16进制表示
char k = '\u0000';
System.out.println(k)
输出结果是空格(/u0000就表示空白字符)
定义字符串类型的变量(字符串必须使用""表示)
String L = "cxk";(这样就能表示一个字符串类型的变量)
System.out.println(L)
输出结果是cxk
2.引用数据类型(除了基本以外的类型都叫引用类型)
这里就不聊了
OK,这节课就把八大数据类型做了个基础的介绍
总结来说,开发中,整数类型建议用int,浮点类型建议用double,布尔类型和字符类型就没得选了,就一种,就用boolean和char.
补充:
数据类型中使用的细节
1.在java中出现的任意一个整数默认当做是int类型
2.在java中出现的任意一个小数默认当做是double类型
什么意思呢?
当你定义一个long的数据类型
long a = 100000000000
输出结果是报错的
那long的范围是很大的,是超过12位数的,那为什么会表示不了呢?
因为你就算定义了变量a是long的数据类型,java中出现的任意一个整数默认还是int类型,而int的最大值是2147483647,是一个十位数,所以会报错
注意:定义long类型的变量的时候尽量加上L
long a = 100000000000L
加上L以后就不会报错了
当你定义个float的数据类型
float b =1.2
输出结果是报错的
因为在java中出现的任意一个小数默认当做是double类型
所以注意:定义float类型的变量的时候尽量加上F
float b =1.2F
这样就不报错了
至于说为什么有的时候不加也可以呢,这是下一个知识点,数据类型转换里面给大家讲解的一个点
转义字符
(转变这个字符本身的含义)
转义字符: \ 表示转义
\字符串 表示转义字符
常见的转义字符串
\n 表示换行
\t 表示制表位(tab)
\ 把斜杠转义成没有含义
在Java中""里不能再出现""
那我想把一个字打上引号怎么办
"棒",像这样用转义字符把引号变成一个没含义的符号就行了
数据类型的转换
1.为什么要数据类型转换?
因为java很严格,要求两边数据类型一样才能进行运算
好比你有一堆苹果(整数类型)和一堆碎苹果(小数类型),你要放在一起数,就得先统一下类型.
2.如果等号两边数据类型不一致,那么就要进行数据转换.
a、自动类型转换(隐式类型转换)
在数据类型兼容的情况下,将小的数据类型转换成大的数据类型,这个时候是自动转换的(我们不需要做任何操作)
例:byte a = 10
int b = a
b是int类型,a是byte类型,这时候居然没报错,这是因为发生了自动类型转换
小的转大的,就会发生自动类型转换
一般高级语言都是从等号右边执行到等号左边,所以是把右边赋值到左边,小的赋给大的,这个时候时候就发生自动类型转换.
b、强制类型转换(显式类型转换)
在数据类型兼容的情况下,将大的数据类型转换成小的数据类型,就需要强制类型转换了
例: int c = 20
byte d = c
c是int类型,d是byte类型,这个时候就报错了,因为等号左边的数据类型比右边的数据类型要小,大的转小的就不是自动转换了,需要强制类型转换.
那强制类型的语法是什么呢?
在类型前面加个小括号,里面写入想要转换的类型
int c = 20
byte d = (byte)c
这样就不报错了
3.数据类型转换的细节
a、boolean类型不参与任何的数据类型转换(不能将boolean转换成其他类型)
b、8大基本类型除去boolean还剩七个,其中byte(1字节)<char和short(都是2字节)<int<long<float<double
这地方肯定有人好奇,刚刚往上瞄了一眼,float占4个字节,long占8个字节,float凭什么比long还大.
那我告诉你,float比long大的多的多的多的多,因为float在计算机里存储的时候,虽然只占4个字节,但是他所能表示的数字,要比long要大很多
c.在java中,byte,short,char在参与计算之前会将自身自动转换成int类型.
byte b1 = 1;
byte b2 = 1;
b2 = b1 + b2;
这个就会报错,因为byte b1 和 byte b2参与了计算,就自动转换成int类型了,那等号右边就是int左边是byte,等号右边数据类型比左边大,大转小,数据类型不能自动转换,所以就报错了.
char g = 'a'
System.out.println(g+1);
输出结果是98
为什么字母a加了个1会变成98呢?,因为char在参与计算时会把自己的数据类型转化成int类型,ASCII码里的a代表的数字是97,97+1就是98了
d.强制类型转换会造成数据丢失
int h = 128;
byte i =(byte)h
system.out.println(i)
输出结果是-128
画一个表格,127是这么表示的
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
|---|
128是不是等于127加一啊,那byte最大也只能表示127
那你强行要表示128,实际上就是127+1呗
哪个这个数字加一变成多少了呢?
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|---|
那这个数字是多少?这个数字是负的128
那有一道面试题,问i+i<i 存不存在?
答案是存在的.
上面不就是一个正数加一个正数变成一个负数了嘛
原因就是,发生强制转换的时候,是有可能会造成数据丢失的
4.数据类型自动提升
表达式中只要有一个最大的类型,他会把其他计算的结果提升为最大的类型.
在计算的表达式中,有double类型的时候,计算的结果就是double
在计算的表达式中,有float类型的时候(没有double),计算的结果就是float
在计算的表达式中,有long类型的时候(没有double和float),计算的结果就是long
在计算的表达式中,有int类型的时候(没有double和float和long),计算的结果就是int
在计算的表达式中,有byte,short,char类型的时候(就算没有int),计算的结果也是int
double j = 1.2;
int k = 1;
int l = j + k;
这个就报错了,因为J是double类型,k是int类型,有double类型的时候,计算结果就是double类型,double比int大,double是不能自动转化成int的.
所以得这么写.
double l = j + k;
这样就不报错了

浙公网安备 33010602011771号