一个Java 小问题呀 请指教呀

SoftWare2589 2012-05-15 08:18:34
public class Example
{
private int i = giveMeJ();

private int j = 10;
private int giveMeJ()
{
System.out.print(j);
return j;
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
System.out.println((new Example()).i);
}

}

为什么输出 00 呢
很不能理解呀
...全文
216 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mp19901204 2012-05-18
  • 打赏
  • 举报
回复
大神太多,跟加一
qq125759748 2012-05-18
  • 打赏
  • 举报
回复
前面的都总结完了,+10086
zdj624489750 2012-05-18
  • 打赏
  • 举报
回复
先定义j狠简单 狠马虎的问题!!
百里千寻 2012-05-18
  • 打赏
  • 举报
回复
2L正解
hellogava 2012-05-18
  • 打赏
  • 举报
回复
在Java中成员变量的定义和赋值是分两步走的
首先是为所有成员变量分配空间,然后赋默认值。int类型默认值为0
然后如果再按顺序把你的赋值赋给此成员变量

在调用giveMeJ()给i来赋值时变量j的值为0,返回0并赋值给i,所以会输出00

可以在你的代码上稍作修改来验证

public class Example {
private int i = giveMeJ();
private int j = 10;

private int giveMeJ() {
System.out.println(i);//此处输出输出i发现为0,可以验证java是先赋了默认值的
System.out.print(j);
return j;
}

public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println((new Example()).i);
}

}



我们还可以通过javap来观察编译后的类文件,
public com.zls.Example(); //此处为Example的构造方法,看看里面做了什么
Code:
Stack=2, Locals=1, Args_size=1
0: aload_0
1: invokespecial #11; //Method java/lang/Object."<init>":()V
4: aload_0
5: aload_0
6: invokespecial #13; //Method giveMeJ:()I
9: putfield #17; //Field i:I//此处先为i赋值,调用giveMeJ得到的是分配空间时指定的默认值
12: aload_0
13: bipush 10
15: putfield #19; //Field j:I//此处才为j赋值
18: return
LineNumberTable:
line 3: 0
line 5: 4
line 7: 12
line 3: 18
LocalVariableTable:
Start Length Slot Name Signature
0 19 0 this Lcom/zls/Example;

public static void main(java.lang.String[]);
Code:
Stack=3, Locals=1, Args_size=1
0: getstatic #25; //Field java/lang/System.out:Ljava/io/PrintStream;
3: new #1; //class com/zls/Example
6: dup
7: invokespecial #42; //Method "<init>":()V
10: getfield #17; //Field i:I
13: invokevirtual #31; //Method java/io/PrintStream.println:(I)V
16: return
LineNumberTable:
line 17: 0
line 18: 16
LocalVariableTable:
Start Length Slot Name Signature
0 17 0 args [Ljava/lang/String;

}
[/code]
没详细看过jvm指令,不知道是否正确,一己之见
tracyqishan 2012-05-18
  • 打赏
  • 举报
回复
前面的都没错。
主要是声明变量的作用范围:局部变量 与 全局变量(用static声明)。
l_show 2012-05-18
  • 打赏
  • 举报
回复
前面的都说了问题所在了、、、
lij71 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
可以将 j 声明为static : private static int j = 10; ,这样的话当程序装在进内存就存在了
[/Quote]

正解,其实就是类的属性的定义的问题。
hugo000002020 2012-05-16
  • 打赏
  • 举报
回复

public class Example
{
private int i = giveMeJ(); //(2)
private int j = 10; //(3)

private int giveMeJ()
{
System.out.print(j); //你在这里加个断点然后你再一步步的走可以看到代码是怎么执行的 (1)输出完j的值再对i赋值,接着对j赋值
return j;
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
System.out.println((new Example()).i);
}

}




sffx123 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你调用方法的时候j还没有赋值呢吧
[/Quote]+1
八面山人 2012-05-15
  • 打赏
  • 举报
回复
前面的哥们正解,调用giveMeJ()方法时还没对里边变量j初始化
波杰克男 2012-05-15
  • 打赏
  • 举报
回复
可以将 j 声明为static : private static int j = 10; ,这样的话当程序装在进内存就存在了
wzz835414222 2012-05-15
  • 打赏
  • 举报
回复
因为你创建对象调用构造函数的时候只是初始化了i;j还没进行初始化
将j改为final类型的就可以了
haigejiang 2012-05-15
  • 打赏
  • 举报
回复

public class Example
{

private int j = 10;
private int i = giveMeJ();

private int giveMeJ()
{
System.out.print(j);
return j;
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
System.out.println((new Example()).i);
}

}


确实是你调用方法的时候还没有赋值,应为在调用方法时,他还没有
执行private int j = 10;
需要调换下位置
程序毕竟没有那么智能!
The_Long_Long 2012-05-15
  • 打赏
  • 举报
回复
先定义j,然后在定义i,就OK了.
public class Example {


private int j = 10;
private int i =getMj() ;
private int getMj()
{
return j;
}

public static void main(String[] args) {
System.out.println(new Example().i);
}
}
The_Long_Long 2012-05-15
  • 打赏
  • 举报
回复
你调用方法的时候j还没有赋值呢吧

50,549

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧