Java学习笔记
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号位置之前的内容
-
- 寻找字符
- 从左边开始找
-
s.index0f( c )
-
得到c字符所在的位置,-1表示不存在
-
-
s.index0f(c , n)
-
从n号位置开始寻找c字符
-
-
s.index0f( t )
-
找到字符串t所在的位置
-
-
- 从右边开始找
- s.lastIndex0f( c )
- s.lastIndex0f( c , n )
- s.lastIndex0f( t )
- 从左边开始找
- 其他操作
- s.startsWith( t ) //判断 s 字符串是不是以 t 字符串开头
- s.endsWith( t ) //判断 s 字符串是不是以 t 字符串开头
- s.trim( t ) //删掉字符串两端的空格
- s.repalce(c1,c2) //把 s 字符串中所有的c1换成c2
- s.toLowerCase( ) //把 s 字符串中的所有大写字符变成小写字符
- s.toUpperCase( ) //把 s 字符串中的所有小写字符变成大写字符
- 访问String里的字符
- 所有的字符串都是不可变的,对它们的操作的结果都是制造新的字符串出来
- String s = "abc";
- System.out.println(s.toUpperCase());
- System.out.println(s);
-
- 加减完后就会变成整数类型,需要重新进行强制类型转换才能变成字符类型
-
-
-
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 |
-
- double d=3.14;Java浮点型常量默认为double型,如要声明一个常量为float,则需在数字后面加f或F,如:
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()函数中调用它。
当一个函数被调用时,程序就转到这个函数中去运行,函数体里的语句就一条一条地被调用。一旦函数运行结束,就又回到调用它的地方去继续运行。
-
- 什么是函数?
函数是一块代码,接受零个或多个参数,做一件事情,并返回零个或一个值
-
- 函数定义
-
- 调用函数
- 函数名(参数值)
- ()起到了表示函数调用的重要作用
- 即使没有参数也需要()
- 如果有参数,则需要给出正确的数量和顺序
- 这些值会被按照顺序依次用来初始化函数中的参数
- 函数名(参数值)
- 从函数中返回值
- return s;
- return停止函数的执行,并返回一个值
- return有两种形式
- 一种是不带着值的return
- 一种是带着值的return
- 需要这个函数返回值的,需要两个条件
- 函数的名字前面要有一个类型,用来表达函数返回的值的类型
- 在函数内恰当的地方有一个带着值的return
- 没有返回值的函数
- void 函数名(参数表)
- 不能使用带值的return
- 可以没有return
- 调用的时候不能做返回值的赋值
- void 函数名(参数表)
- 类型不匹配
- 当函数期望的参数类型比调用函数时给的值的类型宽的时候,编译器能悄悄替你把类型转换好
- return s;
- 调用函数
char——>int——>double
-
-
-
-
- 当函数期望的参数类型比调用函数时给的值的类型窄的时候,需要你写强制类型转换
- 当函数期望值的参数类型与调用函数时给的值的类型之间无法转换的时候不可以使用!
- 传值
- 每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
- 对于函数参数表中的参数,叫做“形式参数”,调用函数时给的值,叫做“实际参数”。
-
-
- 本地变量
- 函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量
- 定义在函数内部的变量就是本地变量
- 参数也是本地变量
- 规则:
- 本地变量是定义在块内的
- 它可以是定义在函数的块内
- 也可以定义在语句的块内
- 甚至可以随便拉一对大括号来定义变量
- 程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了
- 块外面定义的变量在里面仍然有效
- 不能在一个块内定义同名的变量,也不能定义块外面定义过的变量
- 本地变量不会被默认初始化
- 参数在进入函数的时候被初始化了
- 本地变量是定义在块内的
- 变量的生存
- 生存期:什么时候这个变量开始出现了,到什么时候它消亡了
- 作期和作用域
- 用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)
- 对于本地变量,这两个问题的答案时统一的:大括号内——块
-