阅读 89

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中的内存区域的名字。用来存储一个数据(值),一般而言,一个变量具有如下要素:

  1. 数据类型:每一种变量一定对应一个具体的数据类型,表示该变量能存储什么类型的值

  2. 变量名:通过变量名访问JVM内存区域上的数据(即:访问变量中存的数据)

  3. :顾名思义,就是变量所指向的这块jvm内存区域上存储的值,变量中的值是可变的

int age;//1.声明 age = 29;//2.初始化 int myAge = 28; //声明的同时进行初始化 复制代码

OK,这就是变量的概念,基本就这些内容,是不是很简单啊。

3.常量

常量更简单,一句话概括:常量就是值不可以改变的变量。那么,如何做到值不可以改变呢?

final double PI = 3.14; final int MAX_THREAD_COUNT = 10; 复制代码

大家看到了,所有常量都具有以下两个特点:

  1. final 修饰,代表这个变量的值不可改变,即为常量

  2. 名字大写,这是常量的书写规范(规范这东西,就像道德一样,你不遵守也不会报错,但建议遵守,这就是书写代码的道德规范)

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


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐