Java基础复习---第二章

第二章

进制

世界上又两种人,认识二进制的和不认识二进制的人

常见进制

283975 #按照权值进行分型
    2 * 10^5 #该位置数字乘以权值
+     8 *10^
+       3*10^3
+           9*10^2
+               7*10^1
+                   5*10^0
    # 权值 = 10^N 十进制数
  • 十进制:逢10进1,计算权值时以10为底的n次幂
  • 二进制:逢2进1,计算权值时以2为底的n次幂
  • 八进制:逢8进1,计算权值时以8为底的n次幂
  • 十六进制:逢16进1,计算权值时以16为底的n次幂(1..9、A...F)

0xffff 使用前缀ox表示该数字为十六进制数 07使用0前缀表示八进制 0b二进制

示例:00110110转换为十进制数
2^1 + 2^2 + 2^4 + 2^5 = 2+4+16+32 = 54

示例:0x2371转换为十进制数
1*16^0 + 7*16^1 + 3*16^2 + 2*16^3 = 1+112+768+8192 = 9073

进制对照

二进制 八进制 十六进制 十进制
0000 0 0 0
0001 1 1 1
0010 2 2 2
0011 3 3 3
0100 4 4 4
0101 5 5 5
0110 6 6 6
0111 7 7 7
1000 10 8 8
1001 11 9 9
1010 12 A 10
1011 13 B 11
1100 14 C 12
1101 15 D 13
1110 16 E 14
1111 17 F 15
10000 20 F1 16
10001 21 F2 17

ps. 0b1111 1111 = 0x ff ps.计算机底层存储数据使用二进制

示例:将十六进制数 0x2B3C7F82转换为二进制
 2     B   3    C    7    F    8    2
0010 1011 0011 1100 0111 1111 1000 0010

示例:将二进制数 01111010111010101010110010101100转十六进制
0111 1010 1110 1010 1010 1100 1010 1100
 6    A    E    A    A    C    A    C
 结果为:0x6AEAACAC

符号位

​ 正数的补码是其原码,负数的补码为其反码加一

ps.反码即该编码各位上的数依次取反的结果

示例:
    0000 0111 byte型整数:十六进制 0x07 十进制 7
    
    1110 0110 byte型负数:十六进制 0x1A 十进制 26
    减一:1110 0110 - 1 = 1110 0101    取反:0001 1010 
byte型
最大值:1111 1111 : -1
最小值:1000 1000 : -128

short型
最大值:0111 1111 1111 1111 = 0x7FFFF = 32767
最小值:1000 0000 0000 0000 = 0x8000  = -32768

int型
最大值:0111 1111 1111... = 0x7FFFFFFF
最小值:1000 0000 0000... = 0x80000000

long型
最大值:0x7FFFFFFFFFFFFFFF
最小值:0x8000000000000000

char型
最大值:0xFFFF
最小值:0x0000

运算符

位运算符

位运算 运算 示例
<< 左移(保留符号位) 3<<2 = 12 (左移两位 322)
>> 右移(保留符号位) 3>>1=1 (0011 => 0001)
>>> 无符号右移 3>>>1
& 与运算 6 & 3 = 2
| 或运算 6 | 3 = 7
^ 异或运算 6 ^ 3 = 5
~ 取反 ~ 6 = -7
示例:
public class BinaryTest{
  public static void main(String[] args){ 
    byte b = (byte)0xC2; // 0x000000C2
    System.out.println(b);
    System.out.println(b << 2); //-248
  }
}

ps.位运算是直接对二进制进行运算

public class BinaryTest{
  public static void main(String[] args){ 
    int n1 = 0xd7;
        int n2 = 0xc5;
    //  int n1 = 0x7a;
    //  int n2 = 0x9c;
    /*  d7:1101 0111
            c5:1100 0101
        &: 1100 0101   
        |: 1101 0111
        ^: 0001 0110
        ni:0011 1010
        n2:0011 1010
    */   
        // 0111 1010
        // 1001 1100
        // 0001 1000 = 24
    System.out.println(n1 & n2);
        // 0111 1010
        // 1001 1100
        // 1111 1110 = 254
        System.out.println(n1 | n2);
        // 0111 1010
        // 1000 0101 = -123
        System.out.println(~n1);
        // 1001 1100
        // 0110 0011 = -157
        System.out.println(~n2);
        // 0111 1010
        // 1001 1100
        // 1110 0110 = 230
        System.out.println(n1 ^ n2);
  }
}

自增注意事项

int n = 10;
n = n++;
system.out.println("n="+n);
//n的值为10 赋值语句从右至左 
// 右n的值为10待赋值给左
// 右n自增为11
// 将待赋值的10赋值给左侧
//结束

+= 和 + 的区别

short s =3;
s = s+2; //发生了类型变化 右侧为int型
s+=2;       // 未发生类型变化

比较运算符

运算符 运算 范例 结果 适用范围
== 相等于 1 == 1 true 所有数据
!= 不等于 1 != 1 false 所有数据
< 小于 2<3 true 基本数据
> 大于 2>3 false 基本数据
<= 小等于 2<=3 true 基本数据
>= 大等于 2>3 false 基本数据
instanceof

逻辑运算符

  • &逻辑与
  • |逻辑或
  • !逻辑非
  • && 短路与
  • ||短路或
  • ^逻辑异或

ps. & 运算两边都会参与运算 不会短路 && 运算会短路

a b a&b a|b !a a&&b a^b a||b
true fase true true fase true fase true
true fase fase true fase fase true true
fase true fase true true fase true true
fase true fase fase true fase fase fase
示例:
    3<x<6  //错误写法
    x>3 & x<6
 
  int x = 1;
    int y = 1;
if(x++ == 2 & ++ y =2) System.out.println("判断为真!");
//此处 x最终为2 y最终为2

  int x = 1;
    int y = 1;
if(x++ == 2 && ++ y =2) System.out.println("判断为真!");
//此处 x最终为2 y最终为1 发生了运算短路

三目运算符

​ (条件表达式)?表达式1:表达式2

  • 表示式为ture取表达式1的值
  • 表达式为fals取表达式2的值
变量如下:
    int n = 10;
    int m = 20;
    int k = 40;
    int max;
示例:取两个数中较大的数
    max = (n>m)?n:m;
示例:取出三个数中的较大数
    max = (n>m)?(n>k)?n:k:(m>k)?m:k

运算符优先级

​ 从左到右,搞优先级优先进行运算

流程控制

  • 顺序结构:程序按顺序从上到下执行
  • 分支结构:根据判断条件选择分支进行执行
  • 循环结构:按照循环条件进行循环执行

分支结构

基本if语句

​ 当括号中的条件为真时执行后面的分支内容。

ps.java中分支结构括号中的内容必须时布尔型

if(a == 0) System.out.println("a等于0");

if(a != 0 ){
        System.out.println("a不等于0");
        System.out.println("请重新输入!");
}

if-else语句

​ 当括号中的条件为真时,执行if后的分支内容,括号条件为假时,执行else后的分支内容。

if(a == 0)  System.out.println("a等于0");
  else{
      System.out.println("a不等于0");
      System.out.println("请重新输入!");
  }

if-else嵌套

​ 判断规则与if-else相同,将if-else进行嵌套。

if(a == 0) System.out.println("a等于0");
    else if(a == 1)  System.out.println("a等于0");
                else { 
          if (a==3) System.out.println("a等于3");
          System.out.println("a不等于1或者0");
        }           

switch分支结构

选择变量

​ 变量的数据类型:byte,int,char,short,String,枚举型

基本结构
switch(变量){
    case 常量1:
      ...
      break;
    case 常量2:
      ...
      break;
        case 常量3:
      ...
      break;
    case 常量4:
      ...
      break; 
    case 常量5:
      ...
      break; 
    default:
        ...
      break;
}

循环结构

​ 在某些条件满足的情况下,反复执行特定代码的功能,包含一下四个部分。

  • 初始化部分(init_statement)
  • 循环条件部分(test_exp)
  • 循环体部分(body_statement)
  • 迭代部分(alter_statement)

ps.while循环、do/while循环、for循环

while循环

语法格式

while(布尔型测试表达式){
  ...
  循环条件修改语句;
}
示例:
  public void testWhile(){  
    int count;
    //初始化语句
    int i = 1;
    //循环因子
    while(i<10){  //循环条件
        count += i;
        //循环体语句
        i++;
        //迭代语句
    }
    System.out.println("count:"+count);
  }

do-while循环

语法格式

do{
  ...
  循环条件修改语句;
}while(布尔型测试表达式)
示例:
public void testDoWhile{
    int result = 0,i=1;
    //初始化语句及循环因子    
    do{
    result+=i
    //循环体语句
    i++
    //迭代语句
  }while(i<=5)//循环条件
    System.out.println("result:"+result);
}

for循环

语法格式

for(初始化语句;布尔测试表达式;循环条件修改语句){        
  ...       
}
    int count;
    for(int i=1; i<100; i++) count+=i;
    System.out.println("count:"+count);

无限循环

​ 当循环次数不确定时,优选while循环。

示例:
    boolean flag = true;
    while(flag){ ... }
    do{...}while(flag)//至少循环一次
示例:
    boolean flag = true;
    for(;;;){...}
    for(;flag;){...}

特殊流程控制

break 语句

​ break语句用于终止某个语句块的执行。

示例:
    for(int i=0; i<10; i++)
        if( i==3 ) break;

  label:for(int i=0; i<10; i++){
          for(int i=0; i<10; i++)
            if( i==3 ) break lable;
            }

countinue语句

​ 只能用于循环语句,跳过某次循环。

return语句

​ 结束方法,方法执行的返回。

方法

某种功能的封装 方法 = 方法签名 + 方法体

​ 方法是类或对象行为特征的抽象,也成为函数。Java中方法不能独立存在,必须在类中定义。

语法格式

权限修饰符  返回值类型  方法名(参数类型 参数1,参数类型 形参2,...){
  ...
  return 返回值;
}
示例:
    public String printHello(int name){//方法签名
            Stirng hello = "Hello! "+ name;
            return hello;
    }
  public static void main(String args[]){
        //方法调用
        String welcome = printHello();
        //int a = printHello(); ×
  }
  • 形式参数:在方法被调用时用于接收外部传入的数据的变量

  • 参数类型:形式参数的数据类型

  • 返回值:方法在执行完毕后返还给调用它的程序的数据

  • 返回值类型:方法要返回的结构的数据类型

  • 实际参数:调用方法时实际穿个函数形式参数的数据

    ps. 返回值为void的方法表示无返回值

重载

重载让方法调用变得简单

​ 在同一个类中,方法名相同,参数不同就形成重载。参数不同体现在类型不同、顺序不同、参数个数不同。

示例:
    public class OverLoadTest{

    public static int add(int a, int b){
      return a+b;
    }

    public static int add(int a, byte b){
      return a+b;
    }

    public static int add(int a, double b){
      return (int)a+b;
    }
  }

方法的参数传递

​ java中只有值传递,形参是实参的一个复制品。

方法调用的原理

栈帧

​ 方法栈中的组成单元,包括了方法及其局部变量。

方法栈

​ 一个先进后出的结构,用于存放方法,其单元由栈帧组成。

方法栈原理

说明:

  1. main函数中调用add方法
  2. main函数调用参数传递后压栈
  3. 开始add方法的方法体执行
  4. add方法中又调用test方法
  5. add方法入栈
  6. 进行test方法执行
  7. test执行完成出栈
  8. add执行完成出栈 (将返回值拷贝到临时空间)
  9. main方法执行 (从临时取获得返回值继续执行)

跨类调用方法

​ 通过类名大写加上.的方式可以访问该类的静态方法。

  public class Method{
    public static String getMethod(){
      return "Method";
    }
  }

  public class Test{
    public static void main(String[] args){
      String method = Method.getMethod;
      Sysem.out.println()
    }
 }

猜你喜欢

转载自www.cnblogs.com/Wu-Zang/p/10729259.html