变量
一、关键字(keyword)
-
关键字概念
- 被java赋予了特定涵义的英文单词
-
关键字的特点
- 关键字的字母全部小写
- 常用的代码编辑器,针对关键字有特殊的颜色标记,非常直观
注:main不是关键字,但是JVM在执行代码的时候,只会识别该单词
二、字面常量
- 概念
- 常量:在程序的执行过程中,其值不会发生改变的量(数据)
- 字面常量的分类
- 字符串常量:被双引号所包裹的内容
- 整数常量:所有整数
- 小数常量:所有小数
- 字符常量:被单引号包裹的内容,里面只能存放单个字符
- 布尔常量:只有两值,true(真),false(假);布尔常量单独打印没有意义
- 空常量:null,一个特殊的空值,数组部分详细讲解
注:
- null空常量不能输出打印
- 与字面常量对应的符号常量后续会讲
三、变量
-
为什么要有变量
- 用于存储程序运行中产生的数据
-
什么是变量
- 变量就是内存中的存储空间,空间中存储着经常发生改变的量(数据)
-
怎样定义变量
- 变量的定义格式:
- 数据类型 变量名 = 数据值;
- 数据类型:为空间中要存储的数据,加入类型限制 整数?小数?
- 变量的定义格式:
四、数据类型
- 存储字节大小的知识(略)
- Java语言是强类型语言(标题十第一问),对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不一样的。
数据类型内存占用和取值范围
-
不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不一样的
-
字面常量没有手动指定数据类型,但是只要是数据,就会存在数据类型
-
字面常量整数的数据类型默认是int,小数的数据类型默认是double
(八大基本数据类型和三大引用数据类型)
五、变量的定义和使用
- 变量的定义格式
- 数据类型 变量名 [= 数据值];
- 整数、小数、字符、布尔类型变量的定义
- 变量的使用
- 先定义,后使用
- 根据标识,变量名进行使用
public class Demo1Variable {
public static void main(String[] args) {
// 数据类型 变量名 = 数据值
// 定义一个整型变量
int a = 10;
System.out.println(a);
// 定义一个浮点类型变量
double b = 1.1;
System.out.println(b);
// 定义一个字符类型变量
char c = 'a';
System.out.println(c);
// 定义一个布尔类型变量
boolean flag = true;
System.out.println(flag);
}
}
总结:变量就是内存中的空间,内部存储着不断发生变化的数据
六、变量的定义和使用
变量的注意事项
- 变量名不允许重复定义
- 重复定义会报错,建议换名或者直接赋值进行覆盖
- 一条语句可以定义多个变量,但需要使用逗号进行分隔
- 例:int a = 10, b = 20, c = 30;
- 变量在使用之前一定要进行赋值
- 定义float和long变量的注意事项
- 定义float类型变量的时候,需要在数值后面加入F的标识,F大小写都行(建议大写)
- 定义long类型变量的时候,需要在数值后面加入L的标识,L大小写都行(建议大写)
- 变量的作用范围
- 只在它所在的大括号中有效
- 有关作用域后续再详讲
public class Demo02 {
public static void main(String[] args) {
{
int b = 10;
System.out.println(b);
// 当这个大括号内的代码执行完毕后,内部定义的变量就会从内存中消失
}
// System.out.println(b); // 会报错,
}
}
七、键盘录入
键盘录入介绍
- 为什么要有键盘录入
- 目的
- 用于接受用户的输入,便于交互
- 为了让我们操作的数据,变得更加灵活
- 目的
import java.util.Scanner;
public class Demo03 {
/*
步骤一:导包,需要写在class的上面
import java.util.Scanner;
步骤二:创建对象
Scanner sc = new Scanner(System.in);
只有sc可以改变,其他属于固定格式
步骤三:使用变量接收数据
int i = sc.nextInt();
只有i可以改变,其他属于固定格式
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
System.out.println(i);
}
}
八、标识符
标识符概述
- 标识符:就是给类、方法、变量等起名字的符号
- 标识符定义规则
- 由数字、字母、下划线
_
和美元符$
组成 - 不能以数字开头
- 不能是关键字
- 区分大小写
- 由数字、字母、下划线
常见的命名约定
(小驼峰命名法):方法、变量
- 约定1:标识符是一个单词的时候,首字母小写
- 例如name
- 约定2:标识符由多个单词组成的时候,第一个单词首字母小写,其他单词首字母大写
- 例如firstName
(大驼峰命名法):类
- 约定1:标识符是一个单词的时候,首字母大写;例:Student
- 约定2:标识符由多个单词组成的时候,每个单词的首字母大写;例:GoodStudent
九、类型转换
为什么要学习类型转换?
- 在实际开发中会用到不同类型的运算和转换
int a = 10;
double b = 12.3;
数据类型 c = a + b;
// c此时是什么类型?
类型转换的分类
-
隐式转换
-
将数据类型中,取值范围小的数据,给取值范围大的类型赋值,可以直接赋值
-
例:
int a = 10;
double b = a;
// 系统自动讲int类型的a,转换成double类型的10.0赋值给b变量
-
注:虽然long是8个字节,但是float类型能表示的数值范围大于long类型
特殊关注:byte short char 三种数据类型在运算的时候,不管是否有更高的数据类型,都会自动提升为int,然后再进行运算
- 强制转换
- 把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
- 可能会出现丢失精度或溢出
- 格式:目标数据类型 变量名 = (目标数据类型)值或者变量
public class Demo4 {
public static void main(String[] args) {
int a = 10;
// byte b = a;
//错误:(6, 18) java: 不兼容的类型: 从int转换到byte可能会有损失
byte b = (byte)a;
System.out.println(b);
System.out.println("==========");
double n = 12.2;
int m = (int)n;
System.out.println(m);
// 输出12 损失精度
}
}
特殊的案例补充
例:byte d = 3 + 4;
- java存在常量优化机制,这里的3和4是两个常量,会在编译的时候就会让3和4进行相加,然后会自动判断7是否在byte的取值范围内。
- 若不在范围内:编译出错
- 若在范围内:通过编译
例:
byte a = 3;
byte b = 4;
byte c = a + b; // 会报错
byte short char 三种数据类型在运算的时候,不管是否有更高的数据类型,都会自动提升为int,然后再进行运算。所以可以改成int c = a + b;或 byte c = (byte)(a + b);
十、变量中一些问题的拓展
一、什么是强、弱类型语言?java是什么类型?请分别举例说明
-
强类型语言
强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括Java、.net 、C++等语言。
-
弱类型语言
弱类型语言是一种弱类型定义的语言,不需要显示定义类型,变量可以根据环境变化自动进行转换,不需要经过显性强制转换。弱类型语言包括vb 、PHP、javascript等语言。
-
强类型语言和弱类型语言区别
无论是强类型语言还是弱类型语言,判别的根本是是否会隐性的进行语言类型转变。强类型语言在速度上略逊于弱类型语言,但是强类型定义语言带来的严谨性又能避免不必要的错误。
二、字符的本质以及Unicode编码
unicode
-
Unicode,是计算机科学领域里的一项业界标准。为每种语言中的每个字符设定了统一并且唯一的整数值,把这个数值称为码点(Code Point)。
-
但是它并不规定计算机如何存储和传输这个数值(以多少个字节存储,是定长还是变长,Unicode没有字节长度的概念)。
-
Unicode 定义了一个码点空间包含1,114,112个码点,范围从0到0x10FFFF,也就是说,它仅仅是一个字符映射集。其中 0x0000 ~ 0xFFFF 的字符表示常用字符集,称 BMP字符,0x10000 ~ 0x10FFFF 字符叫增补字符。
-
Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF,每个平面有 65536 个码点。
例如,"AB中国"这个字符串,对应的 Unicode 编码为:A -> \u0041 B -> \u0042 中 -> \u0049 国 -> \u56FD
-
UTF32编码
- 4个字节表示一个字符,总共2^32=4294967296
- 其高位均为0,空间浪费比较严重,因此应用很少
-
常用的UTF16一般使用两个字节表示常用字符,对于不能表示的或不常用的字符才使用32位编码,这是Windows程序默认的Unicode编码方式
- 使用 1 ~ 2 个 16bit 变长编码表示「1,112,064」个 Unicode 码点
- 它扩展于固定16bit长度的UCS-2
-
UTF8编码按照不同的国家文字的多少分别使用1个字节、2个字节、3个字节和4个字节表示,常用于网络传速。
- 使用 1 ~ 4 个字节变长编码表示「1,112,064」个 Unicode 码点
- 兼容 ASCII
- 码点数值越小,使用的字节数越少,出现的频率越高
Java 使用何种编码
- Java char 占 2 个字节,使用UTF-16BE 表示一个字符。由于它只使用 2 个字节,所以 char 只用能表示部分UTF-16编码,即0x0000 ~ 0xFFFF。对于 4 字节的 UTF-16,需要使用 2 个 char。
- Java 源文件和 class 文件,默认采用平台编码用于存储,Linux/Unix是UTF-8,Window 采用 GBK。一般常用的 IDE 如 Intellij IDEA 和 Eclipse 都能提供多种编码。
- Java 中把 String 转换成字节码,默认使用平台默认的编码。看看 getBytes 的注释。
原文引用链接:https://blog.csdn.net/psc0606/article/details/96473494
可以在结合这个: https://blog.csdn.net/wenzhou1219/article/details/44496961
三、变量的作用域
- 对于在作用域里定义的变量,作用域同时决定了它的“可见性”以及“存在时间”。在JAVA里,作用域是由花括号的位置决定的。JAVA用一对大括号作为语句块的范围,称为作用域,在作用域里定义的变量,只有在该作用域结束之前才可使用。
在JAVA中,变量的作用域分为四个级别:类级、对象实例级、方法级、块级。
- 类级变量又称全局级变量或静态变量,需要使用static关键字修饰。类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化。
- 对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问。成员变量是定义在方法之外,类之内的。成员变量随着对象的创建而存在,随着对象的消失而消失。
- 方法级变量就是在方法内部定义的变量,就是局部变量。局部变量在调用了对应的方法时执行到了创建该变量的语句时存在,局部变量的作用域从它被声明的点开始,一旦出了自己的作用域马上从内存中消失。
- 块级变量就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如 if、for 语句的块。块是指由大括号包围的代码
引用链接: https://blog.csdn.net/bupa900318/article/details/80555929
运算符
一、 算术运算符
运算符和表达式
- 运算符:对常量或者变量进行操作的符号
- 表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式
- 举例说明
int a = 10;
int b = 20;
int c = a + b;
// + :是运算符,并且是算术运算符
// a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式
算术运算符
注:整数相除,结果只能得到整数,如果想要得到带有小数的结果,必须加入小数(浮点类型)的运算
字符的“+”操作
- 阅读下列代码,思考运行结果
public class Test{
public static void main(String[] args){
int a = 1;
char b = 'a';
System.out.println(a + b);
// 输出98
}
}
-
a + b 的运算中,a为int类型,b为char类型。当(byte short char int )在一起运算的时候,都会提升为int之后,再进行运算
-
但是,char属于字符,字符是怎样提升为int数值的呢?
- java中char占两个字节,使用UTF-16BE 表示一个字符,8位的ASCII码包含在Unicode中,是从0~127的。
- ASCII码表(American Standard Code for Information Interchange):美国信息交换标准代码,是计算机中字节到字符的一套对应关系
- char提升为int的过程,就是查找码表中,字符所对应的数值表示形式
- 字符 ‘a’ 查找到数值的97之后,再跟数值1进行运算,结果就是98.所以,最终输出在控制台的结果就是98
字符串的+操作
- 当
+
操作中出现字符串时,这个+
是字符串连接符,而不是算术运算符- 字符串可以使用
+
号,跟任意数据类型拼接
- 字符串可以使用
System.out.println(1+99+"xx");
// 输出100xx
System.out.println("5+5="+5+5);
// 输出5+5=55
注:在+
操作中,如果出现了字符串,就是连接运算符,否则就是算术运算符。当连续进行+
操作时,从左到右逐个执行。
案例:数值拆分
-
需求:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台
-
运行结果:
-
请输入一个三位数:
123
整数123个位为:3
整数123十位为:2
整数123百位为:1
-
import java.util.Scanner;
public class Demo05 {
/*
1、使用Scanner键盘录入一个三位数
2、个位:数值 % 10
十位:数值 / 10 % 10
百位:数值 / 100
3、将个位,十位,百位拼接上正确的字符串,打印即可
*/
public static void main(String[] args) {
System.out.println("请输入一个三位数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int numFirst = num % 10;
int numSecond = num /10 % 10;
int numLast = num / 100;
System.out.println("整数" + num + "个位为:"+ numFirst);
System.out.println("整数" + num + "十位为:"+ numSecond);
System.out.println("整数" + num + "百位为:"+ numLast);
}
}
- 公式总结
个位:数值 % 10
十位:数值 / 10 % 10
百位:数值 / 10 / 10 % 10
千位:数值 / 10 / 10 / 10 % 10
二、自增自减运算符
自增自减运算符
符号 | 作用 | 说明 |
---|---|---|
++ | 自增 | 变量的值加1 |
– | 自减 | 变量的值减1 |
- ++和–既可以放在变量的后面,也可以放在变量的前边
- 一旦参与操作
++在前:先对该变量做自增(++)或者自减(–),然后再拿变量参与操作
++在后:先将该变量原本的值,取出来参与操作,然后再进行自增(++),自减(–)
注:自增自减运算符只能操作变量,不能操作常量
三、赋值运算符
赋值运算符
例
short s = 1;
// s = s + 1; 错误:(23, 15) java: 不兼容的类型: 从int转换到short可能会有损失
s = (short)(s + 1);
System.out.println(s);
short ss = 1;
ss += 1; //编译通过
System.out.println(ss);
注:拓展的赋值运算符隐含了一个强制类型转换
四、关系运算符(比较运算符)
五、逻辑运算符
逻辑运算符概述
- 引入
在数学中有5<x<15
在java中,需要把上面的式子先进行拆解,再进行合并表达
- 拆解:x > 5和x < 15
- 合并:x > 5 & x < 15
- 逻辑运算符是用来连接关系表达式的运算符,也可以直接连接布尔类型的常量或者变量
- 包含逻辑运算符的表达式称之为逻辑表达式
短路逻辑运算符
注:
-
逻辑与&,无论左边真假,右边都要执行
短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行
-
逻辑或|,无论左边真假,右边都要执行
短路或||,如果左边为假,右边执行;如果左边为真,右边不执行
六、三元运算符
三元运算符
- 格式:关系表达式?表达式1:表达式2;
执行流程:
首先计算关系表达式的值
如果值为true,取表达式1的值
如果值为false,取表达式2的值
例:
int a = 10;
int b = 20;
int max = a > b? a : b;
案例:三个和尚
三个和尚身高分别是 210 165 150(cm),求最高的那个
int height1 = 210;
int height2 = 165;
int height3 = 150;
int tempHeight = (height1 > height2) ? height1:height2;
int heightMax = (tempHeight > height3) ? tempHeight : height3;
// 可以合并成一句,但是阅读起来不舒服