一.数据类型转换
(1)隐式数据类型转换
特点:
1.自动完成
2.数据范围由小到大进行转换
long num1 = 100;
//左边为long数据类型,右边为int数据类型,范围从小变为大,符合从小到大的规则
double num2 = 2.5F; //float->double
float num3 = 30L; //long->float
(2)显式数据类型转换
特点:
1.可以非由小到大
2.可能会产生精度损失,数据溢出等问题
3.格式:范围小的类型 变量名 = (范围小的类型) 原范围大数据
int num2 = (int)3.99F; //num2只会存储3而不是4,因为这并非是四舍五入,产生了数据精度损失
(3)注意事项
1.byte/short/char这三种类型均可发生数学运算,如“+”;
2.byte/short/char这三种类型在运算的时候均会被提升为int类型,然后再计算
char zifu1 = 'A';
System.out.println(zifu1+1); //输出66
//大写字母A在计算机中是由一个数字“65”所存储,一旦进行数学运算,那么字符会先转换为一个数字再进行加法运算
二.编译器的优化
对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么java编译器就会自动隐含地加上(byte)(short)(char),即一中所说的数据转换。
1.如果没有超过左侧范围,则编译器补上强制。
2.如果右侧超过左侧范围,则编译器直接报错。
3.在给变量进行赋值的时候,若右侧表达式当中全是常量,没有任何变量,那么编译器将会直接将若干个常量表达式计算得到结果。
byte num1 = /*(byte)*/ 30; //右侧没有超过左侧地范围
char zifu = /*(char)*/ 65;
short num1 = 10; //未超出范围
short a = 5;
short b = 8;
//short + short ->int + int ->int
//short result = a + b; 为错误写法,左侧需要为int类型
short result = 5 + 8;
//编译之后,得到的.class字节码文件当中相当于直接就是short result = 13;
//short result = 5 + 8 + a; 会报错
三.方法调用
1.单独调用,方法名称(参数);
2.打印调用,System.out.println(方法名称(参数));
3.赋值调用
//单独调用
sum(10,20);
//打印调用
System.out.println(sum(10,20));
//赋值调用
int number = sum(10,20);
四.方法注意事项
(1)方法定义的注意事项
1.方法应当定义在类当中,但是不能在方法中定义方法,不能嵌套;
2.方法定义的前后顺序无所谓;
3.方法定义之后不会执行,如果要执行,一定要进行调用;
4.return后面的返回值类型必须和方法的返回值类型对应起来;
5.一个方法中可以有多条return语句,但必须保证同时只有一个能执行到;
public static void test(){
return; //可以写return,不返回值,只是象征着方法的结束,可省略不写
}
(2)方法重载注意事项
1.需要参数个数或者类型不同
2.需要参数多类型顺序不同
3.重载与参数名称无关,与方法的返回值类型无关,与有无public、static等修饰符无关
(快捷键shift+F6可快捷批量修改变量名称)
五.数组
(1)数组的特点
1.数组是一种引用数据类型
2.数组当中的多个数据,类型必须统一
3.数组的长度在程序运行期间不可改变,通过length可获取长度
(2)数组的初始化
1.动态初始化(指定长度)
格式:数据类型[] 数组名称 = new 数据类型[数组长度];
左侧中括号代表数组;
int[] arrayA = new int[300];
double[] arrayB = new double[300];
2.静态初始化(指定内容)
标准格式:数据类型[] 数组名称 = new 数据类型[]{数据1,数据2,数据3,…};
int[] arrayA = new int[]{5,15,25};
String arrayB = new String[]{"Hello","World","JAVA"};
省略格式:数据类型[] 数组名称 = {数据1,数据2,数据3,…};
int[] arrayA = {5,15,25};
注意事项:
1.虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容可以自动推算出长度。
2.静态初始化标准格式可以拆分成两个步骤;
int[] arrayB;
arrayB = new int[]{5,15,25};
3.动态初始化也可以拆分成两个步骤;
int[] arrayA;
arrayA = new int[300];
4.静态初始化一旦使用省略模式就不能拆分成两个步骤;
(3)数组元素获取
1.直接打印数组名称,得到的是数组对应的内存地址哈希值。
int[] arrayA = new int[]{1,2,3,4,5};
System.out.println(arrayA); //[I@1b6d3586
//中括号[代表为数组类型,I代表为数据类型为int,1b6d3586为16进制的内存地址值
2.访问数组元素格式,数据名称[索引值]。
3.使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值.若为整数类型,为0;浮点类型为0.0;字符类型为’\u0000’(u为unicode).
4.静态初始化其实也有默认值的过程,只不过系统马上自动将默认值替换成了大括号当中的具体数值。
(4)数组作为方法参数、返回值
1.作为参数时,参数为(int[] array),传递的是数组的内存地址值;
2.作为返回值时,方法的返回数据类型为int[],返回的也是地址值。
六.内存
(1)Java内存
(2)数组内存使用
1.先在方法区放入main方法的头;
2.从方法区将main方法的信息加载到栈内存中,并且在栈中为main方法开辟内存空间(进栈)。
3.在栈中将数组名称放入main方法的内存空间中。
4.在堆中为该数组开辟内存空间,将16进制地址放回数组在栈中的内存存储。
5.输出地址值,根据地址值以及索引值改变数组在堆中的数据值。
(多个数组的内存划分是类似的)
(3)多个引用指向同一个数组
int[] arrayA = new int[5];
int[] arrayB = arrayA;
//将arrayA数组的地址值赋值给arrayB数组,可通过arrayA和arrayB对该数组进行修改。
(4)常见问题:
1.索引值超出范围;
2.空指针异常;
int[] arrayA = null;
//所有的引用类型变量,都可以赋值为一个null值,但是代表其中什么都没有
//数组必须进行new初始化才能使用其中的元素,否则无默认值。
//尝试调用其中元素则会抛出NullPointerException异常
2.空指针异常;
int[] arrayA = null;
//所有的引用类型变量,都可以赋值为一个null值,但是代表其中什么都没有
//数组必须进行new初始化才能使用其中的元素,否则无默认值。
//尝试调用其中元素则会抛出NullPointerException异常