变量_数据类型_运算符
介绍一些编程中的基本概念,比如:标识符、变量、常量、数据类型、运算符、基本数据类型的类型转换等。这些是编程中的“砖块”,是编程的基础。 要想开始正式编程,还需要再学“控制语句”控制语句就像“水泥”,可以把“砖块”粘到一起,最终形成“一座大厦”。
秃头建议:一定不要纠结于概念,不要停留,大致了解就快速向下。永远记住“快速入门、快速实战;实战中提高,发展中解决问题”。
二进制
二进制,是计算技术中广泛采用的一种数制,由德国数理哲学大师莱布尼茨于 1679 年发明。二进制数据是用 0 和 1 两个数码来表示的数。它的基数为 2,
进位规则是“逢二进一
”。
二进制对应两种状态,广泛应用于电子科学。比如:可以对应电子器件的开关状态、对应信号电压状态(+5V 等价于逻辑"1",0V 等价于逻辑"0")、对应卡带是否打孔状态、电磁存储(磁体状态:南为 0,北为 1)等等
二进制十进制的转换
在线进制转化的工具: https://tool.lu/hexconvert/
这部分不需要纠结属于进制的底层 各人有需要可以看我的{
进制转换文章}
注释
写注释的好处:
做一个人见人爱的程序员!
不写注释的好处:
做一个离职后,前公司还得求你的程序员!
注释不会出现在字节码文件中,即 Java 编译器编译时会跳过注释语句。
在 Java 中根据注释的功能不同,主要分为单行注释、多行注释和文档注释。
单行注释
单行注释使用“//”开头。
多行注释
多行注释以“/*”开头以“*/”结尾。注意,多行注释不能嵌套使用。
文档注释
文档注释以“/**”开头以“*/”结尾,注释中包含一些说明性的文字及一些 JavaDoc 标签(后期写项目时,可以生成项目的 API)
/** * 大家好我是文档注释 */ public class Test { public static void main(String[] args/*大家好我是行内注释*/) { //大家好我是单行注释 System.out.println("Hello world"); /* 大家好我是多行注释 */ } }
标识符和关键字
标识符是用来给变量、类、方法以及包进行命名的。4 大规则:
还是要记一下的
- 必须以字母、下划线_、美元符号$开头。
- 其它部分可以是字母、下划线“_”、美元符“$”和数字的任意组合。
- 大小写敏感,且长度无限制。
- 不可以是 Java 的关键字。
使用规范:
常说的驼峰原则,就是第一个字母大写、如Main
如果两个单词 如mybook 正确的写法是两个单词的首字母都大写-MyBook
Java 不采用 ASCII 字符集,而是采用 Unicode 字符集。因此,这里字母的含义不仅仅是英文,还包括汉字等等。但是不建议大家使用汉字来定义标识符!
合法标识符示例:
int a = 3;int _123 = 3;int $12aa = 3;int 变量1 = 55; //不建议使用中文命名的标识符
不合法示例:
int 1a = 3; //不能用数字开头int a# = 3; //不能包含#这样的特殊字符int int = 3; //不能使用关键字
关键字/保留字
Java 关键字是 Java 语言保留供内部使用的,如 class 用于定义类。 我们不能使用关键字作为变量名或方法名。
表 Java 中的关键字/保留字
abstract
|
assert
|
boolean
|
break
|
byte
| case |
catch
| char |
class
| const |
continue
| default |
do
| double | else |
extends
|
final
| finally |
float
| for | goto | if |
implements
| inport |
instanceof
| int |
interface
| long |
native
| new |
null |
package
| private |
protected
|
public
| return |
short |
static
|
strictfp
| super | switch |
synchronized
|
this |
throw
|
throws
|
transient
|
try
| void |
volatile
| while |
雷区:出于应试教育的惯性思维,很多新手很可能去背上面的单词,从实战思维出发,我们不需要刻意去记!随着学习的深入,自然就非常熟悉了。
变量
变量的本质
变量本质上就是代表一个”可操作的存储空间”,空间位置是确定的,但是里面放置什么值不确定。
可通过变量名来访问“对应的存储空间”,从而操纵这个“存储空间”存储的值。
Java 是一种强类型语言,每个变量都必须声明其数据类型。变量的数据类型决定了变量占据存储空间的大小。 比如,int a=3; 表示 a 变量的空间大小为 4 个字节
变量的声明
double salary ;long earthPopulation ;int age ;
不同数据类型的常量会在内存中分配不同的空间
![](https://i-blog.csdnimg.cn/direct/61ea760bb10543d3b69599765cb39e6b.png)
声明变量和初始化:
int age = 18;double e = 2.718281828;int i ,j; // 两个变量的数据类型都是 int
变量的分类和作用域
局部变量、成员变量、静态变量的核心区别
类型 | 声明位置 | 从属于 | 生命周期(作用域) |
---|---|---|---|
局部变量
|
方法或语句块内部
|
方法/语句块
|
从声明位置开始,直到方法或语
句块执行完毕,局部变量消失
|
成员变量
(实例变量)
|
类内部,方法外部
|
对象
|
对象创建,成员变量也跟着创
建。对象消失,成员变量也跟着
消失;
|
静态变量
(类变量)
|
类内部,static 修饰
| 类 |
类被加载,静态变量就有效;类
被卸载,静态变量消失。
|
秃头建议:
成员变量和静态变量不是目前重点,不要过多纠结理解与否。我们学习面向对象时,再
重点讲解成员变量和静态变量。
局部变量
方法或语句块内部定义的变量。生命周期是从声明位置开始到到方法或语句块执行完毕为止。局部变量在使用前必须先声明、初始化(赋初值)再使用
【示例】局部变量的声明
public void test() {int i ;int j = i +5 ; // 编译出错,变量 i 还未被初始化}
public void test() {int i ;i =10;int j = i +5 ; // 编译正确}
成员变量
(也叫实例变量 member variable)【暂不用掌握,讲面向对象再说】
方法外部、类的内部定义的变量。从属于对象,生命周期伴随对象始终。如果不自行初始化,它会自动初始化成该类型的默认初始值。
实例变量的声明
public class Test {int i ;}
静态变量
(类变量 static variable)【暂不用掌握,讲面向对象再说】
使用 static 定义。 从属于类,生命周期伴随类始终,从类加载到卸载。
(注:讲完内存
分析后我们再深入!先放一放这个概念!)
如果不自行初始化,与成员变量相同会自动初始化成该类型的默认初始值
注意:目前大家只需要了解基本的分类概念即可。不需要掌握,后面讲了方法、对象、类以后 再深入学习。
常量
在 Java 语言中,用关键字 final 来定义一个常量。常量一旦被初始化后不能再更改。
声明格式:
final type varName = value;
常量的声明及使用
public class TestConstants {public static void main(String[ ] args ) {final double PI = 3.14;// PI = 3.15; //编译错误,不能再被赋值!double r = 4;double area = PI * r * r ;double circle = 2 * PI * r ;System. out .println( "area = " + area );System. out .println( "circle = " + circle );}}
秃头建议变量和常量命名规范
- 所有变量、方法、类名:见名知义
- 类成员变量:首字母小写和驼峰原则: monthSalary
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写和驼峰原则: Man, GoodMan
- 方法名:首字母小写和驼峰原则: run(), runRun()
基本数据类型(primitive data type)
Java 数据类型分为两大类:基本数据类型(primitive data type)和引用数据类型(referencedata type)。
注意事项
- 引用数据类型的大小统一为 4 个字节,记录的是其引用对象的地址!
- 本章只讲解基本数据类型。引用数据类型在后续数组和面向对象章节讲解。
整型
类型 | 字节 | 范围 |
byte | 1字节 |
-2
7
~ 2
7
-1(-128~127)
|
short | 2字节 |
-2
15
~ 2
15
-1 (-32768~32767)
|
int | 4字节 |
-2
31
~ 2
31
-1 (-2147483648~2147483647) 约 21 亿
|
long | 8字节 |
-2
63
~ 2
63
-1
|
Java 语言整型常量的四种表示形式
- 十进制整数,如:99, -500, 0
- 八进制整数,要求以 0 开头,如:015
- 十六进制数,要求 0x 或 0X 开头,如:0x15
- 二进制数,要求 0b 或 0B 开头,如:0b01110011
Java 语言的整型常数默认为 int 型,声明 long 型常量可以后加‘ l ’或‘ L ’ 。
long 类型常数的写法及变量的声明
long a = 55555555; //编译成功,在 int 表示的范围内(21 亿内)。long b = 55555555555; //不加 L 编译错误,已经超过 int 表示的范围。
报错:The literal 55555555555 of type int is out of range,所以我们需要修改代码为:long b = 55555555555L;
浮点型
类型 | 字节 | 范围 |
float | 4字节 |
-3.403E38~3.403E38
|
double | 8字节 |
-1.798E308~1.798E308
|
- float 类型又被称作单精度类型,尾数可以精确到 7 位有效数字。
- double 表示这种类型的数值精度约是 float 类型的两倍,又被称作双精度类型,绝大部分应用程序都采用 double 类型。
- Java 浮点类型常量有两种表示形式
- 十进制数形式: 例: 3.14 314.0 0.314
- 科学记数法形式 例:3.14e0 3.14E2 3.14E-1
- 浮点型不精确,不要用于比较
- 浮点数存在舍入误差,数字不能精确表示。浮点数适合普通的科学和工程计算,精度足够;但不适合精度要求非常高的商业计算,这时候要使用 BigDecimal 进行运算和比较。
- 浮点常量默认类型是 double,要改成 float 可以后面加 F 或 f
使用科学记数法给浮点型变量赋值
double f = 314e2; //314*10^2-->31400.0double f2 = 314e-2; //314*10^(-2)-->3.14
float 类型常量的写法及变量的声明
float f = 3.14F; //float 类型赋值时需要添加后缀 F/fdouble d1 = 3.14;double d2 = 3.14D;
雷区:不要使用浮点数进行比较!很多新人甚至很多理论不扎实的有工作经验的程序员也会犯这个错误!需要比较请使用 BigDecimal 类
字符型
简单的说就是char类型
字符型演示:char eChar = 'a' ;char cChar = '中' ;
字符型的十六进制值表示方法:char c = '\u0061' ;
转义字符:char c2 = '\n' ; //代表换行符其他转义字符请查看转义字符表
注意事项以后我们学的 String 类,其实是字符序列(char sequence), 本质是 char 字符组成的数组。
布尔型(Boolean)
boolean 类型有两个常量值,true 和 false
boolean 类型演示boolean flag ;flag = true ; //或者 flag=false;if ( flag ) {// true 分支} else {// false 分支}
秃头建议:Less is More!!请不要这样写:if ( flag = = true ),只有新手才那么写。关键也很容易写成 if(flag=true),这样就变成赋值 flag 为 true 而不是判断!老鸟的写法是 if ( flag )或者 if ( !flag)
运算符
计算机的基本用途就是执行数学运算,Java 提供了一套丰富的运算符来操作变量。
![](https://i-blog.csdnimg.cn/direct/4002354c01ae4d4cbb218fa98e23479d.png)
算数运算符
- +,-,*,/,%属于二元运算符。%是取模运算符,就是我们常说的求余数操作。
- 算术运算符中++(自增),--(自减)属于一元运算符。
二元运算符的运算规则:
整数运算:
- 如果两个操作数有一个为 long, 则结果也为 long。
- 没有 long 时,结果为 int。即使操作数全为 short,byte,结果也是 int。
浮点运算:
- 如果两个操作数有一个为 double,则结果为 double。
- 只有两个操作数都是 float,则结果才为 float。
取模运算:
- 其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如:7%3=1,-7%3=-1,7%-3=1。
一元运算符++与--int a = 3;int b = a ++; //执行完后,b=3。先给b赋值,再自增。System. out .println( "a=" + a + "\nb=" + b );a = 3;b = ++ a ; //执行完后,b=4。a先自增,再给b赋值System. out .println( "a=" + a + "\nb=" + b );结果为a=4b=3a=4b=4
复制及其扩展运算符
扩展运算符
int a =3;int b =4;a += b ; //相当于a=a+b;System. out .println( "a=" + a + "\nb=" + b );a =3;a *= b +3; //相当于a=a*(b+3)System. out .println( "a=" + a + "\nb=" + b );结果为a=7b=4a=21b=4
关系运算符
关系运算符用来进行比较运算。关系运算的结果是布尔值:true/false
![](https://i-blog.csdnimg.cn/direct/faa5b543cc4d4964aee0a1161c9c8ea2.png)
注意事项
- =是赋值运算符,而真正的判断两个操作数是否相等的运算符是==。
- ==、!= 是所有(基本和引用)数据类型都可以使用。
- > 、>=、 <、 <= 仅针对数值类型(byte/short/int/long,float/double 以及 char)。
逻辑运算符
逻辑运算的操作数和运算结果都是 boolean 值。
![](https://i-blog.csdnimg.cn/direct/75182fb9446d4b37a2a259ca9cefaf98.png)
短路与和短路或采用短路的方式。从左到右计算,如果只通过运算符左边的操作数就能够确定该逻辑表达式的值,则不会继续计算运算符右边的操作数,提高效率。
短路与和逻辑与
- //1>2 的结果为 false,那么整个表达式的结果即为 false,将不再计算 2>(3/0)
- boolean c = 1>2 && 2>(3/0);
- System.out.println(c);
- //1>2 的结果为 false,那么整个表达式的结果即为 false,还要计算 2>(3/0),0 不能做除
- 数,//会输出异常信息
- boolean d = 1>2 & 2>(3/0);
- System.out.println(d);
位运算符
位运算指的是进行二进制位的运算。
左移运算和右移运算:
- int a = 3*2*2;
- int b = 3<<2; //相当于:3*2*2;
- int c = 12/2/2;
- int d = 12>>2; //相当于 12/2/2;
雷区:
- &和|既是逻辑运算符,也是位运算符。如果两侧操作数都是 boolean 类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
- 不要把“^”当做数学运算“乘方”,是“位的异或”操作。
字符串连接符
“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
连接符“+”
- int a=12;
- System.out.println("a="+a);//输出结果: a=12
条件运算符
也称三目运算符
String
type
=
score
<60?
"不及格"
:
"及格"
;
x 为 boolean 类型表达式,先计算 x 的值,若为 true,则整个运算的结果为表达式 y 的
值,否则整个运算结果为表达式 z 的值。
条件运算符
- int score = 80;
- int x = -100;
- String type =score<60?"不及格":"及格";
- int flag = x > 0 ? 1 : (x == 0 ? 0 : -1);
- System.out.println("type= " + type);
- System.out.println("flag= "+ flag);
结果
type=及格
flag= -1
算数优先级
秃头建议:
- 大家不需要去刻意的记这些优先级,表达式里面优先使用小括号来组织!!
- 逻辑与、逻辑或、逻辑非的优先级一定要熟悉!(逻辑非>逻辑与>逻辑或)。如:
- a||b&&c 的运算结果是:a||(b&&c),而不是(a||b)&&c
数据类型转换
我们讲解了八种基本数据类型,除了 boolean 类型之外的七种类型是可以自动转化的。
自动类型转换
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型
自动类型转换特例:
- short b = 12; //合法
- short b = 1234567; //非法,1234567 超出了 short 的表数范围
强制类型转换
强制类型转换,又称为造型(cast),用于强制转换数值的类型,可能损失精度。
对精度有要求的数据不建议强转
强制类型转换
- double x = 3.94;
- int nx = (int)x; //值为 3
- char c = 'a';
- int d = c+1;
- System.out.println(nx);
- System.out.println(d);
- System.out.println((char)d);
强制类型转换特例:
- int x = 300;
- byte bx = (byte)x; //值为 44
雷区
- 不能在布尔类型和任何数值类型之间做强制类型转换
基本类型转化时常见错误和问题
- 操作比较大的数时,要留意是否溢出,尤其是整数操作时。
- L 和 l 的问题:
- 不要命名名字为 l 的变量,字母 l 容易和数字 1 混淆。
- long 类型使用大写 L,不要用小写 l。
类型转换常见问题一
- int money = 1000000000; //10亿
- int years = 20; //返回的total是负数,超过了int的范围
- int total = money*years;
- System.out.println("total="+total);
- //返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long。但是已经发生//了数据丢失
- long total1 = money*years;
- System.out.println("total1="+total1);
- //返回的total2正确:先将一个因子变成long,整个表达式发生提升。全部用long来计算。
- long total2 = money*((long)years);
- System.out.println("total2="+total2);
结果
total=1474836480
total1=1474836480
total2=20000000000
类型转换常见问题二:
- int l = 2; //分不清是L还是1,
- long a = 23451l;//建议使用大写LSystem.out.println(l+1);
Scanner 处理键盘输入
就是可以接收键盘输入的一个函数
使用 Scanner 获取键盘输入:
- import java.util.Scanner;
- public class Welcome2 {
- public static void main(String[ ] args) {
- Scanner scanner = new Scanner(System.in);
- // 将输入的一行付给 string1
- String string1 = scanner.nextLine();
- // 将输入单词到第一个空白符为止的字符串付给 string2
- String string2 = scanner.next();
- // 将输入的数字赋值给变量
- int a = scanner.nextInt();
- System.out.println("-----录入的信息如下-------");
- System.out.println(string1);
- System.out.println(string2);
- System.out.println(a * 10);
- }
- }
结果
输入
-欢迎新手们
-欢迎你们
-03
输出
-----录入的信息如下-------
-欢迎新手们
-欢迎你们
-03
只讲干货
#有什么错误的地方大家多多担待,欢迎大家留下意见共同努力。
#需要什么技术的内容大家也可以积极留言。
#有升本的伙伴也可留言,后序也可更新升本内容C 和数据结构。
#有需要的伙伴或有什么问题直接联留下wx或联系邮箱2821835676qq.com