JAVA(1)

    科技2024-08-16  31

    一.数据类型转换

    (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异常
    Processed: 0.008, SQL: 8