Java学习
Java保留关键字
abstract | const | finally | Int | public | this |
---|---|---|---|---|---|
boolean | continue | float | interface | return | throw |
break | default | for | long | short | throws |
byte | do | goto | native | static | transient |
case | double | if | new | strictfp | try |
catch | else | implements | package | super | void |
char | extends | import | private | switch | volatile |
class | final | instanceof | protected | synchronized | while |
数据类型
基本数据类型(primitive type)
数值类型
整数类型
- byte 占1个字节 范围:-128~127
- short 占2个字节 范围:-32,768~32,767
- int 占4个字节 范围:–2,147,483,648 ~ 2,147,483,647
- long 占8个字节 范围:–9,223,372,036,854,775,808 ~9,223,372,036,854,775,807
整数拓展:二进制0b 八进制0 十六进制0x
浮点类型
- float 占4个字节 范围:3.4E–038~3.4E+038
- double 占8个字节 范围:1.7E–308~1.7E+308
字符类型
- char 占2个字节 范围:0~65,536
bolean类型
占一位,其值只有true和false两种
引用数据类型(reference type)
- 类
- 接口
- 数组
类型转换
低—————>高
byte,short,char->int->long->float->double
强制转换(高到低):变量名前面加(你要的类型)
自动转换(低到高):直接 高 i = 低 i
注意点
- 不能对布尔值进行转换
- 不能把对象类型转换为不相干类型
- 在把高容量转换带低容量的时候,强制转换
- 转换的时候可能会存在内存溢出,或者精度问题
eg: int a; int b; long c = a*b;(先运行再转换)
应该是:int a; int b; long c = a*((long)b);
变量
在Java中,所有的变量必须先声明再使用。基本的变量声明方法如下:
type(类型) identifier(名称) = value,[identifier [=value] …] ;
变量的命名规范
- 所以变量、方法、类名:见鸣知意
- 类成员变量:首字母小写和驼峰原则:除了第一个单词,后面的单词首字母大写 lastName
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线 MAX_VALUE
- 类名:首字母大写和驼峰原则 GoodMan
- 方法名:首字母小写和驼峰原则 runWay()
运算符
算术运算符
操作符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
++ | 自增(++A,先自增再进行表达式运算;A++,表达式运算完后再自增) |
– | 自减(同上) |
关系运算符
运算符 | 描述 |
---|---|
==(相等) | 检查左右两个操作数是否相等,相等为真,反之为假 |
!=(不相等) | 检查左右两个操作数是否相等,不相等为真,反之为假 |
>(大于) | 检查左操作数是否大于右操作数,成立为真,反之为假 |
<(小于) | 检查左操作数是否小于右操作数,成立为真,反之为假 |
>=(大于等于) | 检查左操作数是否大于等于右操作数,成立为真,反之为假 |
<=(小于等于) | 检查左操作数是否小于等于右操作数,成立为真,反之为假 |
位运算符(得转化二进制)
操作符 | 描述 |
---|---|
&(按位与) | 对应位全是1才为1,否则为0 |
|(按位或) | 全0才0,否则1 |
^(按位异或) | 相同为0,否则为1 |
~(按位非) | 取反 |
<<(按位左移运算符) | 左操作数按位左移右操作数指定的位数。 |
>>(按位右移运算符) | 左操作数按位右移右操作数指定的位数。 |
<<<(按位右移补零操作符) | 左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 |
逻辑运算符(操作符是布尔值或布尔变量)
操作符 | 描述 |
---|---|
&&(逻辑与运算符) | 当且仅当两个操作数都为真,条件才为真。 |
||(逻辑或操作符) | 如果任何两个操作数任何一个为真,条件为真。 |
!(逻辑非运算符) | 用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 |
赋值运算符
操作符 | 描述 |
---|---|
=(赋值) | 将右操作数的值赋给左侧操作数 |
+=(加和赋值操作符) | 把左操作数和右操作数相加赋值给左操作数 |
-=(减和赋值操作符) | 把左操作数和右操作数相减赋值给左操作数 |
*=(乘和赋值操作符) | 把左操作数和右操作数相乘赋值给左操作数 |
/=(除和赋值操作符) | 把左操作数和右操作数相除赋值给左操作数 |
(%)=(取模和赋值操作符) | 把左操作数和右操作数取模后赋值给左操作数 |
<<=(左移位赋值运算符) | 左移位和赋值的结合 |
>>=(右移位赋值运算符) | 右移位和赋值的结合 |
&=(按位与赋值运算符) | 按位与和赋值的结合 |
^=(按位异或赋值操作符) | 按位异或和赋值的结合 |
!=(按位或赋值操作符) | 按位或和赋值的结合 |
条件运算符(三元运算符)
expression是一个布尔表达式,为真,(value if true)被求值;为假,(value if false)被求值。(主要,两个表达式不能是void类型,且类型必须相同)
variable x = (expression) ? value if true : value if false
Scanner对象
我们可以通过Scanner类来获取用户的输入
基本语法
Scanner scanner = new Scanner(System.in);
- 通过Scanner类的next()和nextLine()方法获取用户的输入字符串,一般用hasnext()与hasNextLine()判断是否还有输入的数据
- IO流的类一般用完要主动关闭,不然会一直占用资源:scanner.close();
- next();
- 一定要读取有效字符后才可以结束输入
2. 对输入有效字符前的空白,会自动去掉
3. 在输入有效字符后的空白会被当成分隔符或结束符
4. next()不能得到带有空格的字符串
- 一定要读取有效字符后才可以结束输入
- nextLine();
- 以Enter为结束符,即会返回回车键前的所有字符
2. 可以获得空白
- 以Enter为结束符,即会返回回车键前的所有字符
流程的控制
if语句
if(布尔表达式) {
//如果布尔表达式为true将执行的语句
}
if…else语句
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}
if…else if…else语句
if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else {
//如果以上布尔表达式都不为true执行代码
}
嵌套的if…else语句
if(布尔表达式 1){
如果布尔表达式 1的值为true执行代码
if(布尔表达式 2){
如果布尔表达式 2的值为true执行代码
}
}
switch case语句
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
while循环
while( 布尔表达式 ) {
//循环内容
}
只要布尔表达式为 true,循环就会一直执行下去。
do…while循环
do {
//代码语句
} while(布尔表达式);
**注意:**布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。
for循环
for(初始化; 布尔表达式; 更新) {
//代码语句
}
关于 for 循环有以下几点说明:
- 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
- 然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
- 执行一次循环后,更新循环控制变量。
- 再次检测布尔表达式。循环执行上面的过程。
break关键字
break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
break 跳出最里层的循环,并且继续执行该循环下面的语句。
continue关键字
continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。
方法
方法的定义
修饰符 返回值类型 方法名(参数类型 参数名){
方法体
return 返回值;
}
-
修饰符:(可选的),告诉编译器如何调用该方法,定义了该方法的访问类型。
-
返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType是关键字void。
-
方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
-
参数类型:参数像是一个占位符,当方法被调用时,这个值被称为实参或变量,参数列表是指方法的参数类型、顺序和参数的个数,参数是可选的,方法可以不包含任何参数。
- 形式参数:在方法被调用时用于接收外界输入的数据。
2. 实参:调用方法时实际传给方法的数据。
- 形式参数:在方法被调用时用于接收外界输入的数据。
-
方法体:方法体包含具体的语句,定义该方法的功能。
方法的调用
- 调用方法:对象名。方法名(实参列表)
- 当方法返回一个值的时候,方法调用通常被当作一个值
- 如果方法返回值是void,方法调用一定是一条语句
方法的重载
重载规则
- 方法名称必须相同
- 参数列表必须不同(个数不同,或类型不同,参数排列顺序不同等)
- 方法的返回值可以相同也可以不相同
- 仅仅返回类型不同不足以成为方法的重载
可变参数
- 在方法声明中,在指定参数类型后加一个省略号(…)
- 一个方法中只能指定一个可变参数,他必须是方法的最后一个参数,任何普通的参数必须在它前面声明
数组
声明数组:
dataType(数据类型) [ ] arrayRefVar(数组名);
或 dataType arrayRefVar[ ];
创建数组:
arrayRefVar = new dataType[arraySize];
声明创建:
dataType [ ] arrayRefVar = new dataType[arraySize];
- 长度确定,一旦被创建,大小不可改变
- 其元素得是同一类型,不许出现混合类型
- 数组元素可以是任何数据类型,包括基本类型和引用类型
- 数组变量属引用类型,数组也可以看成对象,数组中的每个元素相当于该对象的成员变量
数组下标越界:ArrayIndexOutofBounds