Java学习笔记
- 2021 年 4 月 23 日
- 筆記
Java数据类型划分
Java中定义了四类/八种基本数据类型:
1、逻辑型——boolean
- boolean类型适用于逻辑运算,一般用于程序流程控制
- boolean类型数据只允许取值true或false,不可以0或非0的整数替代false和true。
- 关系运算的结果是一个逻辑值,true或false。这个值可以保存在一个对应的逻辑类型的变量中,这样的变量类型是boolean
- 布尔(Boolean)是为了纪念George Boole对逻辑计算的贡献
- boolean flag = true;
- boolean tooHigh,tooSmall,tooRough;
- boolean done = false;
2、字符型——char
- char型数据用来表示通常意义上“字符”
- 字符常量使用单引号括起来的单个字符
- 可以用一个整数代表一个char变量的值
char c1=65 等价于 char c1=‘A’;
- Java字符采用Unicode编码,每个字符占两个字节(16位),因而可用十六进制编码形式表示
- 字母和数字在Unicode表中是顺序排列的,大写字母和小写字母是分开排列的,并不在一起
- 逃逸字符
- 用来表达无法打印出来的控制字符或特殊字符,它由一个反斜杠“\”开头,后面跟上另一个字符,这两个字符合起来,组成了一个字符
- Java语言中还允许使用转义字符‘\’来将其后的字符转变为其它的含义
\n(换行) ,\b(退格) ,\t(到下一个表格位,水平制表,即加一个Tab),
\’(单引号),\”(双引号),\\(一个反斜线)
- char与String(字符串)
String不是基本数据类型,而是一个类,字符引在“ ”内
- 字符串String
- String是一个类,String的变量是对象的管理者而并非所有者
- 就像数组变量是数组的管理者而并非所有者一样
- 创建字符串
- String s = new String(“a string”)//创建了一个String的对象
- 用”a string”初始化这个对象
- 创建管理这个对象的变量s
- 让s管理这个对象
- 初始化字符串变量
- String s = “hello”;
- 编译器帮你你创建一个String类的对象交给s来管理
- 字符串连接
- 用加号(+)可以连接两个字符串
- “hello”+”world”——>”helloworld”
- 当这个+的一边是字符串,而另一边不是是,会将另一边表达为字符串然后做连接
- “I’m”+18——>”I’m 18”
- I+2+”age”——>”3age”
- “age”+I+2——>”age12”
- 用加号(+)可以连接两个字符串
- 输入字符串
- in.next();//读入一个单词,单词的标志是空格
- 空格包括空格、tab和换行
- in.nextLine();//读入一整行
- in.next();//读入一个单词,单词的标志是空格
- 字符串赋值所赋予的是两方共同管理这个字符串,并不是内容
- 字符串判断的话只会判断是否是指向同一个字符串,如需比较内容,需要使用equals()
- 字符串操作
- 字符串是对象,对它的所有操作都是通过”.”这个运算符来进行的
- 它表示对.左边的这个字符串做右边的那个操作
- 这里的字符串可以是变量也可以是常量
- Strings大小的比较
- 两个字符串可以比较大小:
- s1.compareTo(s2)
- 如果s1比s2小,那么结果是负的;如果s1和s2相等,那么结果是0;如果s1比s2大,那么结果是正的
- compareToIgnoreCase可以不区分大小写地来比较大小
- s1.compareTo(s2)
- 两个字符串可以比较大小:
- 获得String的长度
- 用length()函数
- 字符串是对象,对它的所有操作都是通过”.”这个运算符来进行的
-
-
-
-
-
- 访问String里的字符
- s.charAt(index)
- 返回在index上的单个字符
- index的范围是0到length()-1
- 第一个字符的index是0,和数组一样
- 但是不能用for-each循环来遍历字符串
- s.charAt(index)
- 得到子串
-
s.substring(n)
-
得到从n号位置到末尾的全部内容
-
s.substring(b,e)
- 得到从b号位置到e号位置之前的内容
-
- 访问String里的字符
-
-
-
-
- 加减完后就会变成整数类型,需要重新进行强制类型转换才能变成字符类型
3、整数型——byte,short,int,long
- Java语言整型变量的三种表现形式:
- 十进制整数,如12,-314,0
- 八进制整数,要求以0开头,如016 → 输出为14
- 十六进制数,要求0x或0x开头,如0x12
- Java语言的整数型常量默认为int型
- 声明long型常量可以加‘l’或‘L’,如: long I = 3L;
-
4、浮点型——float,double
Java浮点类型有固定的表述范围和字段长度
- Java浮点类型常量有两种表示形式
- 十进制数形式,必须含有小数点,例如:
3.14 |
314.0 |
0.314 |
float a = 52; 是整数的话可以没有小数点,但输出时会自动加上小数点
-
- 科学计数法形式,如:
3.14e |
3.14E2 |
314E-2 |
- Java浮点型常量默认为double型,如要声明一个常量为float,则需在数字后面加f或F,如:
double d=3.14;
float f=3.14f;
答案:ADF
5. 包裹类型
对于基本数据类型,Java提供了对应的包裹(wrap)类型。这些包裹类型将一个基本数据类型的数据转换成对象的形式,从而使得它们可以像对象一样参与运算和传递。下表列出了基本数据类型所对应的包裹类型:
基本类型 |
包裹类型 |
boolean |
Boolean |
char |
Character |
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
我们看到,除了int和char以外,包裹类型就是把基本类型的名字的第一个字母大写。在Java的系统类库中,所有第一个字母大写的,都是类的名字。所以在编辑程序的时候,一定要小心大小写,以免一不小心犯错。
- 用处
获得该类型的最大最小值
-
- Integer.MIN_VALUE
- Integer.MAX_VALUE
- 运算符
- 当需要让一个类或对象做事情的时候,用 . 运算符
- a.length
- Integer.MAX_VALUE
-
- 当需要让一个类或对象做事情的时候,用 . 运算符
6. 数值类型之间的转换
- 整数/小数类型之内,较短类型的值可以直接赋给较长的类型。
- 整数值可以直接赋值给小数类型。
- 强制类型转换—除以上情况外不同类型之间赋值均需做强制类型转换。
7. Java引用类型
- Java语言中除8种基本数据类型以外的数据类型成为引用类型
- 引用le’xii’n’g’shu’ju’yi’dui’xiang’de’xing’shi’cun’zai引用类型数据以对象的形式存在
- 引用类型变量的值是某个对象的地址,而不是对象本身
- 声明引用类型变量时,系统只为该变量分配引用空间,并未创建一个具体的对象
- Person p1=new Person();
- person p1; //创建一个引用类型的变量,准备指向一个Person类的对象
- p1=new Person(); //调用构造方法创建对象,并使p1指向该对象
8. 基本类型的默认值
Java类的成员变量默认初始化原则
Java变量分类
- 变量用于记录数值可变的依据
- 按所属的数据类型划分:
- 基本数据类型变量
- 引用数据类型变量
- 按被声明的位置划分:
- 局部变量:方向或语句块内部定义的变量
- 声明语法格式:
- 局部变量:方向或语句块内部定义的变量
变量类型 变量名1[=值1][,变量名2[=值2]…]
-
- 成员变量(属性):方法外部、类的内部定义的变量
- Java变量使用前必须先声明和初始化(赋初值)
- 变量作用域
- 局部变量的作用域就是它所在的方法或者语句块
- 在程序调用方法(进入语句块)时,局部变量才被创建并可用,随方法(语句块)的退出,局部变量将被销毁
- 变量的作用域是从定义的地方开始,到包含它的最小模块结束。
- 在变量的作用域之内不允许有其他同名的变量。
- 成员变量依附于对象存在,具有与对象的相同的生存期和作用域。
- 变量作用域举例:
运算符
-
- 算数运算符:+,–,*,/,%,++(自加),–(自减)
- 关系运算符:>,<,>=,<=,==,!=
- 布尔逻辑运算符:!,&,|,^, &&,||
- 位运算符:&,|,^,~,>>,<<,>>>
- 赋值运算符:=
- 扩展赋值运算符:+=,-=,*=,/=
- 字符串连接运算符:+
- 运算符优先级
优先级 |
运算符 |
类 |
综合性 |
1 |
() |
括号运算符 |
由左至右 |
1 |
[] |
方括号运算符 |
由左至右 |
2 |
!、+(正号)、-(负号) |
一元运算符 |
由右至左 |
2 |
~ |
位逻辑运算符 |
由右至左 |
2 |
++、– |
递增与递减运算符 |
由右至左 |
3 |
*、/、% |
算术运算符 |
由左至右 |
4 |
+、- |
算术运算符 |
由左至右 |
5 |
<<、>> |
位左移、右移运算符 |
由左至右 |
6 |
>、>=、<、<= |
关系运算符 |
由左至右 |
7 |
==、!= |
关系运算符 |
由左至右 |
8 |
&(位运算符AND) |
位逻辑运算符 |
由左至右 |
9 |
^(位运算符号XOR) |
位逻辑运算符 |
由左至右 |
10 |
|(位运算符号OR) |
位逻辑运算符 |
由左至右 |
11 |
&& |
逻辑运算符 |
由左至右 |
12 |
|| |
逻辑运算符 |
由左至右 |
13 |
?: |
条件运算符 |
由右至左 |
14 |
= |
赋值运算符 |
由右至左 |
-
- 逻辑运算符-操作数为逻辑类型
- 逻辑运算符功能
- 逻辑运算符-操作数为逻辑类型
!—— 逻辑非 & —— 逻辑与(位运算) | —— 逻辑或(位运算)
^ —— 逻辑异或 && —— 短路与 || —— 短路或
-
- 逻辑运算符功能说明:
-
- 短路逻辑运算符应用
&& —— 第一个操作数为假则不判断第二个操作数
|| —— 第一个操作数为真则不判断第二个操作数
-
- 关系和逻辑操作符返回boolean结果——true、false。
注:与C/C++不同,在Java中,0不能解释为false,非0不能解释为true。
- 位运算符–操作数为整数
- 位运算符功能
~——取反 &——按位与 |——按位或 ^——按位异或
-
- 位运算符功能说明:对二进制进行运算
- 移位运算符–操作数为整型
- 左移
- “a<<b;”将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位;
- 左移
例:00000101<<3=00101000
-
- 右移
-
- 带符号右移
-
-
- “a>>b;”将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位
-
例:11111011>>3=11111111
2.无符号右移
-
-
- “a>>>b;”将二进制形式的a逐位右移b位,最高位空出的b位补0。
-
例:11111011>>>3=00011111
-
- 位运算符性质
- 适用数据类型:byte、short、char、int、long,对低于int型的操作数将先自动转换为int型(32位)再位移。
- 将a左移x位相当于乘以2^x,16<<2返回16*2²=64.
- 将a带符号右移x位相当于除以2^x,-256>>4返回-256/2⁴=-16
- 位运算符性质
- 补充:数据的补码
补码:正数与原码相同,负数按位取反,末位加1
- 赋值运算符 =
- 当“=”两侧的数据类型不一致时,可以使用默认类型转换(变量能自动升级到更长的形式,如int值总可以赋给long变量)或强制类型转换原则进行处理
double z=12.414f;
long l=100; //默认类型转换
int smallval=99L; //非法
int i=(int)l; //强制类型转换
-
- 特例:可以将整型常量直接赋值给byte,short,char等类型变量,而不需要进行强制类型转换,只要不超过其表数范围
byte b=12; //合法
byte b=4096; //非法
math类
- math类是java中进行数学运算的一个类
- abs:计算绝对值
- pow:计算幂次
- random:给出随机数
- round:进行四舍五入
表达式
- 表达式是符合一定语法规则的运算符和操作数的序列
a
5.0 + a
(a-b)*c-4
i<30 && i%10!=0
- 表达式的类型和值
- 对表达式中操作数进行运算得到的结果成为表达式的值
- 表达式的值的数据类型即为表达式的类型
- 表达式的运算顺序
- 首先应按照运算符的优先级从高到低的顺序进行
- 优先级相同的运算符按照事先约定的结合方向进行
char类型相加时变为int类型相加
输入
- 用Scanner类可以用于读取用户在命令行输入的各种基本类型数据:
- 布尔类型 nextBoolean()
- 字节类型 nextByte()
- 短整型 nextShort()
- 整数类型 nextInt()
- 小数 nextFloat(),nextDouble()
- 字符串 next(),nextLine()
调试
- 可以在程序适当的地方插入输出来显示变量的呢
分支语句
- 分支语句实现程序流程控制的功能,即根据一定的条件有选择地执行或跳过特定的语句。
- Java分支语句分类
- if-else语句
-
- switch语句
-
-
- switch(表达式)中表达式的返回值必须是下述几种类型之一:int,byte,char,short;
- case子句中的值必须是常量,且所有case子句中的值应是不同的;
- default子句是任选的;
- break语句用来执行完一个case分支后使程序跳出switch语句块
-
循环体
1. while循环
- while循环的意思就是:当条件满足时,不断地重复循环体内的语句。
- 循环执行之前判断是否继续循环,所以有可能循环一次也没有被执行
- 条件成立是循环继续的条件
小套路:如果要模拟运行一个很大次数的循环,可以模拟较少的循环次数,然后作出推断。
2. do-while循环
- 在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后,再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环
do
{
<循环体语句>
}while(<循环条件>);
do-while循环和while循环很像,区别是在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
3. for循环
- for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整,比如加1或者减1
for ( i=0; i<5; i=i+1){
System.out.println(i);
}
for ( 初始化; 条件; 单步动作){
}
- 第一部分是一个初始化,可以定义一个新的变量:int count=10或者直接赋值:i=10。
- 第二个部分是循环维持的条件。这个条件是先验的,与while循环一样,进入循环之前,首先要检验条件是否满足,条件满足才执行循环;条件不满足就结束循环。
- 第三部分是步进,即每轮执行了循环体之后,必须执行的表达式。通常我们在这里改变循环变量,进行加或减的操作。
注:循环控制变量i只在循环里被使用了,在循环外面它没有任何用处。因此,我们可以把变量i的定义写到for语句里面去。
for中的每一个表达式都是可以省略的for(;条件;) == while(条件)
4. break&continue
- break:跳出循环
- continue:跳过循环这一轮剩下的语句进入下一轮
- 在循环前可以放一个标号来表示循环:
- label:
- 带标号的break和continue对那个循环起作用
数组
- 数组的定义
一维数组的声明方式:
type var[] 或type[] var (推荐使用这种方式);
例如:int a[ ];
int[ ] a1;
double b[ ];
Mydate[ ] c; //对象数组,暂不用了解
注:Java语言中声明数组时不能指定其长度(数组中元素的个数),例如:
int a[5]; //这是非法的
若要指定数组长度,应:a=new int[5];
2.数组的使用
定义并用运算符new为之分配空间后,才可以引用数组的中的每个元素
数组元素的引用方式:数组名[数组元素下标]
数组元素下标可以是整型变量或整型表达式。如a[3],b[i],c[6*i];
数组元素下标从0开始;长度为n的数组合法下标取值范围:0~n-1;
如int a[]=new int[3];可以引用的数组元素为a[0]、a[1]、a[2]
每个数组都有一个属性lenth指明它的长度,例如:a.length 指明数组a的长度(元素个数);
函数
- 函数的定义与调用
Java的函数必须定义在类的内部,成为类的成员。定义一个函数,要像这样写:
<返回类型> <方法名称>(<参数表>) {
<方法体>
}
返回类型是这个函数运行结束时要返回给调用者的数据的类型,函数可以返回基本数据类型、对象或者void。返回void表示这个函数不返回任何值。函数名称是一个Java名字,一样要遵循和变量一样的命名规则。参数表是0个或1个或多个参数定义,用逗号 ‘ , ‘ 分隔。
在这个阶段,我们要在所有的函数的返回类型前面加上关键字“static”。static表示这个函数属于这个类,而不属于这个类的任何对象,因此我们才可以不制造这个类的对象,而直接从main()函数中调用它。
当一个函数被调用时,程序就转到这个函数中去运行,函数体里的语句就一条一条地被调用。一旦函数运行结束,就又回到调用它的地方去继续运行。