JAVA(1)

一.数据类型转换

(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异常
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值