目录
java基础(数据)
常量
常量是指程序执行过程中始终不变的量。
常量有字面常量和符号常量两种。
字面值常量
A:字符串常量:用""括起来的内容。"hello,world"
B:整数常量:1,200,300
C:小叔常量:12.5,3.1415926,13.14
D:字符常量:用''括起来的内容。'a','b','0'
E:布尔常量:只有true和false两个
F:空常量:null
符号常量:
final double PI=3.14;
double area = PI*r*r; //计算面积
double length = PI*r*2; //计算周长
final 含义是指最终的、最后的,代表不能再变了,PI的值在运行中不能被修改,只修改定义中的PI的值。
整数常量在Java中的表现形式
A:二进制,由0,1组成,并使用0b开头;
B:八进制,由0,1,2,3,4,5,6,7组成,使用0开头;
C:十进制,由0,1,2,3,4,5,6,7,8,9组成,默认是十进制
D:十六进制,由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成,使用0x开头
注意:字母不区分大小写
变量
变量则是根据执行的情况,可以改变值的量。
根据作用域范围的不同分为:成员变量、局部变量、方法参数变量、异常处理参数变量4种。
(1)变量:在程序运行过程中其值发生变化的量,其本质是内存中的一块内存区域,通过变量类型和变量名访问这一块区域
(2)定义格式:
A: 数据类型 变量名 = 初始化值
B: 数据类型 变量名;
变量名 = 初始化值;
(3)注意:作用区域:一对{}之间
(4)分类:
A:基本数据类型变量,4类8种
B:引用数据类型变量,类、接口、数组
1)基本数据类型
整数 占用内存空间(单位:bit)
byte 1 x8
short 2 x8
int 4 x8
long 8 x8
小数
float 4 x8
double 8 x8
字符
char 2 x8
布尔
boolean 1
注意事项:
A:整数默认int类型,小数默认double类型;
B:定义long类型数据时末尾建议加上L或者l,推荐L
定义float类型数据时末尾建议加上F或者f,推荐F
C:引用数据类型大小统一为4个字节,记录的是其引用对象的地址
D:小数float和double不适合用于不允许有舍入误差的金融计算领域;如果要进行不产生舍入误差的精确计算需要使用BigDecimal类。
面试题:Java中的字符可以存储一个汉字吗?为什么?
可以;char型变量是用来存储Unicode编码的字符,Unicode编码包含了汉字,所以char可以存储任何一个包含在Unicode编码中的汉字。另外Unicode编码占两个字节。
2)类型转换
a)自动数据类型提升从:小到大
byte,short,char-->int-->long-->float-->double
b)强制数据类型转换:从大到小
格式: 目标数据类型 变量名 = (目标数据类型)(被转换的数据)
注意事项:
a:boolean不参与类型转换;
b:一般不建议使用强制数据类型转换,因为可能损失精度;
c:int-->float,long-->float,long-->double可损失精度;
d:为byte,short,char等类型变量赋值,只要不超过其范围可以直接赋值;
f:byte,short,char之间不会进行转换,三者在进行计算时会先转换为int类型。
成员变量根据是否被static修饰分为 静态变量/类变量和实例变量
静态变量/类变量
被static修饰的成员变量称为静态变量或类变量
特点
类变量被类的所有实例共享,保存在类的公共存储空间中,一个类不管有多少实例,他们引用的都是这个公共存储空间里的值,即只有一个变量值
类变量是属于类的,不依赖于某个对象,因此除了可通过创建的对象来访问外,还可以直接通过类名来访问,并且这是建议使用的方法
注意
static只能修饰成员变量,而不能修饰局部变量、方法参数变量或异常处理参数变量
实例变量
没有被static修饰的成员变量称为实例变量
特点
每个实例都有自己的实例变量值,有多少个实例就有多少个实例变量值。
实例变量是属于实例的,因此只能通过实例来引用,而不能直接通过类型直接引用。
局部变量 在语句块内声明,作用域范围是从声明处直到该语句块的结束
方法参数变量 作用域范围是在整个方法中
异常处理参数变量 作用域范围是在异常处理语句块中
变量的引用
在同一个类中引用(可以引用变量)
成员变量——类变量 可以引用、没有限制。类变量不能加this关键字。
|______ 实例变量 只能从实例方法引用,不能从类方法中引用。实例变量可以加关键字this,用以区别局部变量等
局部变量 已经声明过的局部变量
方法参数变量 本方法的方法参数变量
异常处理参数变量 仅在异常处理块中
在类外部引用
具有访问许可的public、protected和(default)的类变量或实例变量
类变量:通过类名访问,不建议通过对象名访问
实例变量:只能通过对象名访问
不可以访问没有许可的protected和(default)成员变量以及private成员变量
不可访问其他类的局部变量和方法参数变量
使用变量时要注意的几个方面
局部变量的使用要遵循先声明后使用的原则
一个好的编程习惯是在声明一个变量的同时对它进行初始化。
按照命名规则为变量进行命名
与C/C++相比较,C/C++中存在全局变量,而在java中没有全局变量
成员变量与局部变量的区别
功能不同 成员变量体现的是类的属性,而局部变量只是临时保存变量的值。
声明的位置不同 成员变量是声明在方法的外面和类的内部,而局部变量是声明在方法的内部
作用域范围不同 成员变量的作用域范围是整个类,不论成员变量声明在方法的前面还是后面,而局部变量的作用域范围是从声明开始处直到语句块的结束
修饰符不同 成员变量的修饰符可用public、private、protected、default、static、final等等,而局部变量只有一个修饰符final,其他的修饰符都不可用
默认值不同 成员变量声明后被自动初始化(基本数据类型被初始化为默认值,引用数据类型被初始化为null),而局部变量声明后不被初始化。
数据类型
Java是强类型语言,在定义变量前需要声明数据类型,基本数据类型和引用数据类型。
Java的四类八种数据类型
(1)整数:
定义:没有小数部分的数字,负数是允许的。
种类:Java提供四种整数类型:
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,808L到9,223,372,036,854,775,807L
(2)浮点数:
定义:含有小数部分的数字。
分类:Java提供两种浮点数:
float 4个字节 约±3.40282347E+38F(6~7个有效的十进制数位) 绝对值:1.4E-45~3.4E38
double 8个字节 约±1.79769313486231570E+308(15个有效数位) 绝对值:4.9E-324~1.8E308
(3)字符类型:
定义:单引号用来表示char常量,是容纳单字符的一种基本数据类型,占1byte。
双引号则表示一个字串,他是Java的一个对象,并不是数据类型。
(4)布尔类型:
boolean类型只有两个值:false和true。 boolean 类型的数值不能直接转换成其它类型。占1个字节。
基本数据类型:byte、short、int、long、float、double、char、boolean
简单类型 | byte | short | int | long | float | double | char | boolean |
二进制位数 | 2 | 16 | 32 | 64 | 32 | 64 | 16 | 1 |
包装类 | Byte | Short | Integer | Long | Float | Double | Character | Boolean |
- 从低精度向高精度转换byte 、short、int、long、float、double,低精度到高精度会自动转换,而高精度到低精度则要类型强制转换。
- 数值计算中语法现象——“晋升”,即:byte、short和char(低于int的数据类型)进行算术运算后,结果会自动提升成int类型;
- 算数运算可以加入小括号"()"提高优先级,优先小括号内运算,再其他运算符运算;
- 两个char型运算时,自动转换为int型;当char与别的类型运算时,也会先自动转换为int型的,再做其它类型的自动转换; 算数运算前操作数变量必须赋值,反之,报语法错误。
数据类型转换
(1)不同的基本数据类型之间进行运算时需要进行类型转换。除布尔类型外,所有基本数据类型进行运算时都要考虑类型转换,主要运用在算术运算时和赋值远算时。
类型转换图
(2)自动类型转换:int转换double类型时可以直接转换,这种叫做自动类型转换,当然自动类型转换是需要满足特定条件的(将低级别的类型赋值给高级别类型时将进行自动类型转换):
①、目标类型能与源类型兼容,如 double 型兼容 int 型;
②、目标类型大于源类型,如 double 类型长度为 8 字节, int 类型为 4 字节,因此double 类型的变量里直接可以存放 int 类型的数据,但反过来就不可以了。
(3)强制类型转换:将高级别类型赋值给低级别类型时,必须进行强制类型转换。
①、强制类型转换容易造成数据丢失,所以在转换时需要多加注意
②、强制类型转换的语法是:(数据类型)数值;double avg1=75.8; int avg2=(int)avg1;
5. Scanner类方法(键盘输入):
(1)导入Scanner类:
Import java.util.*;
(2)创建Scanner对象:
Scanner input = new Scanner(System.in);
(3)获得键盘输入的数据:
Scanner的常用方法
方法 | 说明 |
String next() | 获得一个字符串 |
Int nextInt() | 获得一个整型数值 |
Double nextDouble() | 获得一个双精度类型数值 |
Boolean hasNext() | 判断是否有输入数据,如果有输入数据,则返回true;否则,返回false |
运算符
JAVA运算符可以分为以下几种:
算术运算符、赋值运算符、比较运算符、逻辑运算符、条件运算符。
Java算术运算符
算术运算符主要用于进行基本的算术运算,如加法、减法、乘法、除法等。
Java 中常用的算术运算符:
其中++ 和 -- 既可以出现在操作数的左边,也可以出现在右边,但结果是不同。
int b=++a;出现在左边,让a先执行自增,然后将值赋给b。
int b=a++;出现在右边,让a的值先赋给变量b,然后再执行自增。
自增和自减运算符只能用于操作变量,不能直接用于操作数值或常量!例如 5++ 、 8--等写法都是错误的!% 用来求余数,也称为“取模运算符”。
"++“和”--"用于数值变量之前,在赋值操作中,先对被”++“或”--“操作变量值先加1或者先减1,然后在进行其他的操作;
"++"和"--"用于数值变量之后,在赋值操作中,先用被”++“或”--“的操作变量值进行其他的操作,然后在对其值加1或者减1。
JAVA中的赋值运算符
赋值运算符是指为变量或常量指定数值的符号。如可以使用 “=” 将右边的表达式结果赋给左边的操作数。
JAVA中常用赋值运算符如下表所示:
JAVA中的比较运算符
比较运算符用于判断两个数据的大小,例如:大于、等于、不等于。比较的结果是一个布尔值( true 或 false )。
Java 中常用的比较运算符如下表所示:
注意:
①、 > 、 < 、 >= 、 <= 只支持左右两边操作数是数值类型
②、 == 、 != 两边的操作数既可以是数值类型,也可以是引用类型
java逻辑运算符
常用的逻辑运算符如下表所示:
我们可以从“投票选举”的角度理解逻辑运算符:
①、 与:要求所有人都投票同意,才能通过某议题
②、 或:只要求一个人投票同意就可以通过某议题
③、 非:某人原本投票同意,通过非运算符,可以使其投票无效
④、 异或:有且只能有一个人投票同意,才可以通过某议题
当使用逻辑运算符时,我们会遇到一种很有趣的“短路”现象。
譬如:( one > two ) && ( one < three ) 中,如果能确定左边 one > two 运行结果为 false , 则系统就认为已经没有必要执行右侧的 one < three 了。
同理,在( one > two ) || ( one < three ) 中,如果能确定左边表达式的运行结果为 true , 则系统也同样会认为已经没有必要再进行右侧的 one < three 的执行了!
位运算符
用于操作二进制位的运算符
操作符 | 描述 |
& | 如果相对应位都是1,则结果为1,否则为0 |
| | 如果相对应位都是0,则结果为0,否则为1 |
~ | 按位补运算符翻转操作数的每一位,即0变成1,1变成0。 |
^ | 如果相对应位值相同,则结果为0,否则为1 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 |
位运算操作的操作数和运算结果都是二进制整数,而逻辑运算相应操作的操作数和运算结果都是逻辑值boolean型。
条件运算符(三目运算符)
<表达式1> ?<表达式2> : <表达式3>
运算过程:如果布尔表达式的值为 true ,则返回表达式1 的值,否则返回表达式2 的值。
对象运算符instanceof
对象运算符instanceof用来测试一个指定对象是否是指定类(或它的子类)的实例,若是则返回true,否则返回false。
Java中运算符的优先级
Java 中常用的运算符的优先级如下表所示:
实际开发中,一般会使用小括号辅助进行优先级管理。
(1)运算: 对常量和变量进行的操作过程
(2)运算符: 对常量和变量进行操作的符号
(3)表达式: 由运算符把常量和变量连接起来的式子,另外,表达式是有结果的
(4)分类:
a: 算术运算符
1)+,-,*,/,++,--
2)整数相除结果是整数,想要得到整数,可以乘以1.0或者除以1.0
3)取于的结果的符号和前面的数一致
4)++,--;在数据之前表示数据先变化,再运算;在数据之前表示先运算,再数据变化;
b: 赋值运算符
1)=,+=,-=,/=,*=,/=,%=
2)+=,-=,/=,*=,/=,%=表示把左边和右边运算的结果赋值给左边,并强制转换为右边的类型
c: 关系运算符
1)==,!=,>,>=,<,<=
2)结果为boolean类型
d: 逻辑运算符
1)&,|,^,!,&&,||
2)单用法
& 有false则为false
| 有true则为true
^ 相同为false,不同为true
! 偶数个,值不变,奇数个,值相反
3)&&左边为false,右边不再执行;||左边为true,右边不再执行
4)优先级:逻辑非!--逻辑与&&--逻辑或||
f: 位运算符
1)&,|,^,~,>>,<<,>>>
2)做位运算,需要将数据转换为二进制
3)^的特点:针对同一个数据异或两次,值不变;
面试题:
1,下面表达式中那一个不能通过编译
(A):short s = 1;s = s + 1;
(B):short s = 1;s +=1;
答案:B,+=表示把左边和右边运算的结果赋值给左边,并强制转换为右边的类型
2,请使用最有效率的方式计算2乘以8的结果
答案:2<<3;
3,请交换变量的值:
int a = 10;
int b = 20;
答案:
a:方式一,引用第三方变量
int temp = a;
a = b;
b = temp;
b:方式二,采用^来实现
a = a ^ b;
b = a ^ b;
a = a ^ b;
g:三目运算符(条件运算符)
格式: 关系表达式?表达式1:表达式2;
计算流程:计算关系表达式的值,如果值为true,表达式1就是结果;如果值为false,表达式2就是结果;
练习题:
A:获取两个数中较大的值
a>b ? a : b;
B:获取三个数中较大的值
a>b ? (a>c ? a :c) : (b>c ? b : c);
C:判断两个数是否相等
a==b ? true : false;
流程控制语句
流程控制—选择结构与循环结构
一、JAVA条件语句之if语句
1. 单独的if语句
语法:if(条件){
条件成立时执行的代码
}
如果if成立时执行的语句只有一条,可以省略大括号,如果是多句不可省略,比如某些方法
if(条件),
return;
如果满足此条件跳出方法。
2. 条件语句之if...else
if(条件的布尔表达算式){
符合条件则执行的代码
}else{
不符合执行的代码
}
3. 多重if语句
if(条件1){
代码块1
}else if(条件2){
代码块2
}else{
代码3}
在条件 1 不满足的情况下,才会进行条件 2 的判断;当前面的条件均不成立时,才会
执行 else 块内的代码。
4. 嵌套if语句
if(条件1){
if(条件2){
代码块1
}else{
代码块2
}
}else{
代码块3
}
嵌套if语句,只有当外层 if 的条件成立时,才会判断内层 if 的条件。
二、JAVA条件语句之switch
当需要对选项进行等值判断时,使用 switch 语句更加简洁明了。
执行过程:当 switch 后表达式的值和 case 语句后的值相同时,从该位置开始向下执行,直到遇到 break 语句或者 switch 语句块结束;如果没有匹配的 case 语句则执行 default 块的代码。
注意:
1、 switch 后面小括号中表达式的值必须是整型或字符型
2、 case 后面的值可以是常量数值,如 1、2;也可以是一个常量表达式,如 2+2 ;但不能是变量或带有变量的表达式,如 a * 2
3、 case 匹配后,执行匹配块里的程序代码,如果没有遇见 break 会继续执行下一个的 case 块的内容,直到遇到 break 语句或者 switch 语句块结束。
4、 可以把功能相同的 case 语句合并起来。
5、 default 块可以出现在任意位置,也可以省略。
三、JAVA循环语句之while
Java 常用的 3 种循环: while 、 do...while 、 for
语法:while(判断条件){
循环操作
}
先判断后执行
执行过程:
< 1 > 判断 while 后面的条件是否成立( true / false )。
< 2 > 当条件成立时,执行循环内的操作代码 ,然后重复执行< 1 >、< 2 >, 直到循环条件不成立为止。
四、JAVA循环语句之do...while
语法:do{
循环操作
}while(判断条件);
先执行后判断,至少被执行一次
执行过程:
<1> 先执行一遍循环操作,然后判断循环条件是否成立。
<2> 如果条件成立,继续执行< 1 > 、< 2 >,直到循环条件不成立为止。
五、JAVA循环语句之for循环
语法:for(循环变量;循环条件;循环变量变化){
循环操作
}
执行过程:
<1> 执行循环变量初始化部分,设置循环的初始状态,此部分在整个循环中只执行一次
<2> 进行循环条件的判断,如果条件为 true ,则执行循环体内代码;如果为 false ,则直接退出循环
<3> 执行循环变量变化部分,改变循环变量的值,以便进行下一次条件判断
<4> 依次重新执行< 2 >、< 3 >、< 4 >,直到退出循环
特点:相比 while 和 do...while 语句结构更加简洁易读,三种可以相互替换。
注意:
1、 for 关键字后面括号中的三个表达式必须用 “;” 隔开,三个表达式都可以省略,但 “;” 不能省略。
a. 省略“循环变量初始化”,可以在 for 语句之前由赋值语句进行变量初始化操作。
b. 省略“循环条件”,可能会造成循环将一直执行下去,也就是我们常说的“死循环”现象。
注意:在编程过程中要避免“死循环”的出现,因此,对于上面的代码可以在循环体中使用 break 强制跳出循环。
c. 省略“循环变量变化”,可以在循环体中进行循环变量的变化。
2、 for 循环变量初始化和循环变量变化部分,可以是使用 “,” 同时初始化或改变多个循环变量的值,代码中,初始化变量部分同时对两个变量 i 和 j 赋初值,循环变量变化部分也同时对两个变量进行变化。
3、 循环条件部分可以使用逻辑运算符组合的表达式,表示复杂判断条件,但一定注意运算的优先级
六、JAVA循环跳转语句break、continue及return
1. break语句会跳出循环,执行后面的代码;用于do-while、while、for循环中,可跳出循环而执行循环后面的语句;break常用于switch结构和循环结构中。
2. continue的作用是跳过循环体中剩余的语句执行下一次循环,continue一般用于循环结构中。
3. return的作用是结束当前方法的执行并退出,返回至调用该方法的语句。
七、JAVA循环语句之多重循环
循环体中包含循环语句的结构称为多重循环。三种循环语句可以自身嵌套,也可以相互嵌套,最常见的就是二重循环。在二重循环中,外层循环每执行一次,内层循环要执行一圈。