当前位置:编程学习 > JAVA >>

东软Java变态的笔试题

public class test {

/**
 * @param args
 */
private int i=getValue();//第2行
private int j = 10;
int getValue(){
return j;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print(new test().i);//第9行

}

}


输出:
A 第二行编译错误
B 第九行编译错误
C 输出:10
D 输出:0


答案是D 求解释。 --------------------编程问答--------------------   public static void main(String[] args)中的static 是关键,静态的会先加载, --------------------编程问答-------------------- 程序从main方法逐句执行,
当执行到private int i=getValue();这句时,变量j还没有被赋值为10,因此j此时的值是默认值0,这样i = 0。
所以最后执行System.out.print(new test().i);输出i的值就是0. --------------------编程问答-------------------- sorry,忘记写关键的了,类成员变量初始化顺序:
父类--静态变量 
父类--静态初始化块 
子类--静态变量 
子类--静态初始化块 
父类--变量
父类--初始化块 
父类--构造器 
子类--变量 
子类--初始化块 
子类--构造器  --------------------编程问答-------------------- 我错了  是顺序问题 --------------------编程问答-------------------- 请问下,为什么getValue()没有报错?
--------------------编程问答-------------------- --------------------编程问答-------------------- 类的初始化时变量从上到下先赋予默认值,然后再从上到下赋予初始值,当给i赋初始值的时候,j还是默认值,所以答案就是D了 --------------------编程问答-------------------- 我想补充一个问题:
System.out.print(new test().i)和 System.out.print(i) 输出会一样吗?区别在哪里? --------------------编程问答--------------------
引用 8 楼  的回复:
我想补充一个问题:
System.out.print(new test().i)和 System.out.print(i) 输出会一样吗?区别在哪里?


静态方法不能对实例变量引用,因为不知道是谁的引用。所以System.out.print(i)不能编译 --------------------编程问答--------------------
引用 3 楼  的回复:
sorry,忘记写关键的了,类成员变量初始化顺序:


静态成员的初始化和静态代码块,之间没有固定执行的顺序。

要看在类中定义的先后,谁在前就先执行谁。

Demo:


package com.jiakai;

public class Test {


public static int i = getI();
static {
System.out.println("static{}");
}
public static int j = getJ();


public static int getI(){
System.out.println("getI()");
return 0;
}
public static int getJ(){
System.out.println("getJ()");
return 0;
}

public static void main(String[] args) {


}

}





Test Result:



getI()
static{}
getJ()





--------------------编程问答--------------------
引用 10 楼  的回复:
引用 3 楼  的回复:

sorry,忘记写关键的了,类成员变量初始化顺序:



静态成员的初始化和静态代码块,之间没有固定执行的顺序。

要看在类中定义的先后,谁在前就先执行谁。

Demo:

Java code

package com.jiakai;

public class Test {


    public static int i = getI(……

对! +1 --------------------编程问答--------------------
引用 10 楼  的回复:
引用 3 楼 的回复:

sorry,忘记写关键的了,类成员变量初始化顺序:



静态成员的初始化和静态代码块,之间没有固定执行的顺序。

要看在类中定义的先后,谁在前就先执行谁。

Demo:


Java code

package com.jiakai;

public class Test {


    public static int i =……


NO。你这样说是错误滴。
楼主的这个问题涉及到了初始化的问题。以及private的访问权限问题。

[color=#FF0000]
我逐一解释一下:
首先执行main函数,但是在执行main函数之前。虚拟机加载Test.class
当虚拟机加载完Test.class时,开始执行Test中的所有静态成员的初始化以及static块,顺序执行的。
然后开始执行main函数
----------------------------------
当你执行System.out.print(new test().i);时,
首先执行new test()。
java虚拟机开始构建对象
1、首先为该对象分配一块内存空间
2、对该内存空间执行清零操作(就是因为这个清零操作,完成了对所有变量赋值0)
3、开始执行静态成员的初始化以及静态块的初始化----你这里没有就不用谈了
4、然后开始初始化成员变量,顺序执行
5、执行private int i=getValue();
6、调用getValue()方法
7、执行getValue方法返回0.---------请参照第2点
8、执行private int j = 10;
9、开始执行构造函数
10、因为你是在test的main函数执行的代码。main函数也是属于test类的。因此它是可以直接访问private变量i的。
因此输出结果为0。
误区:老师说的什么构造函数是一个执行的啊神马的都是骗人的。

关于访问权限请参照一下代码:
public class sdfsa {
public static void main(String[] args) {

}
}
class Test 
{
private int i;
public void te(Test t) {
t.i = 10;//Test的变量i时私有的,但是仍然能在Test内部访问
}
}

color] --------------------编程问答-------------------- 还真是第一次碰到这样的 --------------------编程问答--------------------
引用 7 楼  的回复:
类的初始化时变量从上到下先赋予默认值,然后再从上到下赋予初始值,当给i赋初始值的时候,j还是默认值,所以答案就是D了
+1 --------------------编程问答-------------------- 这种题目不算变态,要是算变态,Java解惑一书关于类初始化的谜题就弄死你了.
虽然i提前引用了j,但由于是通过方法引用的,所以不会报编译错误,而直接引用(如private int i = j;)则会报"非法向前引用",这在java语言规范中明确给出.
创建类的对象的时候,首先堆上会分配适当的内存用于存放对象,然后实例变量都会被赋予默认值(位模式都是0),所以i引用j的时候,j还是默认值0
--------------------编程问答-------------------- 12楼是正解,new test()的时候首先会初始化类的属性i,j将他们都初始化为0,然后在private int i=getValue();的时候i就能等于0 --------------------编程问答-------------------- 这个题目真给力。。 --------------------编程问答-------------------- 0吧。在赋值i的时候,j没有被赋值,此时j的值应当是默认的0 --------------------编程问答--------------------
引用 12 楼  的回复:
引用 10 楼  的回复:
引用 3 楼 的回复:

sorry,忘记写关键的了,类成员变量初始化顺序:



静态成员的初始化和静态代码块,之间没有固定执行的顺序。

要看在类中定义的先后,谁在前就先执行谁。

Demo:


Java code

package com.jiakai;

public class Test {


public st……

分析到位!加断点跑下就明白多了 --------------------编程问答--------------------
引用 12 楼  的回复:
引用 10 楼  的回复:
引用 3 楼 的回复:

sorry,忘记写关键的了,类成员变量初始化顺序:



静态成员的初始化和静态代码块,之间没有固定执行的顺序。

要看在类中定义的先后,谁在前就先执行谁。

Demo:


Java code

package com.jiakai;

public class Test {


public st……



高手! --------------------编程问答-------------------- 东软~~~~~~ --------------------编程问答-------------------- 孔乙己之类的题目. --------------------编程问答--------------------   --------------------编程问答-------------------- 给力啊。学习了 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 12 楼  的回复:
引用 10 楼 的回复:
引用 3 楼 的回复:

sorry,忘记写关键的了,类成员变量初始化顺序:



静态成员的初始化和静态代码块,之间没有固定执行的顺序。

要看在类中定义的先后,谁在前就先执行谁。

Demo:


Java code

package com.jiakai;

public class Test {


public stat……

12楼,你在想想构造函数是什么时候执行的,别误导人哦 --------------------编程问答-------------------- 看不懂 --------------------编程问答-------------------- 其实这些很少用到,返正我没有用到过,现在的变量赋值取值都通过set和get,像这样用也就是常量。 --------------------编程问答--------------------
引用 27 楼  的回复:
引用 12 楼  的回复:
引用 10 楼 的回复:
引用 3 楼 的回复:

sorry,忘记写关键的了,类成员变量初始化顺序:



静态成员的初始化和静态代码块,之间没有固定执行的顺序。

要看在类中定义的先后,谁在前就先执行谁。

Demo:


Java code

package com.jiakai;

public class Test {
……

12楼,你在想想构造函数是什么时候执行的,别误导人哦


误导?我误导了么?你去加个断点编译运行一下看看。我到底有没有误导大家。 --------------------编程问答-------------------- 这种问题就是陷阱,稍不注意就掉进去了。仔细想一下就明白了。  --------------------编程问答--------------------
引用 2 楼  的回复:
程序从main方法逐句执行,
当执行到private int i=getValue();这句时,变量j还没有被赋值为10,因此j此时的值是默认值0,这样i = 0。
所以最后执行System.out.print(new test().i);输出i的值就是0.


学习学习 --------------------编程问答-------------------- 当执行到private int i=getValue();执行getalue方法,此时取j的值,为0. --------------------编程问答-------------------- J 不是赋值为10了么 方法返回的是J啊  肿么是0了啊 
菜鸟不懂啊 --------------------编程问答-------------------- 学习了 我懂了~~~
 是一步一步来的。 第一个J 赋予了10
main方法还没读到J的时候它的默认值就是0.和上面哪个赋值无关~ --------------------编程问答-------------------- --------------------编程问答-------------------- 题目都看到private int i=getValue();//第2行在看下选项。果然有0这个选项,结果果然是D。还有木有创意? --------------------编程问答-------------------- 关键是j在i之下 --------------------编程问答-------------------- 12楼正解
引用下《Thinking in JAVA》
1.当new Test()创建对象的时候,首先将在堆上为Test对象分配足够的空间
2.这块储存空间被清零,这就自动地将Test对象中的所有基本数据类型都设置成了默认值(i=0;j=0)
3.执行所有出现与字段定义处的初始化动作,先调用getValue()方法,后给j赋值为10
4.执行构造器(这里没有) --------------------编程问答--------------------
引用 39 楼  的回复:
12楼正解
引用下《Thinking in JAVA》
1.当new Test()创建对象的时候,首先将在堆上为Test对象分配足够的空间
2.这块储存空间被清零,这就自动地将Test对象中的所有基本数据类型都设置成了默认值(i=0;j=0)
3.执行所有出现与字段定义处的初始化动作,先调用getValue()方法,后给j赋值为10
4.执行构造器(这里没有)

1 系统先初始化变量,整型均被默认赋值0,此时i=j=0;
2 在初始化i,j后,会对i,j赋值,i = getValu() = j = 0;
3 j = 10; --------------------编程问答-------------------- 恩,这道题挺好的,很基础 --------------------编程问答--------------------
引用 1 楼  的回复:
public static void main(String[] args)中的static 是关键,静态的会先加载,


说的很到位,简单,易懂。学习了!!! --------------------编程问答--------------------
引用 42 楼  的回复:
引用 1 楼 的回复:
public static void main(String[] args)中的static 是关键,静态的会先加载,


说的很到位,简单,易懂。学习了!!!

不好意思,点错 了,想引用2楼的!!! --------------------编程问答--------------------
引用 2 楼  的回复:
程序从main方法逐句执行,
当执行到private int i=getValue();这句时,变量j还没有被赋值为10,因此j此时的值是默认值0,这样i = 0。
所以最后执行System.out.print(new test().i);输出i的值就是0.


就是这个道理。 --------------------编程问答-------------------- 没有静态变量,顺序执行赋值,结果自然是D. --------------------编程问答-------------------- 很好的帖子,学习了~ --------------------编程问答-------------------- 没人讨论了? --------------------编程问答-------------------- 执行private int i=getValue();这句话的时候,j的值为0.
看看类的初始化顺序就明白了 --------------------编程问答--------------------
引用 12 楼  的回复:
引用 10 楼 的回复:
引用 3 楼 的回复:

sorry,忘记写关键的了,类成员变量初始化顺序:



静态成员的初始化和静态代码块,之间没有固定执行的顺序。

要看在类中定义的先后,谁在前就先执行谁。

Demo:


Java code

package com.jiakai;

public class Test {


public stat……

学习了 --------------------编程问答-------------------- 用排除法,平时多练代码就知道第2行和第9行编译错误不。不报错就只有2个答案了你随便蒙一个也就对了 --------------------编程问答--------------------
引用 3 楼  的回复:
sorry,忘记写关键的了,类成员变量初始化顺序:
父类--静态变量 
父类--静态初始化块 
子类--静态变量 
子类--静态初始化块 
父类--变量
父类--初始化块 
父类--构造器 
子类--变量 
子类--初始化块 
子类--构造器

了解这些对实际应用有什么帮助么?我的意思是,这些东西都有比较复杂,实际用的时候我们好像可以事先去避免发生这些,描述的不太好,呵呵 --------------------编程问答-------------------- 这种题目算变态?没压力,只要对static了解的人,都做的出 --------------------编程问答-------------------- 我嘞个去,
private int j = 10;
放到前面输出就是10了; --------------------编程问答-------------------- 7楼正解啊, --------------------编程问答--------------------
引用 51 楼  的回复:
引用 3 楼 的回复:

sorry,忘记写关键的了,类成员变量初始化顺序:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

了解这些对实际应用有什么帮助么?我的意思是,这些东西都有比较复杂,实际用的时候我们好像可以事先去避免发生这些,描述的……

跟这些没有关系吧 --------------------编程问答-------------------- mark  一会debug下 --------------------编程问答-------------------- 谢谢楼主。 明白了 --------------------编程问答-------------------- 笔试的时候就是这样,考的就是执行顺序问题。 --------------------编程问答-------------------- 挺好的题,这些细节实际开发中可能用不到,但它们可以体现出面试者是否有严谨的学习态度,试想连这样的问题都能分析到得人在别的粗枝大叶方面也是差不了的。12楼和39楼很不错 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 11 楼  的回复:
引用 10 楼 的回复:

引用 3 楼 的回复:

sorry,忘记写关键的了,类成员变量初始化顺序:



静态成员的初始化和静态代码块,之间没有固定执行的顺序。

要看在类中定义的先后,谁在前就先执行谁。

Demo:

Java code

package com.jiakai;

public class Test {


public stat……


+1 --------------------编程问答-------------------- 莫怪,我试下到底是那几个词是禁言,而导致我一而再再而三被封号:  经验 --------------------编程问答--------------------  改成private static int j = 10;
这样当程序跑起来的时候就会先在内存中分配一个J=10
--------------------编程问答--------------------
引用 2 楼  的回复:
程序从main方法逐句执行,
当执行到private int i=getValue();这句时,变量j还没有被赋值为10,因此j此时的值是默认值0,这样i = 0。
所以最后执行System.out.print(new test().i);输出i的值就是0.


如果把i和j的位置调一下,那输出的结果就是10. --------------------编程问答--------------------
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,