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
- public class Example{
- private int i = giveMeJ();
- private int j = 10;
- private int giveMeJ(){
- return j;
- }
- public static void main(String args[]){
- System.out.println((new Example()).i);//
- }
- }
请选择一个正确答案:
(A) 第8行代码编译错误。
(B) 第2行代码编译错误。
(C) 打印输出:0
(D) 打印输出:10
(new Example()).i匿名对象调用i,当程序运行时,giveMeJ()会先被加载到方法区(堆、栈、方法区内存模型),此时在没有经过创建实例对象时,i和j的值没有经过初始化,他们的值为0。只有在经过创建对象后j的值才为10。