这两天真是雨水不断,接二连三的下了好几场雨,其实我是个喜欢雨天的人,记得上学的时候,遇到没有课又正好是下雨的天气,我就趴在宿舍的床上看雨,听雨水哗哗的声音,那时候真是少年不懂愁滋味啊呵呵。现在下雨不会再去听雨了,但是淋雨的时候多了很多哈哈。
还是回到正题,昨天给大家分享了java学习的一些基础知识,今天把剩下的完成了。第一节到第五节的内容大家需要看的话可以再复习一下 [# 干货奉献,关于java的最基础的知识(1-5)]。大家学习java可以去网上找一些免费的视频教程,如果不知道看什么好,可以直接打开最下面的链接,这个视频教程也是口口相传的好作品,大家看了之后自己就能感觉到# Java300集零基础适合初学者。
6、表达式
7、数据类型的转换
在8大基本数据类型中,boolean不属于数值类型,所以不参与转换,其他类型的转换规则如下图。一般的,byte、short、char三种类型相互之间一般不参与转换操作,按照转换方式,有两种(注意:boolean类型不参与类型转换):
- 自动类型转换:范围小的数据类型直接转换成范围大的数据类型,小->大
- 强制类型转换:范围大的数据类型强制转换成范围小的数据类型,大->小
7.1、自动类型转换与提升
7.1.1、自动类型转换
自动类型转换,也称为“隐式类型转换,就是把范围小的数据类型直接转换成范围大的数据类型
转换规则:byte、short、char—>int—>long—>float—>double
注意事项:byte、short、char相互之间不转换,他们参与运算首先转换为int类型
语法格式:范围大的数据类型 变量 = 范围小的数据类型值
public class TypeConvertDemo1{
public static void main(String[] args) {
//把int类型变量转为long类型
long longNumber = 17;//整数默认为int类型
//把long类型转换为float类型
float f1 = longNumber;
//把float类型转换为double类型
double d = f1;
//定义两个int类型的变量
int a1 = 2;
int b1 = 3;
int c1 = a1 + b1;
//定义一个byte类型,一个int类型
byte b2 = 2;
int c2 = 3;
System.out.println(b2 + c2);
//byte、short、char类型参与运算时把自己提升为int类型
//byte d1 = b2 + c2;//编译报错
int d3 = b2 + c2;//编译通过
}
}
\
7.1.2、自动类型提升
当一个算术表达式中,包含多个基本数据类型的常量或变量(boolean除外)时,整个算术表达式的结果类型将出现自动提升,其规则是:
- 所有的byte、short、char类型被自动提升到int类型,再参与运算
- 整个表达式的最终结果类型,被提升到表达式中类型最高的类型
System.out.println('a' + 1);//98
byte b = 22;
b = b + 11;//编译出错,此时结果类型应该是int
double d1 = 123 + 1.1F + 3.14 + 99L ;
结论:算数表达式结果的类型就是其中范围最大的数据类型。
7.2、强制类型转换
强制类型转换,也称为“显式类型转换”,就是把范围大的数据类型强制转换成范围小的数据类
# 语法格式:
# 范围小的数据类型 变量 = (范围小的数据类型)范围大的数据类型值;
注意:一般情况下不建议使用强转,因为强转有可能损失精度
public class TypeConvertDemo2{
public static void main(String[] args) {
int a = 2;
byte b = 3;
//自动类型转换
int c = a + b;
//强制类型转换
byte d = (byte) (a + b);
//把double转换为int类型
int i = (int)3.14;
System.out.println(i);//3
}
}
8、运算符
对常量和变量进行操作的符号称为运算符
常见的运算符分为:算术运算符、赋值运算符、比较运算符、逻辑运算符、三元运算符
8.1、算数运算符
8.2、自增和自减
自增:++,递增操作符,使变量值增加1,有前置和后置之分,只能操作变量。
自减:-- ,递减操作符,使变量值减去1,有前置和后置之分,只能操作变量。
以++为例:
a++和++a结果都是让a的值自增1,如果只是需要自增的话,使用哪一种都可以
但是他们俩有唯一的区别:
- 前置(++a): 表示对a加1之后的结果进行运算,先加后用
- 后置(a++):表示对a变量加1之前的值(原始值)进行运算,先用后加
public class ArithmeticOperatorsDemo2{
public static void main(String[] args) {
int a1 = 5;
int b1 = ++ a1;
System.out.println("a1=" + a1 + ",b1=" + b1);//a1=6,b1=6
int a2 = 5;
int b2 = a2 ++;
System.out.println("a2=" + a2 + ",b2=" + b2);//a2=6,b2=5
}
}
比较底层的解释
++a表示取a的地址,增加它的内容,然后把值放在寄存器中
a++表示取a的地址,把它的值装入寄存器,然后增加内存中的a的值
8.3、赋值运算符
8.4、三元运算符
三元运算符,表示有三个元素参与的表达式,所以又称为三目运算符,其语义表示if-else(如果什么情况就做什么,否则做什么)
语法格式:数据类型 变量 = boolean表达式 ? 结果A :结果B
表达的意思,boolean表达式结果:\
- 为true,则三元运算符的结果是结果A
- 为false,则三元运算符的结果是结果B
注意:\
- 三元运算符必须定义变量接受运算的结果,否则报错
- 三元运算符结果的类型由结果A和结果B来决定的,结果A和结果B的类型是相同的
8.5、逻辑运算符
逻辑运算符用于连接两个boolean表达式,结果也是boolean类型的
规律:
- 非:取反,!true则false,!false则true
- 与:有false则false
- 或:有true则true
- 异或:^ 相同则false,不同则true
8.5.1、&和&&( | 和 | |)的区别
& :&左边表达式无论真假,&右边表达式都进行运算
&& :如果&&左边表达式为真,&&右边表达式参与运算,否则&&右边表达式不参与运算,故称短路与
| 和 || 的区别同理,||,左边为真,右边不参与运算
public class LogicalOperatorDemo2 {
public static void main(String[] args) {
System.out.println(false & 1 / 0 == 1);//报错,说明右边执行了
System.out.println(false && 1 / 0 == 1);//不报错,说明右边没有执行
System.out.println(true | 1 / 0 == 1);//报错,说明右边执行了
System.out.println(true | 1 / 0 == 1);//不报错,说明右边没有执行
}
}
9、数组
9.1、JVM初探究
- 程序计数器:当前线程所执行的字节码的行号的指示器
本地方法栈:为虚拟机使用的native方法服务 - 方法区:线程共享的内存区域,存储已经被虚拟机加载的类的信息、常量、静态变量,这个区域的内存回收的目标主要是针对常量池的回收和对类型的卸载
- Java虚拟机栈:简称栈,每个方法被执行的同时会创建一个栈帧用于存储该方法的局部变量、操作栈、动态链接、方法出口等信息
- Java堆:被所有线程共享的一块内存区域,在虚拟机创建的时候启动,所有对象的实例(new出来的对象)以及数组都要在堆上分配内存空间,所以堆占的内存空间远比栈大
- 每当调用一个方法时,创建一个栈帧,存放了当前方法的局部变量,当方法调用完毕时,该方法的栈帧就被销毁了
每次new一个对象的时候,就表示在内存中开辟了一块新的存储空间
10、方法
10.1、方法的定义
方法:为了完成某一特定功能(如:求和,统计数量等)的代码块
语法格式:
修饰符] 返回值类型 方法名称(参数类型 参数名1,参数类型 参数名2,…)
{
方法体;
[return 返回值;]
}
格式分析:
- 修饰符:public、static等,static修饰的方法直接使用类名调用即可,用static修饰的方法都属于类的
- 返回值类型:限定返回值的类型,方法在完成一个功能后,是否需要给调用者返回一个结果?
- 如果需要给调用者返回结果,就写上返回数据的类型
- 如果不需要给调用者返回结果,就用关键字
void,表示没有返回结果
-
方法名称:用于调用方法,遵循标识符规范,首字母小写,采用驼峰命名法,见名知意
-
形式参数:方法中圆括号中的变量,可以有多个形式参数
-
方法体:编写如何完成该功能的代码
-
return关键字的作用
- 把返回值给方法的调用者
- 结束该方法,在return后不可以再学任何语句
- 当方法体中没有return时,方法的返回值类型必须为void
-
实际参数:在调用某一个具体方法1时,实际传递的参数值
-
如果一个需要返回值,那么一定要保证在任何条件下都必须得有返回值
注意事项
- 方法必须定义到类中,在java中最小的程序单元是类
- 一个类中可以定义多个方法
- 方法和方法之间是平行的,不能在一个方法中定义另一个方法(相当于不可以在一个房子里面建房子)
- 方法定义没有先后顺序
10.2、方法的调用
如果方法有static修饰,可以直接用方法所在的类的类名调用,如果没有static修饰,那么必须使用实例化对象来调用\
10.3、方法的重载
参数列表:参数的类型+参数的个数+参数的顺序
方法签名:方法名称+方法的参数列表
在同一个类中,方法签名是唯一的,否则编译报错
方法的重载:在同一个类中,允许某方法存在一个或者多个同名的方法,但是必须参数列表不同
10.3.1、如何是否是方法重载
方法重载判断的原则:两同一不同
两同:在同一个类中,方法名是相同的
一不同:方法的参数列表不同(参数类型、参数个数、参数顺序),只要参数类型、参数个数、参数顺序其中有一个不同,都成为参数列表不同
方法的重载和返回值类型无关,只是一般都要求返回值类型相同
10.3.2、方法重载的作用
解决了同一功能的方法由于参数不同所造成的方法名称不同而需要重复命名的问题