菜鸟进阶必杀技(Ⅱ)——java基础知识自测篇

经过了上一篇的讲解,看看下面这些题你能做对多少

问题一
//下面这段代码的输出结果是什么?
public class Test1 {
	public static void changeStr(String str) {
		str = "welcome";
	}

	public static void main(String[] args) {
		String str = "1234";
		changeStr(str);
		System.out.println(str);
	}
}

问题二
public class Test
{
    private int i=getValue();//第2行
    private int j = 10;
    int getValue(){
        return j;
    }
    public static void main(String[] args) {
        System.out.print(new Test().i);//第9行

    }
}
/**
输出:
A 第二行编译错误
B 第九行编译错误
C 输出:10
D 输出:0
输出结果会是什么?
*/

问题三
//下面的程序会打印出什么样的结果?
public class Test {
	static boolean foo(char c) {
	System.out.print(c);
	return true;
	}
	public static void main( String[] argv ) {
	int i =0;
	for ( foo('A'); foo('B')&&(i<2); foo('C')){
	 i++ ;
	 foo('D');
	}
	}
 }

********************************************华丽的分割线******************************************
答案:
第一题:输出的结果是1234。至于为什么,我想这个题目变成这样的话会更能说明问题
public class Test {
	public static void changeStr(String str) {
		
		str = "welcome";
		System.out.println("str of changeStr():"+str);
	}

	public static void main(String[] args) {
		String str = "1234";
		changeStr(str);
		System.out.println("str of main():"+str);
	}
}
输出的结果是:str of changeStr():welcome  ,str of main():1234。需要考虑的是局部变量的作用域

************************************************华丽的分割线*************************************************
第二题:答案是D,输出结果为0.
当你执行System.out.print(new test().i);时,
首先执行new test()。
  1. java虚拟机开始构建对象
  2. 首先为该对象分配一块内存空间
  3. 对该内存空间执行清零操作(就是因为这个清零操作,完成了对所有变量赋值0)
  4. 开始执行静态成员的初始化以及静态块的初始化----你这里没有就不用谈了
  5. 然后开始初始化成员变量,顺序执行
  6. 执行private int i=getValue();
  7. 调用getValue()方法
  8. 执行getValue方法返回0.---------请参照第2点
  9. 执行private int j = 10;
  10. 开始执行构造函数
  11. 因为你是在test的main函数执行的代码。main函数也是属于test类的。因此它是可以直接访问private变量i的。
因此输出结果为0。

**************************************************华丽的分割线*****************************************
第三题:输出结果是 ABDCBDCB ,怎么样是不是跟想象的有点不一样
首先说名下for循环,for循环中包含 初始化(initialization)表达式,布尔表达式(Boolean-expression)和步进(step)运算,进行for循环时,首先是初始化,然后测试布尔表达式,若获得true,就会执行for语句后面的代码。每次循环结束,执行一次步进。注意,步进是留在最后做的
对于本题来说,for循环的过程如下:
  1. 执行foo("A"),输出A
  2. 测试布尔表达式,执行foo("B"),输出B,此时foo("B")&&i<2判断为true,继续执行for后面的语句,foo("D")被执行,输出 D
  3. 执行一次步进,foo("C")被执行,输出C
  4. 再次判断 布尔表达式,执行foo("B"),输出B,此时foo("B")&&i<2判断结果仍未true,继续执行for后面的语句,foo("D")被执行,输出 D
  5. 再次执行步进,foo("C")被执行,输出C
  6. 继续判断 布尔表达式,执行foo("B"),输出B,此时foo("B")&&i<2 判断为false,循环结束,后面语句不再执行
所以最终结果是:ABDCBDCB 。



  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值