Java语言基础-03-数据和标识符
所谓数据和标识符,就是要告诉大家。在java中,怎么定义变量常量,怎么命名符合规范,数据的类型有哪些等等这些所有语言中都会涉及的内容。
这部分内容相对“简单” 而 枯燥。包括后面要说的数组啦、运算符啦、流程控制语句啦都会具备这种【简单】【枯燥】的属性。 但它们又是所有编程语言的基础,虽然核心思想一样,但语法却都各有不同。
所以,我们就快速带过,说一些核心的内容,让大家快速知道java中是怎么命名变量、声明变量、做流程控制的就好了。
当然,简单的东西不代表没有深度,在大家【搬砖】的每个日日夜夜,会天天和这些内容打交道的,如果你深入去研究这些简单的内容,会发现,其实里面也大有乾坤的。只是,这些乾坤,在介绍Java语言基础的章节,我们就不展开了。
1. 标识符
可以使用 数字、字母、下划线、美元符号。不能以数字开头,不能包含空格。
严格区分大小写、不能是关键字
标识符的命名最好能反映出其含义
类名:建议首字母大写
变量名或方法名:建议从第二个单词开始首字母大写
包名:建议所有单词都小写
常量名:建议所有单词都大写,单词间用 _ 分隔。
int a1;//变量名 string fileName;//变量名 int static; //错 关键字不能用 class Student //类名 public void eat()//方法名 package com.aaa.bbb//包名 final int MY_PI=3.14 //常量名 复制代码
2. 变量
变量的本质是一个代表一块JVM中的内存区域的名字。用来存储一个数据(值),一般而言,一个变量具有如下要素:
数据类型:每一种变量一定对应一个具体的数据类型,表示该变量能存储什么类型的值
变量名:通过变量名访问JVM内存区域上的数据(即:访问变量中存的数据)
值:顾名思义,就是变量所指向的这块jvm内存区域上存储的值,变量中的值是可变的
int age;//1.声明 age = 29;//2.初始化 int myAge = 28; //声明的同时进行初始化 复制代码
OK,这就是变量的概念,基本就这些内容,是不是很简单啊。
3.常量
常量更简单,一句话概括:常量就是值不可以改变的变量。那么,如何做到值不可以改变呢?
final double PI = 3.14; final int MAX_THREAD_COUNT = 10; 复制代码
大家看到了,所有常量都具有以下两个特点:
final 修饰,代表这个变量的值不可改变,即为常量
名字大写,这是常量的书写规范(规范这东西,就像道德一样,你不遵守也不会报错,但建议遵守,这就是书写代码的道德规范)
4. 数据类型
Java是强类型语言,定义变量时必须指定数据类型,Java中的数据类型,大致分为以下种类。
⚠️:上面说:定义【变量】时必须指定数据类型。虽然没说【常量】,但你可千万别误以为定义【常量】不需要指定数据类型哦。他们是一样的。常量就是值不可变的变量。后面所有概念,我们统一用【变量】称呼,大家结合上下文理解,我就不再单独强调某个概念里的【变量】是否包含【常量】的意思了。
那么,Java中有哪些数据类型呢?看下图:
啥是基本数据类型?你可以简单的理解为它们是java语言中,数据的"最小单位",它们被存储在栈空间中,其存储的值,就是其真实的值。
啥是引用数据类型?你可简单的理解为,他们是对基本数据类型的包装,它们的真实值存在堆空间中,他们自己在栈空间中,其存储的值,是其真实值在堆空间的地址。
懵了?看图:
基本数据类型:我下载了一部名为《学习资料》的压缩文件。解压后发现,里面真的都是xxx.avi。 引用数据类型:我下载了一部名为《学习资料》的压缩文件。解压后发现,里面都xxx.torrent。
下面,我们再说一些关于数据类型需要注意的点:
⚠️:字符串不是基本数据类型,字符串属于
类
,里面封装了字符数组。也就是引用数据类型的一种,其字面值表示为双引号括起来的一个或多个字符⚠️:浮点类型是不精确的,double和float主要在于精度的不同。
⚠️:集合(List、Set、Map)属于数据结构,不是数据类型。(我说的是【集合】,不是【数组】哦)
⚠️:字节(8bit),byte(1字节),short(2字节),int(4字节),long(8字节)。
⚠️:java中,所有数值类型所占的字节数,与平台无关(在任何操作系统,cpu架构上,都一样)。知道为啥么?想想?因为JVM啊。
好,下面我们来快速过一遍这些数据类型。这块内容有些枯燥,而且都是细节。所以我们就不详细展开长篇大论了,迅速过完就好了。后面你整个职业生涯都会和他们打交道的,再慢慢熟悉吧。
布尔类型(boolean)
布尔型:boolean(1字节)
只能存两个值之一,要么是true
,要么是false
。
boolean isOpen = true; 复制代码
整数类型
整数类型:byte(1字节),short(2字节),int(4字节),long(8字节)
long类型的值,后面要加l或L
int age = 18; long count = 888888L; 复制代码
浮点型
float(4字节),double(8字节)
大概精度范围:float:小数点后7位,double:小数点后15位
float类型的值,后面要加f或F
浮点数存储的方式:一部分具体数据,另一部分表示幂值
double money = 8888888.00; 复制代码
字符型
char(2字节)
char类型的值,用 '一个字符' 表示。或者用 '转译字符'表示。或者用 '\uUnicode编码值'。
public static void charTest(){ char a = 'a'; //a //char b = 'ab'; //错 char c = '\t'; //转义字符 char d = '好'; //好 char e = '\u2392'; //⎒ char f = 222; //Þ } 复制代码
当然,也可以给char类型的变量赋值为一个表示范围内的整数。也会自动按照编码表进行转译。
5.类型转换
自动类型转换
从存储容量小的类型的值赋值存储容量大的类型的变量时,系统会自动完整类型转换。
byte-》short-》int-》long-》float-》double
char-》int
boolean类型不参与类型转换
⚠️:byte、short、char类型,如果进行算数运算之后,都会自动升级为int类型。
public static void change(){ short a = 100; short b = 1; //short c = a+b; 错,a+b会自动提升为int int c = a+b; long d = a+b; } 复制代码
强制类型转换
把存储范围大的类型的值,赋值给存储范围小的类型时,会报错。此时,必须进行强制类型转换
小类型 a = (小类型)大类型值 复制代码
double-》float-》long-》int-》short-》byte
int-》char
boolean类型不参与类型转换
⚠️:强制类型转换的弊端:轻则损失精度(截断),重则造成溢出
double d1 = 12.9; int i1= (int)d1; //12,损失精度 int i2 = 128; byte b1 = (byte)i2; //-128 ,溢出 复制代码
当然,小类型不能自动转为大类型时,也可以用强制类型转换的方式,提升一个小类型为大类型。
6 进制简介
本质上,只有存在现实中的十进制和计算机中的二进制。引入八进制和十六进制,是为了快速表示二进制。不要把进制想的太高大上,生活中非常常见。比如时间就是24进制,星期,就是7进制......
进制的表示
二进制,0b/0B开头
0b0001
八进制,0(零)开头,包括0~7个数字
056,076
十六进制,0x或0X开头,09及af
0xa9,0xabcf,0x23
简单的进制转换
十进制-》二进制
除2 取余 倒排列 复制代码
二进制-》十进制
x*2^(n-1) +....+ x*2^0 e.g: 10000101 =1*2^(7)+0*2^(6)+...+1*2^(2)+...+1*2^(0)=128+4+1=133 复制代码
二进制-》八进制
从右边开始,三位一组,每组算成十进制 10000101 =010 000 101 =205 复制代码
八进制-》10进制
x*8^(n-1) +...+x*8^(0) 205 = 2*64+0+5 复制代码
二进制-》十六进制
从右边开始,四位一组,每组算成十进制(10以上用A,B,C,D,E,F) 10000101 =1000 0101 =85 复制代码
十六进制-》十进制
x*16^(n-1)+...+x*16^(0) 85 =8*16 + 5*1 复制代码
7.数据的存储形式
计算机底层存储的都是补码形式。给你一个二进制数,我们要先求出其原码,在根据原码转换其他进制。
正数:原码补码一样
负数:
原码——》补码(除符号位,按位取反+1)
补码——》原码(除符号位,按位取反+1)
十进制: int a = -32 原码:10100000 反码:11011111 补码:11100000 //计算机中存储的-32 就是这样的。 复制代码
那么,如果给我们一个补码,怎么翻译成十进制呢?
如果给我们一个补码:11100000 复制代码
如果你仔细想想,这里其实有一个问题。需要解释一下
我们是不知道这玩意是有符号数还是无符号数的?计算机只管存这个补码,它才不关心你有符号还是没符号
呢对吧?
那怎么办呢?
想一想,你所使用的这门语言的编译器是知道的啊!编译器为啥知道?因为我语法格式上就按照这门语言的编译规则写的 啊。比如我们写了一段程序
int i = -32; 复制代码
所以,编译器是知道i是负数的。
所以,它会把这个补码解释为负数
补码:11100000 反码:10011111 原码:10100000 //代码中解释出来的就是-32
作者:青衣福王
链接:https://juejin.cn/post/7026511056822829070