Java零基础教学文档第一篇:JavaSE(2)

接上期后续
本期继续分享尚未结束的JavaSE章节
JavaSE属于初入门阶段,内容很多~
但很基础,
大家需保持耐心,慢慢的学~
争取你们学习的速度!
跟上我更新的速度哦~
在这里插入图片描述

今日新篇章

02-数据类型和运算符
【主要内容】

  1. 进制及其转换

  2. 关键字和标识符

  3. 变量和常量

  4. 八大基本数据类型

  5. Scanner键盘输入

  6. 基本数据类型的类型转换

  7. 算术运算符

  8. 赋值运算符

  9. 扩展赋值运算符

  10. 比较运算符

  11. 逻辑运算符

  12. 三目运算符

  13. 运算符的优先级别

【学习目标】
在这里插入图片描述

1. 进制及其转换【了解】

1.1 文件存储单位

任何数据在计算机中都是以二进制的形式存在的,二进制早期由电信号开关演变而来。

电脑中的信号都是以二进制数的形式给出的,二进制数是由0和1组成,电子元件的“开”、“关”分别表示“1”和“0”,一组电子元件的“开”和“关”状态就表示相应的二进制数。

一个电信号或者一个二进制位统称为Bit位,8个Bit位为一组组成一个字节Byte。
在这里插入图片描述

**【思考一】**一个bit位和字节表示的范围?

一个bit位表示的数的范围:0和1

一个byte表示的数的范围:256个数

无符号数:0-255(28-1) 256个数

有符号数:-128(-27)-- 127(27-1) 还是256个数

**【思考二】**为什么文件大小单位以1024为进制?

1KB = 1024Byte;

1MB = 1024KB;

1GB = 1024MB;

二进制数据是用0和1两个数码来表示的数。而2的10次恰好等于1024 ,所以为了方便就用了1024进制。

1.2 常见的进制介绍

n 2进制(计算机能够识别的),逢二进一

用0和1来表示

例如:整数5转化为二进制:0101

n 8进制,逢八进一

用0-7来表示

注意:八进制以0开头

例如:整数10转化为8进制:012

二进制三个bite位为一组,组成就是8进制。

n 10进制(人类最常见的进制),逢十进一

用0-9来表示

n 16进制,逢十六进一

用0-9和ABCDEF来表示

注意:16进制以0x开头

例如:整数31转化为16进制:0x1F

二进制四个bite位为一组,组成就是16进制。

八进制和十六进制由来,为了更好的表示二进制(缩短二进制长度) 。

1.3 整数的存储和运算

1.3.1 整数的存储

正数直接把十进制的值转化为二进制,然后存储在内存中。

【示例】

正数6在内存中的存储形式为:0000-0000 0000-0000 0000-0000 0000-0110

注意:正数的最高位肯定是0。

1.3.2 负数的存储

先把负数转化为原码,然后再转化为反码,最后在内存中以补码的形式存储。

原码:按照绝对值大小转换成的二进制数,称为原码

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

补码:反码加1称为补码。

【示例】

负数-6在内存中的存储步骤:

原码:0000-0000 0000-0000 0000-0000 0000-0110

反码:1111-1111 1111-1111 1111-1111 1111-1001

补码:1111-1111 1111-1111 1111-1111 1111-1010

注意:负数的最高位肯定是1。

2. 常量和变量

2.1 关键字&保留字

java关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等。
在这里插入图片描述

注意:这些关键字不要刻意去背,后面会慢慢介绍每个关键字的用法。

2.2 标识符

标识符是用于给java程序中的变量、类、方法、包等命名的符号。

标识符需要遵守一定的规则:

1)标识符必须以字母(A-Z和a-z)、数字(0-9)、下划线“_”、美元符号“$”组成。

2)标识符不能以数字开头,其它部分可以是字母、下划线、美元符和数字的任意组合。

3)Java 标识符大小写敏感,且长度无限制。

4)标识符不可以是Java的关键字

标识符的使用规范:
表示类名的标识符应首字母大写,并且采用驼峰式命名法则。

例如:Person, GoodStudent

表示方法和变量的标识符应首字母小写,并且采用驼峰式命名法则。

例如:int userName; public void eatFood(){}

注意:Java不采用通常语言使用的ASCII字符集,而是采用unicode这样的标准的国际字符集。因此,这里的字母的含义不仅仅是英文,还包括汉字等等。但是不建议大家使用汉字来定义标识符!

2.3 变量(Variable)

2.3.1 变量的本质

变量的本质,就是代表一个“可操作的存储空间”,空间位置是确定的,但是里面放置什么值不确定。 我们可以通过变量名来访问“对应的存储空间”,从而操纵这个“存储空间”存储的值。

Java是一种强类型语言,每个变量都必须声明其数据类型。变量的数据类型决定了变量占据存储空间的大小。

内存中变量好比旅馆的房间,内存中常量好比住旅馆房间的人。

2.3.2 变量的声明

变量声明语法:数据类型 变量名;

变量声明本质:就是在内存中开辟一块内存空间,用于存放指定数据类型的数据。

n 声明一个变量

public static void main(String[] args) {

// 声明一个int类型的变量

int age;

// 声明一个float类型的变量

double price;

}

n 同时声明多个变量

语法:数据类型 变量名1, 变量名2, 变量名3;

public static void main(String[] args) {

// 声明多个int类型的变量

int num1, num2, num3;

}

注意:同时声明多个变量,那么变量的类型就必须是同一类型。

2.3.3 变量的赋值

变量的赋值本质:通过变量名找到指定的内存空间,然后把数据存放到该内存空间中。

n 给变量赋值

public static void main(String[] args) {

// 声明一个int类型的变量

int age; // 在内容中开辟一块空间

// 给age变量赋值

age = 18; // 通过age变量赋值, 把等号右边的值赋值给等号左边的变量

}

注意:赋值的数据类型必须和声明变量类型一致。

n 声明和赋值同时进行

语法: 数据类型 变量名 = 数据值;

public static void main(String[] args) {

// 声明并赋值一个int类型的变量

int age = 18; // 把等号右边的值赋值给等号左边的变量

}

n 同时声明和赋值多个变量

语法:数据类型 变量名1 = 数据值1,变量名2 = 数据值2,变量名3 = 数据值3;

public static void main(String[] args) {

// 同时声明和赋值多个变量

int num1 = 10, num2 = 20, num3 = 30; // 不建议使用,可读性差

}

2.3.4 变量总结提升

变量的特点:在于“变”字,声明变量所开辟的内存空间可以多次赋值。

常见问题总结:

  1. 在方法中声明的变量,必须是赋值之后才能使用。

  2. 先声明后赋值,没用声明的变量名什么都不是。

  3. 变量名必须是合法的标识符,采用首字母小写的驼峰式命名。

  4. 赋值的数据类型必须和声明变量类型一致。

  5. 在同一个方法中,不能声明多个同名的变量。

2.4 常量(Constant)

常量通常指的是一个固定的值,例如:1、2.1、‘a’、true、false、“helloWorld”、“”、null等。

当然在Java语言中,我们也可以利用关键字final来定义一个常量。

语法:final 数据类型 常量名 = 数据值;

常量的特点:常量一旦被赋值后不能再更改其值。

final float PI = 3.1415926f;

【注意事项】

1、 常量只能被赋值一次,赋值完毕后就不能再更改值。

2、 常量名一般由大写字母组成,多个单词可以用下划线分割,例如:final int MAX_VALUE = 100;

3. 基本数据类型

java是一种强类型语言,每个变量都必须声明其类型。

java的数据类型分为两大类:基本类型(primitive type)和引用类型(reference type)。
在这里插入图片描述

3.1 整数型

整数型常量:

u 十进制整数,例如:123,-100等

u 八进制整数,要求以0开头,例如:015

u 十六进制整数,要求以0x或0X开头,例如:0x1A,0x15

数据类型占用存储空间越大,那么表数的范围也就越大。在实际开发中,我们应该根据实际情况选用合适的的数值类型,避免出现超出表数范围的情况(一般情况下我们选用int类型)。
在这里插入图片描述

【注意事项】

1、 注意数据类型的表数范围,避免出现超出表数范围精度丢失的情况。

2、整型常量默认为int类型,声明long型常量可以加“l”或“L”,建议使用“L”。

3.2 浮点型

小数类型在Java中称为浮点类型。

浮点型常量:

u 十进制数形式,例如:3.14 或 123.45

u 科学计数法形式,例如:314E2代表31400.0或314E-2代表3.14

浮点类型分为float类型和double类型:

u float类型被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。

u double类型被称作双精度类型,数值精度是float类型的两倍,绝大部分应用程序都采用double类型,浮点型常量默认为double类型
在这里插入图片描述

【注意事项】

1、 浮点型常量默认为double类型。

2、 浮点型常量赋值给float类型,需要在常量后面添加“f”或 “F”。

3、 避免直接比较两个浮点数的大小,这样比较可能会出现问题。

【扩展知识】

整数和浮点数在内存中的存储方式不一样,感兴趣的同学可以自行网上学习。

3.3 布尔型

boolean类型有两个值:true和false。true代表真,false代表假。

boolean类型用来判断逻辑条件,常用于程序流程控制。

【扩展知识】

在java规范中,没有明确指出boolean类型所占用的空间大小,深度解读可查阅这篇博文。

3.4 字符型

3.4.1 字符型

字符型在内存中占有2个字节,在Java中使用单引号包裹起来的一个字符称之为字符常量。

例如‘A’是一个字符,它与“A”是不同的,“A”表示含有一个字符的字符串。

【示例】字符型使用

public static void main(String[] args) {

char c1 = ‘a’; // 正确,声明并赋值一个’a’字符

char c2 = ‘安’; // 正确,声明并赋值一个’安’字符

char c3 = ‘8’; // 正确,声明并赋值一个’8’字符

char c4 = ‘88’; // 错误,单引号只能包裹一个字符

char c5 = ‘’; // 错误,单引号包裹的不能一个字符都没有

char c6 = “安”; // 错误,字符只能用单引号包裹,双引号包裹的为字符串

}

补充:char类型表示的是Unicode编码表中的字符,所以可以表示一个中文字符。

Ø char类型和int类型的联系和区别

char类型常量在内存中存储的就是Unicode编码值,例如:‘A’— 65, ‘1’— 49。

在一定范围内,char类型和int类型是可以通用的。

【示例】char类型和int类型

public static void main(String[] args) {

char c1 = ‘A’; // Unicode对应的数值为65

System.out.println(c1 + 1); // 输出:66

char c2 = 97; // Unicode对应的字符为’a’

System.out.println((char)(c2 - 32)); // 输出:‘A’

}

char类型和int类型区别:

1、 分配的内存空间不同,int类型占4个字节,char类型占用2个字节。

2、 数值表示的范围不同,int类型标识的范围比char类型更大,并且int类型还可以表示负数。

3.4.2 字符集

我们知道计算机只能识别0或1,在计算机中储存的信息都是用二进制数表示的,数值型我们知道该如何转化为2进制然后存储在内存,那么字符型在内存中又是怎么来存储的呢?

本质上字符是没法直接转化为二进制的,我们在屏幕上看到的英文、汉字等字符都是二进制数转换之后的结果。

通俗来说,按照何种规则将字符存储在计算机中,我们称为"编码"。例如字符’A’我们可以用十进制65来表示,然后把十进制65转化为二进制后存储在内存中;

反之,将存储在计算机中的二进制数解析显示出来,称为"解码"。例如我们从内存中取值的时候,如果取出来的值为十进制65,那么就代表了我们取出来的数据为字符‘A’。

于是乎人类按照以上的“编码”和“解码”规则就创建出了各个语言与之对应的编码表。

常见的字符编码表:

l ASCII:美国信息交换标准代码,是基于拉丁字母的一套电脑编码系统,主要用于显示现代的英语和西欧语言的编码表。

l GBK:全称《汉字内码扩展规范》,字库是用来表示中文用的编码。

l Unicode:又称为万国码、统一码,是为了解决传统的编码方案的局限性而产生的,他为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

Unicode编码,占2个字节,可允许有65536个字符,一个中文字符在内存中占用2个字节。

3.4.3 转义字符

Java 语言中还允许使用转义字符来将其后的字符转变为其它的含义。
在这里插入图片描述

4.Scanner键盘输入

java.util.Scanner是JDK1.5的新特征,主要功能是获取控制台输入的数据。

4.1 导入Scanner包

import java.util.Scanner;

在源文件的顶部导入java.util.Scanner;包,那么我们在该源文件中就可以使用Scanner类了。

4.2 初始化Scanner对象

Scanner input = new Scanner(System.in);

4.3 获取输入的数据

等待用户输入一个文本行并且回车,该方法得到一个对应类型的数据。

String str = input.next(); // 获取控制台输入的字符串

通过Scanner类的next()方法获取用户在控制台输入的字符串,通过nextByte()、nextShort()、nextInt()、nextLong()、nextFloat()、nextDouble()获取用户在控制台输入的基本数据类型。

【注意事项】

  1. 执行获取数据的方法时会造成线程堵塞,等待回车确认后才会执行后续的代码。

  2. Scanner提供的方法中没有获取字符的方法,也就是没有nextChar()方法。

【随堂练习】

1、 通过键盘录入获取圆的半径,然后计算出该圆的周长和面积。

5. 基本数据类型转换

在赋值运算或算术运算时,要求数据类型相同,否则就要进行类型转换。

转换的方式:

l 自动类型转换(隐式)

l 强制类型转换(显示)

基本数据类型的转换主要包含:byte、short、int、long、float、double和char,不包含boolean类型。

5.1 自动类型转换

自动类型转换(隐式类型转换)指的是容量小的数据类型可以自动转换为容量大的数据类型。

à 由低字节向高字节的转换 byte->short-> char –>int->long->float->double

【赋值运算中的类型转换案例】

public static void main(String[] args) {

// 把int类型的值赋值给double数据类型(符合低字节向高字节转换)

double num = 32;

// 把整数常量赋值给byte、 short和char类型变量(不符合低字节向高字节转换)

byte b = 123;

short s = 123;

byte by = 1234; // 错误,整数常量不能操出其类型的表数范围

}

把整数常量(int类型)赋值给byte、short和char类型变量,属于自动类型转换的特例,只要不超出其表数范围即可。

算数运算中的类型自动转换原则:

如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型,结果为double类型。

否则,如果其中一个操作数是float类型,另一个将会转换为float类型,结果为float类型。

否则,如果其中一个操作数是long类型,另一个会转换为long类型,结果为long类型。

否则,两个操作数都转换为int类型,结果为int类型。

【算数运算中的类型转换案例】

public static void main(String[] args) {

int num1 = 5; // int类型

double num2 = 7.34; // double类型

// 此处的num1会被提升为double类型

double sum = num1 + num2; // num1和num2的和为double类型

}

【常见面试题】

1、 byte b1 = 11; byte b2 = 12;byte sum = b1 + b2; 和int num1 = 100; int num2 = 300; int sum = num1 + num2;哪一个正确呢?

2、 请问说出100000L100000100000和100000100000100000的区别?

3、 int num1 = 90000; int num2 = 90000; int total = num1 * num2; 请问total的结果是多少?

5.2 强制类型转换

强制类型转换(显示类型转换),主要用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。

语法格式:目标类型 变量 =(目标类型)源类型变量或常量

【示例】
在这里插入图片描述

使用强制类型转换的时候,一定要明确需要强转的数据。

6. 运算符(operator)

6.1 算数运算符

6.1.1 二元运算符

二元运算符指的是需要两个操作数才能完成运算的运算符,例如:+,-,*,/,%。

【注意事项】

1、 +号不但可以做加法运算,还可以表示正号和字符串连接符。

2、 两个整数做除法(/)运算,结果只保留整数。

【随堂练习】

1、获取整数987的百位数、十位数和个位数。

6.1.2 一元运算符

只需要一个操作数的运算符称为一元运算符,如++,-- 等。

u ++ 自增运算符

如num++和++num,都等价于num = num + 1

num++和++num的区别:

++num 先自增,后参与运算

num++ 先参与运算,后自增

u –自减运算符

如num–和–num,都等价于num = num - 1

num–和–num的区别

–num 先自减,后参加运算

num-- 先参与运算,后自减

【思考】

1、可以对常量进行递增或递减操作吗?例如:5++或++5。

2、int num = 5; num = num++;请问代码执行后num的值为多少?

【随堂练习】

  1. int a = 3, b = 4; 求a++ / 3 + --b * 2 - a-- % 6 + b++ * 3 - ++b的值。

6.2 赋值运算符

= 把等号右边的值赋值给左边

【随堂练习】

1、交换两个变量的值(用两种方式实现)。

6.3 扩展赋值运算符

扩展赋值运算符:是算术运算符和赋值运算符结合。

【随堂练习】

1、 获取三个学生的成绩,并计算三个学生成绩的平均分。

【常见面试题】

1、 short num = 11; num = num + 1; 和short num = 11; num += 1;哪一个正确呢?

2、 int sum += 30; 请问这行语句语法是否正确???

6.4 比较运算符

比较运算符用来进行比较运算,比较运算符的运算结果是boolean类型。

、 <、 >=、 <=、==、 !=

6.5 逻辑运算符

参与逻辑运算的数据类型必须为boolean类型,逻辑运算后的结果也为boolean类型。

6.5.1 与运算(&)

&运算特点:

true & true = true;

true & false = false;

false & true = false;

false & false = false;

&运算规律:

运算两边只要有一个为false,那么结果肯定为false

只有运算两边都为true,那么结果才为true

6.5.2 或运算(|)

|运算特点:

true | true = true;

true | false = true;

false | true = true;

false | false = false;

|运算规律:

运算两边只要有一个true,那么结果肯定为true

只有运算两边都为false,那么结果才为false

6.5.3 异或运算(^)

^运算特点:

true ^ true = false;

true ^ false = true;

false ^ true = true;

false ^ false = false;

^运算规律:

运算两边相同,那么结果肯定为false

运算两边不同,那么结果肯定为true

6.5.4 非运算(!)

!运算特点:

!true = false;

!false = true;

6.5.5 短路与(&&)

&&和&的运算结果是一样的,但是运算的过程有所不同

&:无论左边的运算结果是什么,右边都需要参与运算

&&:如果左边运算结果为false,那么右边就不需要参与运算了,直接返回结果false

如果左边运算结果为true,那么需要进行右边的运算,并返回右边运算的结果
在这里插入图片描述

6.5.6 短路或(||)

||和|的运算结果是一样的,但是运算的过程有所不同

|:无论左边的运算结果是什么,右边都需要参与运算

||:如果左边运算结果为true,那么右边就不需要参与运算了,直接返回结果true

如果左边运算结果为false,那么需要进行右边的运算,并返回右边运算的结果

逻辑与 说明

逻辑 ||(或) 只要有一个为true,结果就为true

【随堂练习】

1、 判断一个数是否在4(包含)~6(不包含)之间;

2、判断一个数是否在4(不包含)~6(包含)之外;

6.6 位运算符【了解】

位运算是直接对二进制进行的运算。

6.6.1 <<左移

左移n位,等于在源数据上乘以2的n次方。

例如:3 << 1 = 6

 0000 0000 0000 0000 0000 0000 0000 0011

0 000 0000 0000 0000 0000 0000 0000 00110 左移低位补0

例如:3 << 2 = 12

 0000 0000 0000 0000 0000 0000 0000 0011

00 00 0000 0000 0000 0000 0000 0000 001100

【使用技巧】 3*2可以使用 3<<1来实现,这样做的效率更高。

6.6.2 >>右移

右移n位,等于在源数据上除以2的n次方

例如:6 >> 1 = 3

 0000 0000 0000 0000 0000 0000 0000 0110

 00000 0000 0000 0000 0000 0000 0000 011  0   **正数则在高位补0,负数则在高位补1**

例如:6 >> 2 = 1

0000 0000 0000 0000 0000 0000 0000 0110

000000 0000 0000 0000 0000 0000 0000 01 10

【使用技巧】 3/2可以使用 3>>1来实现,这样做的效率更高。

6.6.3 >>>无符号右移

和>>移动类似,但是无论值的正负,都在高位补0

6.6.4 &位运算

位都为1,结果才为1,否则结果为0

例如:7 & 3 = 3

111

&011


011

6.6.5 |位运算

位只要有一个为1,那么结果就是1,否则就为0

例如:7 | 3 = 7

111

|011


111

6.6.6 ^位运算

两个操作数的位中,相同则结果为0,不同则结果为1

例如:7 ^ 3 = 4

111

^011


100

【随堂练习】

1、不用临时变量就完成交换两个变量的值。

6.6.7 ~位运算

如果位为0,结果是1,如果位为1,结果是0

例如:~6 = -7

0000 0000 0000 0000 0000 0000 0000 0110

取反 1111 1111 1111 1111 1111 1111 1111 1001

6.7 三目运算符

三目运算符又称为三元运算。

语法格式:条件表达式? 表达式1 : 表达式2

如果条件表达式为true,则取表达式1的值,否则就取表达式2的值。

【随堂练习】

1、获取两个数的最大值或最小值

6.8 运算符优先级
在这里插入图片描述

大家不需要去刻意的记这些优先级,表达式里面优先使用小括号来组织!!

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值