A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马林康 中级黑马   /  2012-6-21 16:05  /  2006 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马林康 于 2012-6-21 16:44 编辑
  1. public class Test {
  2.         private int i =getValue();
  3.         private int j =10;
  4.         int getValue(){
  5.                 return j;
  6.         }
  7.         public static void main(String[] args){
  8.                 System.out.println(new Test().i);
  9.         }

  10. }
复制代码
刚才把System.out.println(i)和System.out.println(new Test().i)两个搞混了 以为静态调用了非静态 ,但是还是不理解为什么输出0?

我明白了 先执行main函数 然后 创建对象 由上往下执行 i在j前面默认初始为 0

10 个回复

倒序浏览
主函数没有调用非静态的方法啊;i不是匿名对象new Test()调用的吗?
回复 使用道具 举报
邓杰 发表于 2012-6-21 16:13
主函数没有调用非静态的方法啊;i不是匿名对象new Test()调用的吗?

问错了 ,我是想问 结果怎么是 0 我该下题目
回复 使用道具 举报
因为你的  j  还没有初始化,JAVA自动初始化为0
回复 使用道具 举报
因为代码是从上往下执行的,你new Test()的时候先显式初始化private int i =getValue();   。 getValue();返回的j还没有显式初始化,也就是0.
回复 使用道具 举报
想得到结果为10,可以把private int j = 10; --> private static int j = 10;
回复 使用道具 举报
初始化顺序的问题,在调用getValue();还没有赋值为10。将 j 改为静态变量,在程序运行初期就加载。就能得到要的10咯。即
  1. private static int j = 10;
复制代码
或者将 j 的赋值语句放在第一句。即先将 j 赋值。再调用函数。
回复 使用道具 举报
邓杰 中级黑马 2012-6-21 16:39:06
8#
/*
这是因为 new Test()的时候、 JVM是按照顺序来进行初始化的;也就是先初始化 i 和j ;而它们的初始化又是先建立一个int的对象;int的默认被化为0, 也就这个时候i和j的值都为0;
然后才会按照你指定的值给i和j赋值; 这个时候再按顺序再次进行赋值;i=getValue();而getValue()返回的j
的值;注意这个时候j的值还没有你给它赋的10;而是默认的初始化值0;因为j=10;要等i=getValue()执行完;
才会执行嘛;所以这个你时候你打印的结果就是0;验证:你把i=getValue()放到j=10;的下面就会打印10;
*/
public class Test {

        private int i =getValue();
        private int j =10;
  //private int i =getValue();这样你就可以打印10;说明;i,j的初始化确实是按顺序执行的;

        int getValue(){

                return j;

        }

        public static void main(String[] args){

                System.out.println(new Test().i);

        }

}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
哥们这是你的代码我给你解释吧:
public class Test {
        private int i =getValue();
        private int j =10;
        int getValue(){
                return j;
        }
        public static void main(String[] args){
                System.out.println(new Test().i);
        }

}
程序先是进入入口(也就是主函数),去执行输出语句,
执行的时候就new了一个Test对象,然后进入Test类访问i属性,
访问的时候又调用了getValue()方法
注意了:调用的时候j是默认的0,所以打印出来的就是0了

这下懂了吧?

哥们我想问一下你那个代码是怎么粘上去的? 我弄了好长时间还不会...
回复 使用道具 举报
常佳杰 发表于 2012-6-21 18:42
哥们这是你的代码我给你解释吧:
public class Test {
        private int i =getValue();

先复制代码,看编辑框上面~~~~

图片 001.jpg (21.86 KB, 下载次数: 12)

图片 001.jpg

图片 001.jpg (23.87 KB, 下载次数: 13)

图片 001.jpg
回复 使用道具 举报
明白谢谢了老师 嘿嘿
{:soso_e113:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马