p22 标识符和关键字
1、标识符
凡程序员自己有权命名的标识都是标识符,标识符可以用做标识什么:
类名
方法名
变量名
接口名
常量名
引用名
... ...
2、标识符命名规则:
规则1:标识符只能由 字母abc、中文、数字123、下划线_ 、美元符$ 组成,不能含有其它符号
规则2:不能以数字开头
规则3:不能是关键字
规则4:严格区分大小写(对于大小写不同的同名类,win会视为重名,因此无法全部编译)
规则5:标识符理论上没有长度限制
3、标识符的命名规范:
规范1:见名知义
规范2:遵循驼峰命名方式
规范3:类名、接口名首字母大写
规范4:变量名、方法名首字母小写
规范5:常量名全部大写,单词之间使用下划线_连接
4、关键字
在SUN公司开发java语言的时候,提前定义好了一些具有特殊含义的单词,这些单词全部小写,具有特殊含义,不能用作标识符
package import class(类) interface(接口) //头
public protected(受保护的) default private static final(最终的) abstract //修饰符
extends(继承) implements(实现接口) //声明
new(创建对象) instanceof(实例运算符) //运算符
this(当前类的) super(父类的) //引用
byte short int long float double char boolean void(无返回值) String(字符串) //数据类型
if else switch case do while for break continue goto return //流程控制
Scanner System(系统的) Arrays(数组类) Math(数学类)【random()】 //类库类
p26变量、常量、作用域
1、字面量
软件执行过程中主要就是对数据的处理,“字面量”的概念就是具体而明确的数据,在java语言中“数据”被称为字面量/字面值
字面量的种类可以分为:
整型字面量:1 2 3 10 100 -100 -200 ...
浮点型字面量:1.0 1.2 3.14 ...
布尔型字面量:true false
字符型字面量:\'a\' 、\'b\' 、\'人\' 、\'中\'
字符串型字面量:"a" 、"abc" 、"123" 、"中国" 、
- 其中字符型和字符串型都是描述了现实世界中的文字
- 字符型只能是单个字符
- 所有字符型只能使用单引号 \' \' 包围,所有字符串型只能使用双引号 "" 包围
- 单引号的一定是字符型,双引号的一定是字符串型
2、变量
1)变量就是可以改变赋值的标识符,表示计算机里的一块存储空间
2)变量实际是内存当中存储数据的最基本单元,变量就是一个存储数据的盒子
3)java是强类型语言,每个变量都必须声明类型,可以是基本类型,也可以是引用类型
4)变量包括三要素:
类型 + 名称 + 值
数据类型:决定开辟空间的大小
变量名: 程序通过名称访问变量
值: 是变量保存的数据
5)声明变量的语法格式:
数据类型 变量名 = 值;
type varName = value;
注意事项:
- 一行上可以声明多个同类型变量用逗号 , 间隔
- 变量必须初始化之后,才能使用
- 变量声明是一条完整的语句,因此声明必须以分号 ; 结束
3、作用域
1.1、作用域就是变量的有效范围作用范围
1.2、变量的作用域从属于大括号
1.3、同一个域中变量不能有重名
1.4、不同域的同名变量的访问遵守就近原则,即访问最近作用域的那一个
1.5、不同的作用域大致有:
类体域
方法体域
循环体域
2、变量的分类:
1)静态变量 static修饰,从属于类,可以不用手动初始化,在加载字节码时系统会用默认值初始化
2)实例变量 写在类体中,无static修饰,从属于对象,可以不用手动初始化,在创建对象时系统会用默认值初始化
3)局部变量 写在方法体和循环体里,从属于方法/循环,必须手动初始化之后,才能访问
注意:
- 所有的变量都必须初始化之后才能使用,变量在使用之前必须初始化
- final修饰的成员变量必须手动初始化,因为final修饰的成员变量的值不能修改,sun规定不能使用系统默认值
示例1:按照作用域变量的分类
public class VariableTest{ int x = 20; //实例变量 static int y = 200; //静态变量 public static void sum(int a,int b){ //局部变量a b int firstNum = 100; //局部变量 } }
示例2:不同作用域变量的访问方式区分
public class Test { //成员变量 static double salary = 2500; //实例变量 static final double PI = 3.14159265358979; //常量 //实例变量 int i; char c; boolean flag; String name; public static void main(String[] args) { int j = 0; //局部变量 Test t = new Test(); //引用也是局部变量 System.out.println(Test.salary); //类名访问 System.out.println(PI); //.. System.out.println(t.i); //对象引用访问 System.out.println(t.c); //.. System.out.println(t.flag); //.. System.out.println(t.name); //.. System.out.println(j); //直接访问 } }
p23 数据类型
1、数据类型用来定义变量,程序运行过程中根据不同的数据类型分配不同大小的内存空间
java的数据类型分为两大类,基本数据类型和引用数据类型,java中除了基本数据类型之外,剩下的都是引用数据类型
2、数据类型分类
2.1、基本类型(primitive type):
1)数值类型:
1》整数型:
1> byte 占1个字节范围 [-27~27-1] [-128~127]
2> short 占2个字节范围 [-215~215-1] [-32768~32767]
3> int 占4个字节范围 [-231~231-1] [-2147483648-2147483647]
4> long 占8个字节范围 [-263~263-1]
2》浮点型:
5> float 占4个字节 [-231~231-1]
6> double 占8个字节 [-263~263-1]
3》字符型:
7> char 占2两字节 [0~216-1] [0~65535]
2)布尔类型/逻辑类型:
8> boolean 占1位,只有两个值true和false
2.2、引用类型(reference type):
1》类
2》接口
3》数组
注意:
字符串类型String是引用数据类型
long类型要在数字后面加个L
float类型要在数字后面加个F
java官方规定,char字符型数据只能是单个字符,由单引号包围;String字符串型数据用双引号包围
所有字符本质还是数字,可以参与数字运算
位: 是计算机内部数据存储的最小单位
字节:是计算机中数据处理的基本单位,一般用大写B表示,1B=8位
字符:是指计算机中使用的字母、数字、字和符号。以二进制代码形式在计算机内存放,是数据结构中最小的数据存取单位,通常由8个二进制位(1个字节)来表示一个字符。
p24 数据类型详解扩展
1、整数型:
1.1、 java中整型数据有4中表示形式:
- 十进制数(0-9),二进制数以0b开头(0-1),八进制数以0开头(0-7 ),十六进制数以0x开头(0-9 A-F )
- 十进制数满是进位,二进制数满2进位,八进制数满8进位,十六进制满16进位
1.2、十进制与二进制的快速转换
1)、十进制转换成二进制
短除法:十进制数与2相除取余,将余数倒序输出,就是对应的二进制数
幂算法:枚举十进制数包含的幂2n,使幂的上标与二进制位次一一对应(位次=0 1 2 ...),将对应位次上的值设为1,就是对应的二进制数
2)、二进制转换成十进制
幂算法:将二进制数中位次上的1转换成对应的十进制幂2n,二进制的位次与十进制幂的上标一一对应(n=0 1 2 ...),求所有幂之和,就是对应的十进制数
3)、十进制幂与二进制位次对照
28 27 26 25 24 23 22 21 20
256 128 64 32 16 8 4 2 1
1 1 1 1 1 1 1 1 1
1.3、byte类型的最大值是怎么计算出来的?
byte在内存中占1个字节,即8个比特位
在计算机当中二进制数的最高位是符号位,0正1负,所以1byte可以存储的最大值是:0111 1111
故byte的取值范围为1000 0000 到 0111 1111
char没有负值,占两个字节,所以最小值为0,最大值为1111 1111 1111 1111,故取值范围是0~2^16-1(65535)
2、浮点型
浮点型数据:存在 有限、离散、舍入误差、大约、接近但不等于 等特点,最好避免完全使用浮点数进行比较。银行业务使用 BigDecimal 数学工具类
如:float f = 0.1f;
double d = 0.1d;
但是 f == d :false
3、字符型:
3.1、什么是字符编码?
- 字符编码是人为定义的一套转换表
- 在字符编码中规定了一系列的文字对应的二进制
- 字符编码的本质就是一本字典,描述了文字与二进制的对照关系
- 字符编码涉及编码和解码两个过程,编码和解码必须采用同一套字符编码方式,不然就会出现乱码
- ASCII码采用1byte进行存储,java语言为了支持全球所有的文字,采用了一种字符编码方式,即unicode编码
- 主要的编码方式有以下几种:
ASCII(\'a\'-->97 \'A\'-->65 \'0\'-->48)
ISO-8859-1
GB2312
GBK
GB18030
Big5
unicode(utf8 utf16 utf32)
3.2、转义字符:反斜杠:\ 具有转义功能
1)执行特殊功能
\t tab
\n 换行
\r 回车 移到行开头
\b 退格 向左退一列
\a 响铃
2)将连接的字符作为普通文本处理
\\' 一个单引号字符,不能自动配对
\" 一个单双号字符,不能自动配对
\\ 一个反斜杠字符
\u0000 空字符,\u连接一个4位十六进制编码,表示后面是一个字符的unicode编码
示例1:整数的4类表达形式,十进制数满是进位,二进制数满2进位,八进制数满8进位,十六进制满16进位
//十进制数满是进位,二进制数满2进位,八进制数满8进位,十六进制满16进位 public class Test{ public static void main(String[] args) { int a = 10; int b = 0b10; int c = 010; int d = 0x10; System.out.println(a+"\t"+b+"\t"+c+"\t"+d); } }
p25 类型转换
1、由于java是强类型语言,不同类型的数据要先转换为同一种类型,然后再进行运算。
类型容量大小排序:
低-----------------------------------------------------高
byte < short、char < int < long < float < double
3、类型转换:
1)布尔型不能进行类型转换
2)任何浮点类型都比整数型容量大
3)java语言中,整型数字被默认当作int类型来处理,浮点型字面值默认当作double类型来处理
4)如果整型字面值没有超出 byte、short、char的取值范围,就可以直接赋值给 byte、short、char类型的变量
5)byte、short、char混合运算时,会先各自转换成 int类型,再作运算
6)多种数据类型混合运算时,会先各自转换成容量大的那一种数据类型,再做运算
7)float,double类型在计算机中存储的是近似值
8)小容量向大容量转换时称为自动类型转换
9)大容量向小容量转换时,需要强制类型转换,否则会编译错误,类型用小括号()包围
10)强制转换可能会超出类型范围产生内存溢出
//示例枚举:
//赋值正确,因为数值20、1000没有超出byte、short类型的范围
byte a = 20;
short b = 1000;
int c = 1000;
//正确,可以自动转换
long d = c;
//错误,出现精度丢失问题
int e = d;
//正确,将long强制转换成int类型,值1000没有超出int范围,所以转换正确
int e = (int)d;
//10和3默认为int,运算后的最大类型也是int,所以正确
int f = 10/3;
long g = 10;
//错误,多个数据运算时,java会转换成容量最大的类型,运算后最大的类型是long,h为int,所以会出现精度丢失问题
int h = g/3;
//正确,强制类型转换后,结果没有超出int范围
int h = (int)g/3;
//可以用long类型来接收运算结果
int h = g/3;
//错误,优先级问题,将g转换成int类型,然后又转换成byte类型,再和3运算,运算的结果是int类型,所以会出现精度丢失问题
byte h= (byte)(int)g/3;
//正确
byte h= (byte)(int)(g/3);
//错误,出现精度丢失问题
byte h= (byte)g/3;
//正确,运算结果没有超出byte范围
byte h= (byte)(g/3);
//正确,运算结果没有超出short范围
short h= (short)(g/3);
short i = 10;
byte j = 5;
//错误,short和byte运算,首先会转换成int再运算,所以结果是int类型,出现精度丢失问题
short k = i + j;
//可以将结果强制转换成short
short k =(short) (i + j);
//也可以用int类型接收
int k = i + j;
char l = \'a\';
System.out.println(l);//a
//输出是97,是a的ascii码
System.out.println((byte)l);
int m = l+100;
//输出是197,获取a的ascii码值后再进行运算
System.out.println(m);
double n = 10/3;
System.out.println(n); //3.0
double n = 10.0/3;
System.out.println(n); //3.33333333333
补充知识:
1.1、补码:
- 在计算机底层存储的数据,永远是二进制的补码形式,因为补码形式效率最高
1.2、什么是补码?
- 二进制有:原码、反码、补码
- 正数的二进制的原码、反码、补码是完全相同的
如:byte i = 1;
对应的二进制原码:0000 0001
对应的二进制反码:0000 0001
对应的二进制补码:0000 0001
- 负数的二进制的原码、反码、补码,符号位不变,其它位则取反或补1
如:byte i = -1;
对应的二进制原码:1000 0001
对应的二进制反码(取反):1111 1110
对应的二进制补码(反码+1):1111 1111
1.3、可以采用逆推导的方式获取二进制的原码
例:(byte)150
首先150是int类型二进制码是:
00000000 00000000 00000000 00000000 10010110
强转为byte类型后二进制码是:
10010110
计算机存储的都是二进制的补码形式,可以采用逆推的方式获取原码:
10010110--->二进制补码形式
10010101--->二进制反码形式
11101010--->二进制原码形式(-106)
练习题:
1、 通过变量来描述学生的信息
/* 通过变量来描述学生的信息,学生信息包括:学号、姓名、性别、身高。 其中学号采用整数,姓名采用字符串,性别采用字符型,身高采用浮点型。 具体的学生数据有两份,第一个学生信息是:学号110,姓名张三,性别男,身高1.85米。 第二个学生信息是:学号120,姓名李四,性别女,身高1.65米。 要求最终将学生的信息输出到控制台 */ public class StudentMessage{ public static void main(String[] args){ int id = 110; String name = "张三"; char sex = \'男\'; double height = 1.85; System.out.println("学号:" + id); System.out.println("姓名:" + name); System.out.println("性别:" + sex); System.out.println("身高:" + height + "米"); System.out.println("-------------------"); int id1 = 120; String name1 = "李四"; char sex1 = \'女\'; double height1 = 1.65; System.out.println("学号:" + id1); System.out.println("姓名:" + name1); System.out.println("性别:" + sex1); System.out.println("身高:" + height1 + "米"); } }
2021-12-08