问题1:下面代码的打印结果为?
package day01;
public class Text02 {
public static void main(String[] args) {
Text02 t=new Text02();
t.first();
}
public void first()
{
int i=5;
Value v=new Value();
v.i=25;
second(v,i);
System.out.print(" "+v.i);
}
public void second(Value v,int i)
{
i=0;
v.i=20;
Value val=new Value();
v=val;
System.out.print(v.i+" "+i);
}
}
class Value{
public int i=15;
}
我的解题思路:
1.首先快速浏览一遍,确定此段程序的基本内容:
两个类:
主类Text02 :一个主方法。 两个动作方法
其他类Value:只声明了一个public的变量i=15
2.然后看主类的两个动作方法:
/*
此方法主要内容为:
用Value类创建实例并进行相关操作
*/
public void first()
{
int i=5;//声明一个i=5
Value v=new Value();//创建Value实例v
v.i=25;//令对象v里的变量i=25
second(v,i);//将对象v的“复印”和i=5传入second中
System.out.print(""+v.i);//上一句是将v的复印传入,这里的v的地址还是原来的,故此处输出为20
}
/*
此方法主要内容为:
对first里创建的对象进行新的操作
*/
public void second(Value v,int i)
{
i=0;//令i=0
v.i=20;//令对象v里的变量i=20
Value val=new Value();//创建新实例val
v=val;//将v的地址引用改为val,此时v就和val一样了,即v.i=15
System.out.print(v.i+" "+i);//所以此处的输出为15 0
}
所以最后的运行结果为:15 0 20
总结:此题涉及的有java的传值机制和对象的区分,我个人觉得关键在于是否真正理解对象实例。
问题2:下面代码是否可以编译通过,如果编译通过,则执行结果为?
package day01;
public class Text03 {
static int x=10;
static{
x+=5;
}
public static void main(String[] args) {
System.out.println("x="+x);
}
static{
x/=3;
}
}
我的答案是:可以编译,结果为x=5
下面是思路:
首先我得理解static的作用是什么?
用static修饰的变量,方法,类都在编译期会优先被实例化(执行),执行顺序是按代码由前到后的。
所以我们看上面代码就可以很简单的得到答案。(主方法最后执行)
总结:要理解静态static的工作原理。
问题3:下面代码的运行结果为?
public class Text04 {
public static void main(String[] args) {
char s[]={'1','3','1','4','5','2','0'};
int v1=0,v2=0,v3=0,v4=0;
for(int i=0;i<7; i++)
{
switch (s[i]){
default: v4++;
case '1': v1++;
case '2': v2++;
case '3': v3++;
}
}
System.out.println(v4+" "+v1+" "+v2+" "+v3);
}
}
本题的关键是对default的理解和对case执行原则的理解:
defalut的执行原则是当case中找不到对应的情况时执行,如果没有break,则将继续执行下去,直到执行完后面所有语句。
case中如果没有break,则将继续执行下去,直到执行完后面所有语句。
所以上面代码的运行结果为:
3,5,6,7