恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
尚硅谷Java教程笔记之变量与运算符
首页
资讯中心
/
尚硅谷Java教程笔记之变量与运算符
尚硅谷Java教程笔记之变量与运算符
发布时间:2026/9/30 14:56:33
文章前言本文是笔者在学习的时候边学边敲可能有疏忽我们一起进步##1.关键字在Java中严肃区分大小写在任何场景下被赋予了专门的含义与用途保留关键字是指目前官方先行占用这个作为关键字但是含义还没有赋予##2. 标识符Java中方法变量类等要素命名的时候是使用的字符序列称为标识符即凡是可以自己起名字的地方都叫标识符标识符的命名规则·最好定义标识符的时候能够见名知意还有规范非强制##三.变量变量的概念内存中的一个存储区域该区域的数据可以在同一类型范围内不断变化变量构成的三个要素数据类型 变量名 储存的值Java中变量声明的格式数据类型 变量名 变量值Java是强类型的语言**会专门建立文档在Java中数据类型分为八种基本数据类型8种整型byte\short\int\long浮点型float\double字符型char布尔型boolean引用数据类型类class数组array接口interface枚举enum注解annotation记录record*定义变量的时候要遵循标识符命名的规则和规范作用域变量前后最近的大括号是他的作用域超出作用域无法调用即超出作用域会失效在一个作用域内无法声明两个同名变量定义好变量之后就可以通过变量名进行调用来进行运算等对应于变量的定义可以分开声明与定义也可以把声明与定义直接一行写出来在同一个作用域内不能对于一个声明过的变量进行再次声明但是可以强制转换类型可以进行再次赋值会进行覆盖在变量三要素中值最重要三要素类型 变量名 值基本数据类型介绍###1.整数类型byte short int long四种整数数据类型字节长度不一样依次递增*定义long变量赋值时通常需要以l或者L作为后缀java程序中变量通常声明为int类型除非不足以表示较大的数才使用longJava中整数型常默认为int类型字节Byte是计算机用于计量存储容量的单位一个字节等于8bit位bit是数据存储的最小单位二进制数系统中每个0/1就是一个位叫做bit其中8bit就称为一个字节Byte转换关系8bit1Byte1024Byte 1kb1024kb 1MB1024MB 1GB1024GB 1TB###2.浮点类型*与整数类型类似Java浮点类型也有固定的表数范围和字段长度不受具体操作系统影响float单精度尾数可以精确到七位有效数字很多情况下精度很难满足需求double双精度精度是float的两倍通常采用此类型Java的浮点型常量默认是double型声明float变量的时候后面要加上ffloat f1 12.3fSystem.out.println(“f1” f1)//这两句是声明变量并赋值进行打印的标准操作其中第一行不过多赘述第二行打印时“f1”这部分是字符串而后面的f1是表示进行拼接加号表示前后拼接拼接操作拼接操作的全过程JVM看到字符串和变量之间用加号决定执行拼接操作把非字符串类型转换成字符串在上面Java底层会悄悄调用String.valueOf(f1) // 把 float 12.3 转成字符串 “12.3”对于基本类型int、float、double、boolean 等拼接时都会自动调用对应的 String.valueOf(参数) 方法转成字符串。接着就是拼接并且输出底层原理为什么拼接不会弄乱原来的字符串你可能会好奇“f1” 本身没变怎么就多出了 “f112.3”这是因为 Java 的 String 是不可变的Immutable。● “f1” 这个字符串对象一旦创建内容永远不会改变。● 拼接时Java 会创建一个新的字符串对象来存放拼接后的结果原来的 “f1” 和 “12.3” 都还在内存里或者说被回收但没被修改。关于浮点数精度的说明***float表数范围大于long但是精度不高并不是所有小数都能可以精确的用二进制浮点数表示二进制浮点数不能精确的表示0.10.010.001这样的10的负次幂浮点类型floatdouble数据不适合在不容许四舍五入等误差的金融计算领域如果需要精确数字计算或保留指定位数的精度需要使用BigDecimal类替换浮点型变量字符串类型char型数据用来表示通常意义上的“字符”占两个字节与short占用空间大小一样Java中所有字符都是用Unicode编码故一个字符可以储存一个字母一个汉字或者其他书面语的一个字符字符串变量的三种表现形式形式一使用单引号‘ ’括起来的单个字符有且只能有一个例如char c1 ‘a’char c2 ‘中’形式二直接使用Unicode值来表示字符型常量‘\uxxxx’,其中xxxx表示一个十六进制整数在Unicode编码集当中基本有世界上全部字符都能识别例如\u0023表示’#’形式三Java中还允许使用转义字符’来将其后的字符转变为特殊字符型常量例如char c3 ‘\n’; //‘\n’表示换行符形式四使用具体字符对应的数值比如ASCII码char c11 97 //在ASCII码中 97代表的是a因此这里实际存储的是aSystem.out.println(c11);布尔类型boolean类型用来判断逻辑条件一般用于流程控制语句当中*if条件控制语句*while循环控制语句*基本数据类型变量间的运算规则整型常量规定是int类型比如直接输入的1byte b5 10//这里想要对101运算下面得到的结果必须是声明为int类型int m1 b5 1这里的一就是整型常量相同的浮点数常量规定为double关于变量名为什么不能是数字开头的int 123l 12long 16 123l两者相互冲突不知道究竟第二行的123l是变量还是值即为了自洽1.这里提到的数据类型有七种不包含布尔类型2.运算规则包括①自动类型提升当容量小的变量与容量大的变量运算时结果自动转换为容量大的数据类型说明此时的容量大或者小并不是指占用内存空间的大小而是指表示数据范围的大小比如int l1 10long s1 l1long c1 l1 s1byte·short·char类型之间运算过后会自动转换为int其余的提升规则是int→long→float→double例子long l1 123l//正常声明long数据long l2 123 //这里也能正常原因就是自动类型提升会先处理成int进一步转换为long但是如果本身数值超出int在这里就无法转换比如long c12 123456789 //这里就不行这就会把数据类型变为c1如果在这里所声明的类型数据不正确也会报错②强制类型转换在上面的数据转换顺序中如果从后往前赋值转换会有损失精度得到报错如double b 12int c b这里就会报错强制类型转换就是在符合标准的前提下运用转换语法就能达到转换的目的把上面的一行改为但是会有相应的精度损失损失规则为截断而不是四舍五入int c intb就是把要更改的变量用小括号在它前面标注想要改成的类型这里就是强制转换符在自动类型提升中 小类型转换为大类型也可以在后面标注应转换为大的数据类型不过一般省略精度损失的其他例子int i 128byte k bytei这里转换之后结果是负128详细原理见另一个笔记ai例子short k 5k k-2这段代码讲解其中5是int常量但是其二进制表示在short可以表示的范围之内因此第一行没问题第二行的操作其实是分步骤进行的第一步执行k-2这里k是short类型而5整型常量表示的是int类型因此运算结果会被自动升级为int类型问题是k常量前面已经声明过了是short类型而第二步会把运算后的结果自动赋值给前面的变量这时候就会有冲突因此这样子写无法通过编译更改方法s - 2; 或者 s (short)(s - 2)其中第一种能够通过是因为系统在用符合运算符的时候 - *等会自动强制转换char c ‘a’;int i 5;float d .314F;double result c i d; // 判断yes正确这段代码char类型参与计算的时候会先转换为int类型也就是其对应的ASCII编码这里a对应的就是97float行赋值变量要在末尾加上f结果应该是102.314基本数据类型与String类型的运算1…String类属于引用数据类型2.String类型的变量可以使用一对“得方式进行赋值3.String类型的字符串内部可以包含任意数量的字符也可以是零个4.String类型与基本数据类型之间的运算这里可以与八种类型包含布尔String类型只能与其他类型做连接运算使用号表示这个加号必须紧跟着String类型数据的后面不然如果用String类型数据接收的时候可能被识别成不被允许的加法运算运算结果只能用String类型声明如何实现将一个string类型的数字转变为int数字呢比如int b 10String c b ”//“10”int f Integer.parseInt(str9)这样就可以将数字从引号当中剥离出来结果就是int类型的运算符运算符是一种特殊的符号用来表示数据的运算赋值与比较等按照功能有以下分类按照操作个数分为一元运算符单目运算符二元运算符双目运算符三元运算符三目运算符算术运算符的基本语法/表示取商而%表示的是取余%在开发中一般用来判断是否能整除也就是看结果与0的关系除数与被除数也称为模数与被模数需要注意的是取模之后结果与被模数的符号相同int c -12int d 2int f c%d结果是-5重点前与后前后–的用法一样的位置不同会导致结果有些不同都表示自增1运算而i与i有区别定义int a 10若int b a则运算过程如下先自增1运算然后再将值赋值给b而若int b a则表示先赋值给b再把a进行自增运算在一般的运用场景中一般两者没有区别便捷使用当你声明一种不是int类型的数字的时候如果想要它加一1是常量在不强制转换的情况下会造成精度损失也就是报错但是当我们使用自增益就可以赋值运算符1.当两侧数据类型不一致的时候可以使用自动类型转换或者使用强制类型转换原则进行处理注意是使用而不是自动的特性2.支持连续赋值int a b10;或者合并int a,b10;以为根本有如下拓展-/,用法与python类似,但在处理不同的数据类型时拓展的赋值运算符不会改变数据本身的数据类型也就是说对于不同类型的数据处理后结果等同于强制转换可能会有精度损失特别需要注意的练习题int m 2;int n 3;nm因为是后加加所以m是在最后才进行迭代加一等同于n nm这样子先进行nm并赋值最后才是m迭代比较运算符其中大部分等同于python中的不多赘述说明1.最后一种在面向对象的多态性的位置会进行讲解2.上面几种比较运算符适用于基本数据类型有的适用细节不同理解即可不需要死记硬背3.补充 !可以适用于引用数据类型了解即可这是合乎逻辑的因为其他的比较运算符也无法比较引用数据类型逻辑运算符逻辑运算符操作的都是boolean类型的变量或者常量而且运算结果也是boolean类型的值运算符说明与表示‘且’的关系当左右两边布尔类型的值都是true的时候结果才能是true否则为false需要注意如果两个结果都是false结果仍然是false不可把其简单地看为是一种只要类型一样就返回true|与||或的关系前者是表示‘或’关系当符号两边布尔值有一边为true的时候结果为true如果没有那就是false!非表示‘非’的关系当变量布尔值为true的时候结果为false变量值为false时结果为true^异或当符号两边布尔值不同的时候结果为true两边的布尔值相同的时候结果为false理解“异或”追求的是“异”只要不一样结果就是true对于逻辑运算符的补充说明逻辑运算符操作的都是boolean类型的变量或者常量而且运算结果也是boolean类型的值这说明逻辑运算符常用于条件判断结构与循环结构中对于初学者看到这些运算符可能不是很能理解或者很懵现做出如下补充运算符 名称 作用 短路与 两边都为 true结果才为 true|| 短路或 只要一边为 true结果就为 true! 逻辑非 取反true 变 falsefalse 变 true1.短路与规则只有左右两边的条件同时成立才为true有一个不成立就是falseint age 25;boolean result (age 18) (age 30);// 左边 true右边 true → 结果 trueint score 85;boolean pass (score 90) (score 100);// 左边 false右边不执行了 → 结果 false关键点如果左边已经是false那么右侧根本不会执行因为这是“短路”相电流里面的开关断开电流过不去一样2.短路或||规则左右至少有一个成立也就是有true那么结果就是true如果两个都不成立那么结果就是false因为短路就是左侧识别到true结果就会是true后面就不管了3.逻辑非!规则单目运算符只对一个条件取反最容易混淆的点运算符 是否短路 举例说明 ✅ 短路 左边 false右边不执行 ❌ 不短路 左边 false右边仍然执行|| ✅ 短路 左边 true右边不执行| ❌ 不短路 左边 true右边仍然执行在日常开发中基本都是使用短路版本因为安全性和效率都高于非短路版本注意的坑优先级问题逻辑非!优先级最高接着是短路与最后是短路或||boolean r true || false false; // 等价于 true || (false false) → true一般这种建议多用括号记忆建议把短路与记忆为一条电路上的两个开关只有都闭合才有电流结果是true第一个结果只要不是true第二道门就没有必要开了而短路或就是两条能到家的并且距离一样的路只要有一个走的通就行但是当第一条路能走得通就不看第二条路了也就是结果为true这样会导致第二个语句可能不执行会更安全并且也要注重结果与非短路逻辑的区别位运算符这些符号区分是位运算符还是逻辑运算符只需要看操作的对象是不是布尔类型数据就行1.第一个框中的运算符都是对于数字的二进制进行操作的因此与二进制的特性有关所以每左右移就相当于对于数字进行二的几次幂的操作2.左移相当于在原有的二进制表示上在末尾添加零类比十进制十进制每加一个零那么就会扩大十倍二进制每增加一个零就是会扩大2倍3.在处理一个数据的时候如果对一个数据左移的位数过多的时候可能数据结果会发生偏差4.右移就是和左移相反相当于每次右移就除以二取得是商因为对于负数来讲操作的是补码所以不能补0而是补一5.无符号右移只要一移动取得就是正也就是只要一操作就会变成正数那无符号右移的操作情景是比如处理一个int数据他有三十二位用无符号右移与按位与结合就可以比较它的前后16位是否相同与运算操作两个数字比如97就是对其二进制进行操作逐位判断对于负数就是操作其补码剩余的几个运算符也是类似的对于二进制操作的逻辑如果不理解也没问题课上说这节目前还不重要等用到的时候细讲条件运算符*基本语法(条件表达式)? 表达式1 :表达式二说明条件表达式是boolean类型的结果根据boolean的值选择表达式1或者表达式2如果条件表达式是true那么运算后的结果是表达式1反之如果条件表达式的结果是false那么结果就是表达式二这样的结果可以用对应的变量类型进行接收注意的是表达式一和表达式二需要是可以兼容的类型或者是相同的类型当三个数字比大小的这种用两次条件运算符就可以做到的可以合并到一行不过较为难读懂因此一般用分开写结论凡是可以使用条件运算符的地方都可以改写为if slse结构但是反过来就不一定建议在二者都能够使用的前提下优先使用条件运算符因为执行效率高优先级顺序表第一个是小括号截图长度原因开发建议不要过度依赖运算的优先级来控制表达式的执行顺序这样可读性太差不要把一个表达式写的过于复杂如果一个表达式写的过于复杂就最好把它分成几步来写章末小结1.关键字保留字关键字倍Java赋予特殊含义的字符串*true false null虽然不是关键字但是可以当做关键字来看待虽然他们可以复制给变量2.标识符*凡是自己可以命名的都称为标识符必须遵守标识符的命名规则否则编译不通过2.126字母0-9_或$可以参与构成标识符2.2数字不可以开头这样强制规定可以让系统的判断效率提升遇到数字开头一定是数字字面量遇到其他的开头一定是标识符这种设计让编译器的词法分析器能够单遍扫描无需回溯高效且没有歧义不可以使用关键字与保留字但是能包含关键字与保留字Java中严格区分大小写长度没有限制标识符不能包含空格*标识符命名的规范包名所有单词组成都小写类名接口名所有单词首字母大写多单词拼接也是变量名方法名多单词组成时第一个单词首字母小写第二个单词开始每个单词的首字母大写常量名所有字母都大写不同单词之间用下划线连接“见名知义”3.变量的基本使用重点对于变量的理解内存中的一个存储区域该区域的数据可以在同一类型范围内不断地变化变量的构成包含三个要素数据类型变量名储存的值Java中声明变量的格式数据类型 变量名 变量值变量具有作用域只在作用域中有效不能在同一作用域中声明两个同名变量4.基本数据类型变量的使用重点通常在开发中没有特殊情况那么就定义整型变量为int浮点型变量为double对于char类型的补充是Java中唯一一个无符号的基本数据类型不能储存负数可以凭借对应的ASCII码直接参与运算char只能存储一个字符并且存储的字符对应的字符集是unicode字符集非常庞大基本可以包含全球的字符而ASCII是unicode的一部分5.自动类型提升6.String类的使用与基本数据类型变量的运算重要String的认识“字符串”用“”表示包含任意个字符可以为空它与其他类型的运算只有连接运算并且是连接还是加法取决于左边紧跟着的类型是否是字符串具有向左识别左边类型决定它这里的作用7.对于进制的认识熟悉各种进制在Java中的声明方式八进制0开头二进制0b、0B十六进制0x开头对于二进制的理解正数三码合一负数原码反码补码都不相同计算机底层以补码的方式存储数据8.各种运算符的讲解比较常用的重点一般地交换两个变量的值都是通过引用第三个临时变量来做到交换效果比如int n 2;int m 1;int c m;m n;n c;这样就完成了最基本的交换两个整型变量的值以后这样的方法也会在数组里面运用不推荐使用其他的方法比如如果想体现运算符的优先级一般推荐使用来进行区分因为根据系统本身的运算符优先级来进行区分这样可读性比较差我们在编写一行执行语句的时候不要出现太多的运算符企业真题1.高效的方式计算2*8的值使用左移2.与的区别略注意短路是否3.Java中基本的数据类型都有哪些String是基本的数据类型吗8中基本数据类型String不是属于引用数据类型基本数据类型类型 占用字节 默认值 取值范围byte 1 0 -128 ~ 127short 2 0 -32,768 ~ 32,767int 4 0 -2³¹ ~ 2³¹-1long 8 0L -2⁶³ ~ 2⁶³-1float 4 0.0f 约 ±3.4E-38 ~ ±3.4E38double 8 0.0d 约 ±1.7E-308 ~ ±1.7E308char 2 ‘\u0000’ 0 ~ 65,535Unicode字符boolean 未严格定义JVM依赖 false true / false基本类型存储在栈内存中直接保存值效率高。所有非基本数据类型都是引用数据类型他们存储的是对象的地址引用实际数据在堆内存中引用数据类型分为类class接口Interface数组Array枚举Enum注解Annotation引用数据类型的默认值是null除了数组对象本身总结String 是引用类型中的类而 Java 全部数据类型就是8种基本类型 无数种引用类型因为你可以自己定义类和接口等到后面学到引用数据类型的时候再回来看栈内存与堆内存拓展这个放在学完基础Java进阶的笔记中讲解4.Java开发中计算金额时使用什么数据类型不能使用float或者double因为精度没有BigDecimal类替换可以实现任意精度的数据运算】5.char型变量中还能不能储存一个中文汉字为什么可以因为char使用的是Unicode字符集虽然ASCII码里面没有汉字但是汉字表示使用Unicode的其他部分6.int i 0i i这时i的值为0后加加先赋值再进行自增一7.如何将两个变量的值互换同上面的交换两个整型变量只需要定义为String就行8.boolean占几个字节编译的时候不谈占几个字节但是jvm在给boolean类型变量分配内存空间的时候它占一个槽位slot 4个字节拓展byte\short\char\boolean\int\float类型的变量占用一个槽位slotdouble、long占用两个槽位slot日常所说的字节数语言规范/教材这是 Java 语言层面规定的逻辑大小通常来源于 C/C 的习惯或 Java 语言规范的推荐实现类型 日常认为的字节数byte 1 字节short 2 字节char 2 字节int 4 字节long 8 字节float 4 字节double 8 字节boolean 1 字节规范未强制但普遍如此理解图中描述的 JVM 局部变量表 Slot 大小这是 JVM 运行时栈帧局部变量表的物理分配规则类型 局部变量表中的实际占用byte 4 字节1 Slotshort 4 字节1 Slotchar 4 字节1 Slotint 4 字节1 Slotlong 8 字节2 Slotsfloat 4 字节1 Slotdouble 8 字节2 Slotsboolean 4 字节1 Slot原因● 日常字节数是逻辑上的“最小存储单元”便于理解和计算内存例如数组连续存储时的偏移量。● JVM 局部变量表为了简化字节码指令集复用 int 的加载/存储指令以及 CPU 内存对齐32 位架构一次读取 4 字节更高效将小于 32 位的类型统一提升为 32 位存储。9.为什么Java中0.10.2不是0.3结果是0.3000……4这是所有编程语言面临的通病原因是他们都采用了IEEE 754标准具体的并不是每一个小数都能够有对应的二进制小数表示