java基础

来源:互联网 发布:js传递数组到php 编辑:程序博客网 时间:2024/06/08 15:51

java基础回顾(一)

  • java中boolean类型的长度问题
    根据java虚拟机规范里面的解释可知,它的长度是不确定的,单个的boolean类型变量的长度是int类型的长度,为4个字节;boolean类型的数组,每个元素的长度为byte类型,占1字节。

  • 类型转换小细节
    float类型定义时后面要加f,long类型定义时后面要加l。小类型转大类型自动向上转型,大转小需要强制转换。float+long=float.(这里指代的都是类型)

  • 原码,反码,补码
    1.当原码为正数时,反码,补码都与原码一致。
    2.当原码为负数时,反码=原码除符号位取反,补码=反码-1.
    例:0000 0011(+3)原码
    0000 0011 反码
    0000 0011 补码
    1000 0011 (-3)原码
    1111 1100 反码
    1111 1011 补码
    计算机操作的是补码的原因:
    1.将减法运算变为加法运算,方便做减法运算。A-127=A + (-127)
    *引入补码以后,计算机中的加减运算都可以用加法来实现,并且两数的补码之“和”等于两数“和”的补码,在计算机中,所有的加减运算都可以统一化成补码的加法运算,并且其符号位也一起参与运算,结果为补码,这种运算既可靠又方便
    如果用原码计算,1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[1000 0010]原=2.如果用原码计算,让符号位也参与运算,显然对于减法来说,结果是不正确的,这也就是为什么计算机内部不用原码表示一个数,为了解决原码做减法的问题出现了反码,如果用反码计算减法,1-1=1+(-1)= [0000 0001]原+ [1000 0001]原=[0000 0001]反+[1111 1110反]=[1111 1111]反=[1000 0000]原=-0,发现用反码计算减法,结果的真值部分是正确的,而唯一的问题其实出现在0这个特殊的数值上,虽然人们理解上+0和-0是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0;于是补码的出现,解决了0的符号以及两个编码的问题:1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[0000 0001]补+[1111 1111]补=[0000 0000]补=[0000 0000]原,这样0用[0000 0000]表示,而以前出现的问题-0则不存在了,而且可以用[1000 0000]表示-128。 (-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补。在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)。使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值。
    2.无符号及带符号的加法运算可以用同一电路完成。
      有符号和无符号的加减,其实都是把它们的真值拿过来相加。

  • 位运算符(操作的都是补码)

    *进行位运算时,都是先化为补码在进行计算,当运算结果符号位为0(正)时,不用再转回原码;当符号位为1时,需要将补码转回为原码。

    **&:两边同时为1,则为1,否则为0.
    ** | :两边有一方为1,则为1,否则为0.
    ** ^ : 两边不一致时结果为1,否则为0.
    **~ :直接取反。

  • 移位运算符(操作补码)
    **<< :左移 右边补0
    **>> :右移 正数左边补0,负数左边补1
    ** >>> :无符号右移 不论正负,左边补0.

  • ++,–注意点

  • 1.++在赋值符号(=)后面时,先赋值,再运算
    例:int i = 3; i = i++ + i++ ; i = 3 + 4 = 7;
  • 2.++在=前面时,先运算,再赋值
  • 3.在前后混合使用的情况下,遇到++/–在前面的时候,需考虑其前面的++/–在后面的情况也要运算。
  • 例:int i = 3; i = i++ + ++i + i– + –i; i = 3 + 5 +5 +3=16;
    *在多重++/- -一起使用时,后者在自增或自减时,会把前一个的值运算出来再根据自己的位置作运算或赋值。

    程序的三种结构(流程控制):

    1)顺序结构;
    2)分支结构;
    if()和else if()的区别:当有多条if语句时,第一条匹配上之后的if语句还是会执行匹配后面的if语句;else if在匹配上一条后,后面的不会再执行。
    switch(condition):可以是byte,short,int,char,String(1.7+),Enum(1.5+)
    3)循环结构
    for(){} for each(1.5+)
    do{}while();
    while(){}
    *return,break,continue的区别:
    return:结束方法,后面的代码块不会再执行,在有返回值的情况下,所有分支都需要return。
    break:结束当前循环,可以加上标签跳出外层循环。
    continue:跳过本次循环,在其后面的代码块不会再执行。

    • 方法重载
      方法重载只与方法签名有关,与返回值类型没关系。

数组 存储一组相同数据类型的数据(基本,引用)

    //声明数组  初始化长度  长度不可变    int[] is = new int[10];    //数组[基本数据类型] 引用(栈)  数据[栈里面]    //数组[引用数据类型] 引用(栈)  数据[堆里面]    //插入排序  public static void insertSort(int[] is){    int len = is.length;    for (int i = 0; i < len-1; i++) {        //每一轮比较次数在增加        for (int j = i+1; j > 0; j--) {            if(is[j] < is[j-1]){                swap(is, j, j-1);            }        }        System.out.println(i+1+"轮:"+Arrays.toString(is));    }}//选择排序  选出一个最小值然后逐个比较 找出真正的最小值public static void selectSort(int[] is){    int len = is.length;    int min = 0;    //比较多少轮    for(int i = 0;i<len-1;i++){        min = i;        //比较多少次        for(int j = i;j<len;j++){            if(is[j]<is[min])                min=j;        }        if(min!=i){            is[min]=is[min]^is[i];            is[i]=is[min]^is[i];            is[min]=is[min]^is[i];        }    }}//冒泡  两两相比 找出较大的   最大的放最后public static void bubbleSort(int[] is){    //决定多少轮    for (int i = 0; i < is.length-1; i++) {        //每一轮比较过程        for (int j = 0; j < (is.length-i-1); j++) {            if(is[j]>is[j+1]){                swap(is, j,j+1);            }        }        System.out.println(i+1+"轮:"+Arrays.toString(is));    }}/** * i < j * @param is * @param i * @param j */private static void swap(int[] is,int i, int j) {    int temp = is[i];    is[i] = is[j];    is[j] = temp;}2.随机数Random r = new Random();int i = r.nextInt(10)+1;//1-10

学习心得:
1.插入排序是把一个数插入到前/后面一个有序的序列中;冒泡排序是把一个数与前面或后面的无序序列的元素比较,然后交换;选择排序是选出一个最小值然后逐个比较 找出真正的最小值,每一轮交换一次。

构造函数

  1. 没有返回值
  2. 不需要对象 去调用,在对象创建时自动调用
  3. 在没有定义构造函数时,JVM会自动添加一个无参构造
  4. 支持重载

反编译

  1. javap -c -l
  2. 在命令行下切换到.class文件所在目录,执行javap命令eg:javap -c Car.class

代码块

1.普通代码块
2.构造代码块:对该类的所有对象进行初始化
3.静态代码块

  • 静态代码块>构造代码块>普通代码块

局部变量和成员变量的区别

  1. 在类中的位置不同
  2. 在内存中的位置不同
  3. 生命周期不同
  4. 初始值不同,成员变量有默认值
  5. 作用域不同
1 0
原创粉丝点击