美文网首页
JavaSE之面试挖坑题

JavaSE之面试挖坑题

作者: 金石_832e | 来源:发表于2019-02-27 19:33 被阅读0次

    1、下面写法是否正确?

    package com.zpwd.chapter1_0225;
    public class Demo1 {
    public static void main(String[] args) {
         int num =100;
         int i=99;//int i =99 变量i的作用域的开始位置
         if(num>50) {
               int i =10;//int i =10 变量i的作用域的开始位置
               System.out.println(i);
          }//int i =10 变量i的作用域的结束位置
         System.out.println(i);
       } //int i =99 变量i的作用域的结束位置
    }
    

    写法错误: int i=99 ; 变量i的作用域的从此处开始,到倒数第二个 } 结束。作用域内又声明了一个 int i =10; 有交集的作用域内不能存在名称相同的变量,因此错误。


    2、下面写法是否正确?

    package com.zpwd.chapter1_0225;
    public class Demo1 {
    public static void main(String[] args) {
         int num =100;
         if(num>50) {
               int i =10;//int i =10 变量i的作用域的开始位置
               System.out.println(i);
          }//int i =10 变量i的作用域的结束位置
         int i=99;
         System.out.println(i);
      } 
    }
    

    写法正确: 因为 int i=10;变量i的作用域从此处开始,到最近的 } 结束。而int i=99;变量i的作用域的从此处开始,到倒数第二个 } 结束。两个变量i的作用域没有交集,因此正确。


    3、给出下面的输出结果。

    package com.zpwd.chapter1_0225;
    public class Demo1 {
    public static void main(String[] args) {
         switch (num) {
        case 100:
            System.out.println("100分");
    
        case 99:
            System.out.println("差一分");
    
        case 98:
            System.out.println("差一分");
    
        case 97:
            System.out.println("差一分");
    
        default:
            System.out.println("不合格");
        }
      } 
    }
    

    错误结果: 100分。
    正确结果: 100分 差一分 差一分 差一分 不合格。

    注意:

    • switch函数的工作原理是,找到第一个满足条件的结果后,输出后续全部结果。
    • 若想找到匹配的结果后不再执行后续,加入break;跳出函数代码块。

    PS:break是退出循环,执行循环下方的代码(退出当前代码块)。
    PS:return则是返回到调用的方法处,顺序执行方法调用处的下方代码。
    PS:jdk7之前switch (表达式) ,表达式只接收int的兼容类型(byte 、char 、short 、 int )。
    PS:jdk7之后switch (表达式) ,表达式多加了一个类型 String。


    4、给出下面的输出结果。

    package com.zpwd.chapter1_0225;
    public class Demo1 {
    public static void main(String[] args) {
        //第一行
        int numz = 50;
        if (numz > 50)
        System.out.println("大于50");
        System.out.println("小于50");
    
        //第二行   
        int numx = 50;
        if (numx > 50);
        System.out.println("大于50");
        System.out.println("小于50");
      } 
    }
    

    结果:小于50 大于50 小于50

    因为上图等效于下图

     package com.zpwd.chapter2_0227;
    
     public class ccccc {
        public static void main(String[] args) {
        // 第一行
        int numz = 50;
        if (numz > 50) {
            System.out.println("大于50");
        }
        System.out.println("小于50");
    
        // 第二行
        int numx = 50;
        if (numx > 50) {
    
        }
        System.out.println("大于50");
        System.out.println("小于50");
      }
    }
    
    • PS:if表达式后面没有 ** { } ** 则与之紧挨着的下一行,就是他的结果。if表达式后面紧跟着 ; ,则表示什么都不做。

    5、坑中之坑。

    public class Practice {
    public static void main(String[] args) {
       // 1
       //      int x = 20;
       //      int y = 30;
       //      if(x > 10 && y == y++) 
       //      System.out.println(y);
       //      System.out.println(x);
       //      System.out.println(y);
       
        
       // 2
       //      int x = 20;
       //      int y = 30;
       //      if(x > 100 && y == y++) 
       //      System.out.println(y);
       //      System.out.println(x);
       //      System.out.println(y);
      
        
       // 3
       //      int x = 20;
       //      int y = 30;
       //      if(x > 10 || y == y++)
       //      System.out.println(y);
       //      System.out.println(x);
       //      System.out.println(y);
     
       
       // 4
       //      int x = 20;
       //      int y = 30;
       //      if(x > 10 || y == y++);
       //      System.out.println(y);
       //      System.out.println(x);
       //      System.out.println(y);
       
       }
    }
    

    // 3个数字 31 20 31
    // 2个数字 20 30
    // 3个数字 30 20 30
    // 3个数字 30 20 30

    • 一定要牢记&& 、|| 具有短路特性的。
      x > 100 && y == y++ : 因x小于100不成立, 且是逻辑与,第一个条件就没满足,因为短路了 ,压根就没做y == y++的判断,既然没有判断就不可能进行后自增的操作。
      x > 10 || y == y++ :因x大于10成立,且是**逻辑或,第一个条件满足,因为短路了 ,压根就没做y == y++的判断,既然没有判断就不可能进行后自增的操作。

    int[] oneArr = { 2, 11, 26, 27, 37, 44, 48, 60 };  
    int[] twoArr = { 19, 35, 49, 55, 58, 75, 83, 84, 91, 93 };  
    int[] threeArr = new int[oneArr.length + twoArr.length];   
    int p = 0, q = 0;
    while (p < oneArr.length && q < twoArr.length) {
    threeArr[p + q] =                               
    oneArr[p] < twoArr[q] ? oneArr[p++] : twoArr[q++];  
    
    }
    
    if (p < oneArr.length) {
    
    System.arraycopy(oneArr, p, threeArr, p + q, oneArr.length – p);
    
    }
    
    else if (q < twoArr.length) {
    
    System.arraycopy(twoArr, q, threeArr, p + q, twoArr.length – q);
    
    }
    for(int num : threeArr){
    
     System.out.print(num);
    
    } 
    

    输出的结果是:()。
    A. [2,11,26,27,37,44,48,60,19,35,49,55,58,75,83,84,91,93];
    B. [2,11,19,26,27,35,37,44,48,49,55,58,60,75,83,84,91,93];
    C. [19,35,49,55,58,75,83,84,91,93,2,11,26,27,37,44,48,60];
    D. [2,19,11,35,26,49,27,55,37,58,44,75,48,83,60,84,91,93];

    • 三目运算oneArr[p] < twoArr[q] ? oneArr[p++] : twoArr[q++]中P或Q的自增与前面的判断条件有关,只有满足判断条件的才会自增。B

    给出以下代码,请问该程序的运行结果是什么? C

    1. public class Example{
    2. private int i = giveMeJ();
    3. private int j = 10;
    4. private int giveMeJ(){
    5. return j;
    6. }
    7. public static void main(String args[]){
    8. System.out.println((new Example()).i);//
    9. }
    10. }

    请选择一个正确答案:
    (A) 第8行代码编译错误。
    (B) 第2行代码编译错误。
    (C) 打印输出:0
    (D) 打印输出:10
    (new Example()).i匿名对象调用i,当程序运行时,giveMeJ()会先被加载到方法区(堆、栈、方法区内存模型),此时在没有经过创建实例对象时,i和j的值没有经过初始化,他们的值为0。只有在经过创建对象后j的值才为10。

    相关文章

      网友评论

          本文标题:JavaSE之面试挖坑题

          本文链接:https://www.haomeiwen.com/subject/ehxquqtx.html