在生活中,菜需要用盘子来盛装,盘子有大小之分,也有不同类型。比如,鱼会用外形像鱼一样的特色盘子盛放,汤则用圆深的盘子来装,一般盘子大小要么刚好容纳菜,要么大于菜的大小,因为用小盘子装大量的菜容易撒汤。
在计算机世界里,菜就如同数据,而盘子则是承载数据的变量。数据和菜一样有各种类型,变量也有多种类型,并且变量的类型通常由它所存储的数据类型决定。这就好比一个盘子,今天可以用来装小炒肉,明天可以用来装红烧肉,数据在变量中的存储也是如此,是可以变化的,所以被称为变量。
以 Java 语言为例,它就像一个有着严格规则的国家。在 Java 中,一旦为变量指定了类型,就如同规定了某种特定类型的容器只能装特定类型的数据。比如定义了一个整型变量,它就只能存储整数类型的数据,不能存储字符串或者浮点数,否则就会出现错误,就像规定水杯只能装液体,你却想往里面装固体,这显然是不符合规则的。
再看计算机中的溢出概念,这就好比用一个小容量的盘子去装过多的菜,菜会溢出来洒得到处都是。在计算机里,当我们给一个变量存储的数据超出了它所能容纳的范围,就会发生溢出。例如,一个字节类型的变量,它能存储的整数范围是有限的,如果我们给它赋值一个超出这个范围的数,就会导致数据溢出,产生错误的结果。
言归正传,在Java中,变量的声明格式为
数据类型 变量名 = 数据;
数据类型分为基本数据类型和引用数据类型。
基本数据类型(四类)
整数型:
byte
short
int (默认类型)
long
浮点型(小数)
float
double (默认类型)
字符型
char
布尔型
boolean
引用类型
类class
接口 interface
数组 array
比如整数型,有四个类型,那怎么区分哪个数据用哪个类型呢?用大小,每个类型能装的大小是不一致的,就比如盘子。用的盘子大,有的盘子小。大盘子装大一点的菜,小盘子装小的菜。以下表格是能装的“大小”,即类型能表示的范围
整型
整数(1字节=8bit) | byte | short | int | long |
字节 | 1 | 2 | 4 | 8 |
范围 | -128 ~ +127 | -2的15次方到2的15次方-1 | -2的31次方到2的31次方-1 | -2的63次方到2的63次方-1 |
要求 | 默认类型 | 使用时以l或L结尾 | ||
写法 | byte 变量 | short 变量 | int 变量 | long 变量 = 123L |
浮点类型
浮点数 | float | double |
字节 | 4 | 8 |
范围 | ±3.4028235E38 | ±1.7976931348623157E308 |
要求 | 数据后缀带F或f | 默认类型 |
类型 | 单精度类型 | 双精度类型 |
精度 | 8位有效数字 | 16位有效数字 |
写法 | float f=1.23242f | double d = 1.123123 |
char类型
字符型 | char |
要求 | 使用单引号,但只能写一个字符 |
写法 | char 变量 = ‘c’ |
字节 | 2 |
特点 | 可以和数字进行运算,因为它有对应的Unicode编码 |
Unicode | A=65,Z=90,a=97,z=122,0=48,9=57(十进制) |
Unicode编码表完全兼容ASCII码表(下图是ASCII表,码值一样)
boolean类型
布尔型 | boolean |
要求 | 只能取true和false中一个值 |
写法 | boolean 变量= true; |
使用场景 | 常用于条件判断或者循环结构中使用 |
注意点 | 不能用0或非0的数字来表示false或true |
变量
对于变量Java只有严格规范的。
- 变量可以由26个英文字母+数字0-9+_下划线和$组成
int abc;
int $abc_123;
- 不能以数字开头
int $a 可以
int 1a 不可以。
- Java严格区分大小写
int a 和int A 是不一样的。
- 不能单独使用关键字和保留字作为变量
int class =1 不可以
int abclass=1 可以
除了这些强硬规范以外,作为一名合格的开发人员,应自觉遵守以下规则
凡是能自己起名字的地方都叫做标识符。
涉及到:包名、类名、接口名、变量名、方法名、常量名等
- 标识符要使用驼峰命名法
- 类名首字母应大写,XxxXxx的形式 UserInfo 用户信息类
- 变量名,方法名应首字母小写,xxxXxx的形式 userName : 用户名
- 常量名:所有字符应大写,多单词时用下划线链接 XXX_XXX的形式
- 包名:所有字符应小写,还可以使用项目的功能或者网站域名命名,com.域名.xx包
- 标识符要见名知意
- 比如要描述用户名。 命名为a 显然是不合适的,可以命名为userName
什么是关键字和保留字?
在 Java 世界里,关键字和保留字就像是盘子使用规则里的特殊指令和预留概念。
关键字就好比餐厅里有着特定用途标识的盘子。比如餐厅里标着 “甜品专用” 的盘子,只能用来盛放蛋糕、布丁等甜品,绝对不能用来装炒菜。在 Java 中,像 “public”“class”“int” 这些关键字,都有固定且明确的用途。“public” 用于修饰类、方法或变量的访问权限,就像标明这个 “盘子”(代码元素)的使用范围;“class” 用来定义类,是构建 Java 程序的基础框架,类似一种特定结构的盘子模具,规定了盛放数据和功能(菜)的特定方式;“int” 表示整数类型,当你定义一个 “int” 类型的变量,就相当于拿到一个只能装整数这种 “菜” 的盘子,其他类型的数据是装不进去的。这些关键字是 Java 语法规则中不可或缺的组成部分,一旦使用错误,整个程序就会像放错菜的盘子一样混乱,无法正常运行。
而保留字则像是餐厅为未来发展预留的盘子概念。比如餐厅计划推出新的菜系,提前规划了 “新菜系专用盘” 的概念,虽然目前还没有实际的盘子样式和使用规则,但这个名称已经被预留,不会再用于其他用途。在 Java 里,像 “goto”“const” 这些保留字,虽然当前版本的 Java 没有赋予它们实际的功能,但为了保证语言发展的兼容性和扩展性,这些词汇被保留下来,不允许开发者用作变量名、方法名等自定义标识符。就好像你不能擅自把餐厅预留的 “新菜系专用盘” 概念拿去标注普通盘子,Java 开发者也不能随意使用保留字,否则就违反了 Java 语言的规范。
以下表格为Java中的关键字
用于定义数据类型的关键字 | ||||
class | byte | short | int | long |
char | boolean | float | double | interface |
enum | void | |||
用于定义流程控制的关键字 | ||||
if | else | switch | case | default |
while | do | for | break | continue |
return | ||||
用于定义访问权限修饰符的关键字 | ||||
private | protected | public | ||
用于定义类,函数,变量修饰符的关键字 | ||||
abstract | final | static | synchronized | |
用于定义类与类之间关系的关键字 | ||||
extends | implements | |||
用于定义建立实例及引用实例,判断实例的关键字 | ||||
instanceof | new | this | super | |
用于异常处理的关键字 | ||||
try | catch | throw | throws | finally |
用于包的关键字 | ||||
import | package | |||
其他修饰符关键字 | ||||
native | strictfp | transient | volatile | assert |
用于定义数据类型值的字面值 | ||||
true | false | null | ||
保留字 | ||||
goto | const |
现在类型也知道了,数据也知道改写什么了。那么变量如何使用声明或者使用呢?
定义变量的格式
第一种:
数据类型 变量名 = 值
第二种:
数据类型 变量名;
变量名= 值;
注意:变量必须先定义才能使用。变量在其作用域内有效,出了作用域无效。
作用域就是:离的最近的那个一个大括号{}。同一个作用域内,不能声明重名变量。
数据之间的运算法则
上文提到,char类型可以和int类型进行运算,是因为char类型有对应的Unicode码。
在基本数据类型中,除了boolean类型以外,其他7种都可以相互转换。
自动类型转换:容量小的变量与容量大的变量进行运算时,结果会自动提升为容量大的类型
byte\char\short -->int --->long -->float --> double
低 -----------------> 高
short s = 100
int i =s;
当byte、char、short三种类型的变量做运算时,结果为int
强制类型转换:
int i =1000;
short s = (short) i;
使用强转符() 使用强转,可能会导致精度丢失。
运算,肯定涉及到运算符。
算术运算符
+、-、*、/(基本算术运算符)
%:求余数
比如
10 % 3 结果为 1
++ : 自增1
-- : 自减1
++、--在变量前,则变量先+1或-1再进行运算
++、--在变量后,则先运算再+1或-1
例:
int a =1,b=1;
System.out.print(++a+1); 结果为:3
System.out.print(b+++1); 结果为:2
赋值运算符
= 号和算术运算符混合使用
比如+= *=
a+=2 等同于 a=a+2;
比较运算符
== ,<, >,!= <=,>=
a==b 判断a的值和b的值是否相等。
小于,大于,小于等于,大于等于
a!=b 判断a的值和b的值是否不相等。
逻辑运算符
&& || !
与 或 非
a && b a是true才会执行b的运算。若作为条件,即a,b都是true才能满足条件
a || b 只要有一个是true就行。a是true时,不会执行b
! : !true 就是false, !false 就是true
逻辑运算符操作的都是boolean类型的变量。而且结果也是boolean类型
位运算符,需要使用进制进行计算
进制
1.进制分为:
二进制 : 0,1 满2进1,以Ob或O开头
十进制 : 0-9日常使用的数字,满 10进1
八进制 : 0-7 满8进1,以数字0开头
十六进制 : 0-9以及A-F,满16进1,以0x或0X开头表示,此处的A-F不区分大小写
2.二进制的使用说明
1.计算机底层的存储方式:所有数字在计算机底层都已二进制形式存在
2.二进制数据的存储方式:所有的数字,不管正负,底层都以补码的方式存储
3.原码、反码、补码的说明
整数:三码合一,原码,反码,补码都一样
负数:
原码:直接将一个数值换成二进制数,最高位是符号位,0表示整数,1表示负数,0正1负
负数的反码:符号不变, 对原码按位取反,0变1,1变0
负数的补码:其反码+1
0的反码,补码都是0
运算看补码,结果是原码
3.进制间的转换其他进制转换10进制
假如N进制的abcd.ef数字,整数一共四位
a*N^n-1 + b*N^n-2 + c*N^n-3 + d*N^n-4 + e*N^n-5 + f*N^n-610进制转其他进制
除N取余数
16 转 2进制
16 / 2 = 8...0 ^
8 % 2 = 4...0 |
4 / 2 = 2...0 |
2 / 2 = 1...0 |
---> |
二进制进制就是10000二进制转8进制,16进制
每三位2进制就对应一位8进制数
每四位2进制就对应一位16进制数
10010 --> 010 010 22(8进制)
10010 --> 1 0010 12--> C(16进制)
位运算符
<< 、 >> 、>>> 、& 、|、 ^、 ~
&的二进制运算,遇零则零
|的二进制运算,遇一则一
^的二进制运算,不同为1,相同为0
<< 左移运算符 左移1位,就乘2
>> 有符号右移运算符,右移一位就除2 如果值为正,则在高位补0 ,如果值为负,则在高位补1
>>> 无符号右移运算符,无论值的正负,都在高位补0
~num=-(num+1)
x<<y的结果为:x的二进制后面+y个零
2<<4
010 -->010 0000 == 0100000 == 32
x>>y的结果为:x的二进制从右往左数y个舍去,若y大于x的个数,则为0x>>>y的结果为:x的二进制从右往左数y个舍去,若y大于x的个数,则为0
位运算符的效率比算术运算符的效率要快
三元运算符
三元运算符:(条件表达式) ? 表达式1 : 表达式2
条件为真运行问号后面的表达式1 如果不为真,运行表达式2
条件表达式的结果为boolean类型
三元运算符可以嵌套使用,当条件很多时,不推荐使用
(条件表达式) ? (条件表达式2 ? 表达式1 : 表达式2 ) :表达式2
条件较少时优先使用三元运算符,因为简洁,执行效率高
本人是Java初学者,水平有限,本文章中如果有不对的地方,麻烦您能指出来。向您表示感谢。