java基础课堂笔记01 - 基础概念课时2
p22 标识符和关键字
1、标识符
凡程序员自己有权命名的标识都是标识符,标识符可以用做标识什么:
类名
方法名
变量名
接口名
常量名
引用名
... ...
2、标识符命名规则:
规则1:标识符只能由 字母abc、中文、数字123、下划线_ 、美元符$ 组成,不能含有其它符号
规则2:不能以数字开头
规则3:不能是关键字
规则4:严格区分大小写(对于大小写不同的同名类,win会视为重名,因此无法全部编译)
规则5:标识符理论上没有长度限制
3、标识符的命名规范:
规范1:见名知义
规范2:遵循驼峰命名方式
规范3:类名、接口名首字母大写
规范4:变量名、方法名首字母小写
规范5:常量名全部大写,单词之间使用下划线_连接
4、关键字
在SUN公司开发java语言的时候,提前定义好了一些具有特殊含义的单词,这些单词全部小写,具有特殊含义,不能用作标识符
package import class(类) interface(接口) abstract //声明头
public protected(受保护的) default private static final(最终的) //修饰符
extends(继承) implements(实现接口) //关系声明
new(创建对象) instanceof(实例运算符) //运算符
this(当前类的) super(父类的) //引用
byte short int long float double char boolean void(无返回值) //基本数据类型
if else switch case do while for break continue goto return //流程控制
String(字符串) Scanner System(系统的) Arrays(数组类) Math(数学类) //类库的引用数据类型
p26变量、常量、作用域
1、字面量
软件执行过程中主要就是对数据的处理,“字面量”的概念就是具体而明确的数据,在java语言中“数据”被称为字面量/字面值
1.1- 字面量的种类可以分为:
整型字面量:1 2 3 10 100 -100 -200 ...
浮点型字面量:1.0 1.2 3.14 ...
布尔型字面量:true false
字符型字面量:'a' 、'b' 、'人' 、'中'
字符串型字面量:"a" 、"abc" 、"123" 、"中国" 、
1.2- 其中字符型和字符串型都是描述了现实世界中的文字
1.3- 字符型只能是单个字符
1.4- 所有字符型只能使用单引号 ' ' 包围,所有字符串型只能使用双引号 "" 包围
1.5- 单引号的一定是字符型,双引号的一定是字符串型
2、变量
- 变量就是可以改变赋值的标识符,表示计算机里的一块存储空间
- 变量实际是内存当中存储数据的最基本单元,变量就是一个存储数据的盒子
2.1)变量包括三要素:
类型 + 名称 + 值
数据类型:决定开辟空间的大小
变量名: 程序通过名称访问变量
值: 是变量保存的数据
2.2)声明变量的语法格式:
数据类型 变量;
数据类型 变量名 = 值;
type varName = value;
数据类型 变量1,变量2,变量3 ... ;
数据类型 变量1 = 值,变量2 = 值,变量3 = 值 ...;
2.3)注意要点:
1)声明变量必须声明类型,可以是基本类型,也可以是引用类型
2)变量声明是一条完整的语句,因此必须以分号 ; 结束
3)一行上可以声明多个变量,相同类型变量使用逗号 , 间隔
4)声明变量同时可以初始化变量,变量必须初始化之后,才能使用
3、作用域
1.1、作用域就是变量的有效范围作用范围
1.2、变量的作用域从属于大括号
1.3、同一个域中变量不能有重名
1.4、不同域的同名变量的访问遵守就近原则,即访问最近作用域的那一个
1.5、不同的作用域大致有:
类体域
方法体域
循环体域
4、变量的分类:
1)静态变量 static修饰,从属于类,可以不用手动初始化,在加载字节码时系统会用默认值初始化
2)实例变量 写在类体中,无static修饰,从属于对象,可以不用手动初始化,在创建对象时系统会用默认值初始化
3)局部变量 写在方法体和循环体里,从属于方法/循环,必须手动初始化之后,才能访问
5、注意:
- 所有的变量都必须初始化之后才能使用,变量在使用之前必须初始化
- 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); //直接访问 } }
练习题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 + "米"); } }
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》数组
3、注意:
1)java语言中,整型字面量程序默认当做int类型来处理,浮点型字面量默认当做double类型来处理
2) long类型要在数字后面加个L/l
float类型要在数字后面加个F/f
double类型可以在数字后面加个d,也可以省略
3)float,double类型在计算机中存储的是近似值,因此要避免完全使用浮点数进行比较
4) java官方规定,char字符型数据只能是单个字符,由单引号包围
所有字符本质还是数字,可以作为整型数据处理
5)字符串类型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(latin-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类型的变量,因为类型不兼容会编译错误
6)参与运算的数据必须是同一种类型,相同类型数据的运算结果的类型保持不变
7)byte、short、char类型混合运算时,会先各自转换成 int类型,再作运算
8)多种数据类型混合运算时,会先各自转换成容量大的那一种数据类型,再做运算
9)小容量向大容量转换时称为自动类型转换
10)大容量向小容量转换时,不会自动转换,需要强制类型转换,否则类型不兼容会编译错误
11)强制类型转换用小括号()包围,强制转换可能会超出类型范围产生精度损失
//示例列举:
//正确,整数没有超出byte、short、char类型的范围,可以直接赋值
byte a = 10;
short b = 30;
char c = 97; //‘a’
char c1 = ‘b’; //98
int d =100;
//错误,int类型的变量,无法直接传值给byte、short、char类型,因为类型不兼容,需要强制类型转换
byte a = d; short b = d; char c = d;
//正确,运算的结果是int类型,数据的运算结果的类型保持不变
d= 10/3;
//错误:类型不兼容,因为不同类型混合运算时,先自动转换成容量大的数据类型,所以右侧是int类型
a = a + 5;
//正确,等同于a = (byte)(a + 5); 扩展运算符最终不改变变量的数据类型
a += 5;
//正确,字符的本质还是数字,参与运算的是字符的ascii码
int d1 = a + b + c; int d2 = a + b + c1;
//错误,byte、short、char混合运算的结果是int类型,所以会出现类型不兼容
short b1 =a + b + c;
long e = 1000;
//错误,需要强制类型转换
int f = e;
//错误,数值过大超出int类型范围,需要转换为长整型数值2147483648L
long g = 2147483648;
long g = 10;
//错误,不同类型混合运算,结果是long类型,不能赋值给int类型
int h = g/3;
//正确,可以通过强制类型转换的方式处理
int h = (int)g/3;
//正确,也可以用long类型来接收运算结果
long h = g/3;
//错误,将g转换成int类型,然后又转换成byte类型,再和3运算,运算的结果还是int类型,仍然类型不兼容
byte i = (byte)(int)g/3;
//正确,类型转换也要处理好优先级问题
byte i = (byte)(int)(g/3);
//正确,字符的本质是数字,输出是字符的ascii码
System.out.println((byte)c);
//正确,字符的本质是数字,输出是数字ascii码对应的字符
System.out.println((char)d);
//正确,先获得整型的结果,后自动类型转换
//double m = 10/3;
System.out.println(m); //3.0
//正确,计算的结果是浮点型,混合类型计算,先各自统一类型,后进行计算
double n = 10.0/3;
System.out.println(n); //3.33333333333
p27 运算符
java语言支持以下运算符:
1、算术运算符: + - * / % ++ --
2、关系运算符: > < >= <= == != instanceof
3、逻辑运算符: & | ! && || !
4、赋值运算符: =
5、扩展赋值运算符: += -= *= /= %= ^= &= |= <<= >>=
6、条件运算符: ?:
7、字符串连接运算符: +
8、位运算符 : & | ^ ~ << >> >>>
9、new运算符:创建对象
说明:
1、算术运算符:
1.1、 % 模运算,取余,%10 可用于提取个位上的数字
1.2、 / 除运算,/10 /100取整 可用于提取个位/百位及前面的所有数字
1.3、 ++ 自减,单目运算符/一元运算符,a++ 先运算,后自加; ++a 先自加,后运算
1.4、 -- 自减,单目运算符/一元运算符,a-- 先运算,后自减; --a 先自减,后运算
2、关系运算符:
通常用于布尔表达式,它的运算结果通常是一个布尔类型boolean
3、逻辑运算:
要求两边的算子都是布尔类型,并且最终的运算结果也是一个布尔类型boolean
& 逻辑与 两边都是true,结果才是true,否则为false
| 逻辑或 一边是true,结果就是true,两边都是false,结果才是false
! 逻辑非 取反,假为真,真为假
&& 短路与 全真为真 有假为假
|| 短路或 有真为真 全假为假
4、赋值运算符:
4.1、= 赋值运算符右边优先级比较高,先执行右边的表达式,然后将右边表达式的结果赋给左边的变量(赋值)
4.2、扩展赋值运算符理解为:+= 累加递增, -= 追减递减 ......
4.3、使用扩展赋值运算符的变量必须先初始化,要有一个初始值才能使用扩展赋值运算符
4.4、扩展赋值运算符一定不会改变左边变量的数据类型,其运算过程等同于将四则运算的结果进行了强制类型转换
如:byte a = 10;
a += 5; //等同于a = (byte)(a + 5); 最终不改变a的数据类型
long x = 20L;
int y = 10;
y += x; //等同于y = (int)(y + x); 最终不改变y的数据类型
5、位运算符:
& 按位与 全1为1 有0为0
| 按位或 有1为1 全0为0
^ 按位异或 相异为1 相同为0
~ 按位取反 0为1 1为0 单目
<< 左移 相当于 *2
>> 右移 相当于 /2
>>> 无符号右移
6、条件运算符/三元运算符/三目运算符:?:
6.1、语法格式:
布尔表达式 ? 表达式1 : 表达式2
6.2、 它的执行原理是:
* 布尔表达式的结果为true时,表达式1的执行结果作为整个表达式的结果,即返回表达式1的值
* 布尔表达式的结果为false时,表达式2的执行结果作为整个表达式的结果,即返回表达式2的值
* 条件运算符只是一个运算符,参与数据运算之后返回一个值,不是一个完整的java语句
6.3、排错示例列举:
boolean sex = true;
//正确
char c = sex ? '男' : '女';
String s = sex ? "男" : "女";
//错误,条件运算符不是一个完整的java语句
sex ? '男' : '女';
//错误,类型不兼容,因为结果可能是String,也可能是char,不能用char类型接收
char c = sex ? "男" : '女';
//正确,两种类型的结果都可以输出
System.out.println(sex ? "男" : '女');
7、字符串连接符:+
7.1、什么时候求和运算?什么时候进行字符串拼接?
数据按照自左向右的顺序进行运算,当“+”运算符两边都是数字时,一定进行加法运算;当运算符任意一边是字符串类型时,一定进行字符串拼接操作,并且连接运算的结果还是一个字符串
7.2、字符串与变量拼接的口诀:加一个双引号“”,然后中间加两个加号++,然后中间加变量
如:int a = 10;
int b = 20;
System.out.println("30" + a + b); //301020
System.out.println(a + b + "30"); //3030
8、其它运算符:
new:创建对象
instanceof:实例运算符
练习题1:自加自减运算符的使用
public class Homework{ public static void main(String[] args){ int x = 10; int a = x + x++; //代码执行结束后,x就是11 System.out.println("a = " + a); //20 System.out.println("x = " + x); //11 int b = x + ++x; //代码执行结束后,x就是12 System.out.println("b = " + b); //23 System.out.println("x = " + x); //12 int c = x + x--; //代码执行结束后,x就是11 System.out.println("c = " + c); //24 System.out.println("x = " + x); //11 int d = x + --x; //代码执行结束后,x就是10 System.out.println("d = " + d); //21 System.out.println("x = " + x); //10 } }
补充知识:
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)
2、java中的标点符号全部使用英文格式,那么java中有哪些标点符号?分别是什么作用呢?
1 , 号 多个变量间隔,多个实参形参间隔,数组元素间隔
2 . 号 包目录层级,引用对象的属性和方法
3 : 号 标签,case分支
4 ; 号 语句结束符
5 () 小括号 if switch while for语句头,方法头
6 {} 大括号 代码块语句的起始结束符,包括if switch的分支代码块,while for的循环体代码块,方法体代码块,类体代码块,接口体代码块,数组元素
7 [] 中括号 声明数组
//即使再小的帆也能远航2021-12-08