JavaSE之面试挖坑题

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

    推荐阅读