第一节 数据类型转换
java程序中要求参与的计算数据,必须要保证数据类型的一致性,如果数据类型不一样将发生类型的转换。
1.1自动转换(是Java自动执行)
- 将取值范围小的自动提升为取值范围大的。
public static void main(String[] args){
byte b = 2;
int i = 1;
//byte x = b + i;
//int类型和byte类型运算,结果是int类型
int j = b+i;
System.out.println(j)
}
-
转换原理图解
- byte类型内存占有1个字节,int类型内存占4个字节,byte类型在和int类型运算时,自动补充3个字节,因此计算结果还是int类型的。
- 同样道理,当一个int类型变量和一个double变量运算时,int类型会自动提升为double类型进行运算。
public static void main(String[] args){
int i = 1;
double d = 3.6;
double e = i +d;
System.out.println(e);
}
-
转换规则
范围小的类型向范围大的类型提升,byte、short、char运算时会自动提升为int类型
byte、short、char-->int-->float-->double
1.2强制转换(是需要我们手动的)
-
强制类型转换:就是将范围大的类型自动转换为取值范围小的类型。
-
转换格式
数据类型 变量名 = (数据类型)被转数据值;
将1.5赋值给int类型,代码修改为:
//double类型转换为int类型,直接去掉小数点 int i = (int)1.5;
同样,当short类型与1相加的时候
public static void main(String[] args){
//short类型变量,内存中2个字节
short s = 1;
/*
出现编译失败
s和1做运算,1是int类型,s会被提升为int类型
s + 1后结果是int类型,将结果再赋值给s时会发生错误,因为s是short类型
short内存2个字节,int类型4个字节,必须将int强制转成short才能完成。
*/
s = s +1;//编译失败
s = (short)(s+1);//编译成功
}
强烈注意
-
浮点数转成整数,直接取消小数点,可能造成数据损失精度。
-
int强制转成short砍掉两个字节,可能造成数据丢失。
//定义s为short范围内最大值 short s=32767; s = (short)(s+10);
1.3ASCLL编码表
public static void main(String[] args){
//字符类型变
char c = 'a';
int i = 1;
//字符型类型和int类型计算
System.out.println(c+i);//输出结果98
}
编码变:就是讲人类的文字和一个十进制数进行对应起来组成一张表格。
人们规定:
字符 | 数值 |
---|---|
0 | 48 |
9 | 57 |
A | 65 |
Z | 90 |
a | 97 |
z | 122 |
第二节 运算符
2.1算术运算符
算数运算符包括: | |
---|---|
+ | 加法运算,字符串连接运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
% | 取模运算,两个数字相除取余数 |
++、-- | 自增自减运算 |
-
++运算,变量自己增长1.--运算,变量自己减少1,用法一致。(以加法为例)
-
独立运算:
- 变量在运算时,前++和后++没有区别。
-
混合运算:
-
和其他变量放在一起。前++和后++就不同了。
-
变量前++:变量a自己加1,将加1后的结果赋值给b。
public static void mian(String[] args){ int a = 1; int b = ++a; System.out.println(a);//结果是2 System.out.println(b);//结果为2 }
-
变量后++:变量a先把自己的值1,赋值给变量b,此时变量b的值就是1,变量a的值再自增加1,a的值就是2.
public static void mian(String[] args){ int a = 1; int b = a++; System.out.println(a);//结果是2 System.out.println(b);//结果是1 }
-
-
-
+符号在字符串中的操作:
-
+符号在遇到字符串的时候,表示连接、拼接的含义。
-
"a"+"b"的结果就是ab,连接的含义
public static void mian(String[] args){ System.out.prinntln("6+9="+6+9);//输出的6+9=69 }
-
2.2赋值运算符
赋值运算符包括: | |
---|---|
= | 等于号 |
+= | 加等于 |
-= | 减等于 |
*= | 成等于 |
/= | 除等于 |
%= | 取模等 |
-
赋值运算符,就是讲符号右边的值,赋值给左边的变量。
public static void main(String[] args){ int i = 6; i+=6;//计算方式i = i+6; System.out.println(i);结果是12 }
2.3比较运算符
比较运算符包括: | |
---|---|
== | 比较符号两边数据是否相等,相等结果为true。 |
< | 比较符号左边数据是否小于右边数据,如果小于为true。 |
> | 比较符号左边数据是否大于右边数据,如果大于为true。 |
<= | 比较符号左边数据是否小于等于右边数据,如果小于等于为true。 |
>= | 比较符号左边数据是否大于等于右边数据,如果大于等于为true。 |
!= | 比较符号左边数据是否不等于于右边数据,如果不等于于为true。 |
-
比较运算符是两个数据之间进行比较运算,运算结果都是布尔值true或者false。
public static void main(String[] args){ System.out.println(1==1);//结果为true System.out.println(1<2);//结果为true System.out.println(6>9);//结果为false System.out.println(2>=1);//结果为true System.out.println(3<=1);//结果为false System.out.println(3!=1);//结果为true }
2.4逻辑运算符
- 逻辑运算符使用来连接两个布尔型的结果的运算符,运算结果是布尔值true或者false
逻辑运算符包括: | |
---|---|
& 与 | 无论左边是否为true或者false都判断右边。 false&true 结果为false |
| 或 | 无论左边是否为true或者false都判断右边。 false&true 结果为true |
^ 非 | 相同为真,不同为假。 |
&& 短路与 | 1.两边都是true,结果为true 2.一边为false,结果为false 短路特点:符号左边为false,右边不再算 |
|| 短路或 | 1.两个边都为false,结果为false。 2.一边为true,结果为true 短路特点:左边为true,右边不在算 |
! 取反 | 1.!true的结果为false。 2.!false的结果为true |
- 位运算符:&、|、^、~、<<、>>、>>>(0,1)
- &:有0则0
- |:有1则1
- ^:相同为0,不同为1(涉及二进制)
- ~:按位取反(取反码)
- <<:左移位相当于乘以2^移位数(除去最高位,右边补0)
- >>:右移位相当于除以2^移位数(除去后两位,最高位是0补0,是1补1)
- >>>:无符号右移位(除去后两位,左边补0)
public static void main(String[] args){
System.out.println(true && true);//true
System.out.println(true && false);//false
System.out.println(false && true);//false ,右边不计算
System.out.println(false || false);//false
System.out.println(false || true);//true
System.out.println(true&&false);//true,右边不计算
System.out.println(!true);//false
}
}
2.5三元运算符
-
格式:数据类型 变量名 = 布尔类型表达式?结果1:结果2
-
计算方式:
- 布尔类型表达式的结果为true,三元运算符整体结果为结果1,赋值给变量。
- 布尔类型表达式结果为false,三元运算符整体的结果为结果2,赋值给变量。
public static void main(String[] args){ int i = (6==9?66:99); System.out,println(i);//结果为99 int j = (2<=9?100:200); System.out.println(j);//结果为100 }
第三章 方法的入门
3.1概述
- 方法:就是将一个功能抽取出来,把代码单独定定义到一个大括号内,形成一个单独的功能。当我们需要这个功能的时候,就可以去调用,这样既实现了代码的复用性,也解决了代码冗余的现象。
3.2方法的定义
方法写之前首先考虑三要素:
- 返回值类型
- 方法名称
- 参数列表
-
定义格式:
修饰符 返回值类型 方法名(参数列表){ 方法体 return ; }
-
定义格式解释:
- 修饰符:目前固定的写法 public static
- 返回值类型:也就是方法最终产生的数据结果是什么类型。
- 方法名称:方法的名字,规则和变量一样,小驼峰。
- 参数类型:进入方法的数据是什么类型。
- 参数名称:进入方法的数据对应的变量名称
- PS:如果参数有多个,使用逗号进行分隔。
- 方法体:方法需要做的事,若干行代码
- return:两个作用。第一停止当前方法,第二将后面的返回值还给调用处
- 返回值:也就是方法执行后最终产生的数据结果
-
注意:return后面的"返回值”,必须和方法名称前面的“返回值类型”,保持对应。
-
举例:
public static void methodName(){ System.out.println("这是一个方法"); }
3.3方法的三种调用格式
方法在定义完毕后,方法不会自己运行,必须被调用才能执行,我们可以在主方法main中来调用我们自己定义好的方法。在主方法中直接写要调用的方法名称就可以调用了。
- 单独调用:方法名称(参数);
- 打印调用:System.out.println(方法名称(参数));
- 赋值调用:数据类型 变量名称 = 方法名称(参数);
public static void mian(String[] args){
//单独调用
sum(1,2);
//打印调用
System.out.println(sum(3,6));
//赋值调用
int number = sum(19,3);
System.out.println(number);
}
//方法
public void int sum(int a,int b){
int result = a+b;
return result;
}
3.4注意事项
- 方法定义的 注意事项:
- 方法必须定义在一个类中,方法外
- 方法不能定义在另一个方法的里面。
3.5扩展知识点
-
+=符号扩展
下面程序有问题吗?
public static void main(String[] args){ short s = 1; s +=1; System.out.println(s); }
分析:s +=1;逻辑上看作是s = s+1;计算的结果被提升为int类型,在向short类型赋值时发生错误,因为不能将取值范围大的类型赋值到取值范围小的类型。但是,s=s+1进行两次运算,+=是一个运算符,只运算一次,并带有强制转换的特点,也就是说s+=1;就是s=(short)(s+1);因此程序没有问题编译通过,运行结果为2.
-
常量和变量的运算
public static void main(String[] args){ byte b1 = 1; byte b2 = 2; byte b3 = 1+2; byte b4 = b3+b2; System.out.println(b3); System.out.println(b4); }
-
分析:b3 = 1+2,1和2是常量,为固定不变的数据,在编译时(编译器javac),已经确定了1+2结果并没有超过byte类型的取值范围,可以赋值给变量b3,因此b3=1+2是正确的。
反之,b4 = b2+b3,b2和b3是变量,变量的值是可能发生变化的,在编译的时候,javac不确定b2+b3的结果是什么,因此会将结果以int类型处理,所以int类型不能赋值给byte类型,因此编译失败。(发生了自动转换,在计算的时候byte和short会自动转换为int类型)