黑马程序员技术交流社区

标题: 输出结果求解释?????? [打印本页]

作者: 汪璨    时间: 2012-6-24 16:14
标题: 输出结果求解释??????
public class test {

    private int i=getValue();
    private int j = 10;
    int getValue(){
        return j;
    }
    public static void main(String[] args) {
        
        System.out.print(new test().i);

    }

}

为什么输出结果为0???
作者: 乐峰    时间: 2012-6-24 16:33
因为对象实例化的时候先从i开始取值就调用了getvalue()方法,而该方法里面的成员变量j的初始值是0,所以方法的返回值也是0,那么对象实例化调用成员变量i的话,其值也是0.
作者: 彭盼    时间: 2012-6-24 16:37
新建对象new Test()后,对象会对变量进行初始化,你的程序中i的赋值放在第一句,此时程序还没有读到j的值
所以后来返回默认值零。
你要获得J的值应该直接在主函数新建对象,然后调用getValue()获得或者你要把i与j换个位置:
public class NewTest {
    private int j = 10;
    private int i=getValue();
     int getValue(){
        return j;
    }
    public static void main(String[] args) {
        
        System.out.print(new NewTest().i);
    }
}
这样就行了
作者: 赵庆礼    时间: 2012-6-24 16:58
java是逐行解释,打印new test().i时,先执行private int i=getValue(),但是该函数返回的值j还没有被赋值,java中整型默认为0,所以打印的结果是0.
作者: 赵庆礼    时间: 2012-6-24 16:58
java是逐行解释,打印new test().i时,先执行private int i=getValue(),但是该函数返回的值j还没有被赋值,java中整型默认为0,所以打印的结果是0.
作者: 张华廷    时间: 2012-6-24 17:21
对象实例化从i开始取值就调用了getvalue()方法,该方法成员变量i的初始值是0,所以方法的返回值也是0,那么对象实例化调用成员变量i的话,其值也是0.
改为下面的可以
public class Test {

        private int j = 10;
    private int i=getValue();
     int getValue(){
        return j;
    }
    public static void main(String[] args) {
        
        System.out.print(new Test().i);
    }
}

作者: 马超    时间: 2012-6-24 17:36
你原来的:
package com.itcast.test;

class test
{
        public int i=getValue();        public int j = 10;  注意这一句
        public int getValue()
        {
                return j;
        }
}       
public class P
{
        public static void main(String[] args)
        {
                System.out.println(new test().i);
        }

}

我改过的:
package com.itcast.test;

class test
{
        public int j = 10;
        public int getValue()
        {
                return j;
        }
        public int i=getValue();}        注意这一句
public class P
{
        public static void main(String[] args)
        {
                System.out.println(new test().i);
        }

}

初始值为0,在对 j 进行赋值之前你就将默认的初始化0给了i,所以 i 就是0.


作者: 常佳杰    时间: 2012-6-24 17:53
当你 new Test()的时候,先初始化 i 和j ;而它们的初始化又是先建立一个int的对象,int的默认初始化为0,i和j就都是0了...
接下来才按顺序再次进行赋值;i=getValue();而getValue()返回的j的值;因为是按顺序执行的所以执行完getValue()后才执行 j=10;
当你执行getValue()时j还是默认的初始化值0,所以打印出来的结果就是0了...
总结: java虚拟机是按照顺序来进行初始化的
作者: 谭立文    时间: 2012-6-24 18:30
当我们实例化一个类时,类体中的代码将会被一条一条执行。如:
public class Test
{  
    private int i = getI();
    private int j = getJ();
    private int k = getK();
    int getI()
    {
            System.out.println("得到i的值");
        return 1;
    }
    int getJ()
    {
            System.out.println("得到j的值");
        return 2;
    }
    int getK()
    {
            System.out.println("得到k的值");
        return 3;
    }
    public static void main(String[] args) {
        Test test = new Test();
    }

}
你会发现输出的分别是:
得到i的值
得到j的值
得到k的值
在你的程序中你先定义了 private int i=getValue();     同时调用方法getValue();将j的值返回并赋值给i,此时j的定义在i之后程序根本还没有对j进行初始化处理,所以返回给i的值为0。
若改为:
public class test {

   
    private int j = 10;
    private int i=getValue();
    int getValue(){
        return j;
    }
    public static void main(String[] args) {
        
        System.out.print(new test().i);

    }

}
输出的则为10
作者: 周朋飞    时间: 2012-6-24 18:33
楼上说的对,当你创建一个对象的时候,需要对其进行赋值,你的这个调用是无惨的构造函数,所以默认值都会是0,你程序执行到new NewTest().i得时候还没有对j进行赋值呢,你调换一下 对i和j的定义的顺序你想要的结果就出来了
作者: 周朋飞    时间: 2012-6-24 18:33
楼上说的对,当你创建一个对象的时候,需要对其进行赋值,你的这个调用是无惨的构造函数,所以默认值都会是0,你程序执行到new NewTest().i得时候还没有对j进行赋值呢,你调换一下 对i和j的定义的顺序你想要的结果就出来了
作者: 周朋飞    时间: 2012-6-24 18:35
楼上说的对,当你创建一个对象的时候,需要对其进行赋值,你的这个调用是无惨的构造函数,所以默认值都会是0,你程序执行到new NewTest().i得时候还没有对j进行赋值呢,你调换一下 对i和j的定义的顺序你想要的结果就出来了
作者: 周朋飞    时间: 2012-6-24 21:55
楼上说的对,当你创建一个对象的时候,需要对其进行赋值,你的这个调用是无惨的构造函数,所以默认值都会是0,你程序执行到new NewTest().i得时候还没有对j进行赋值呢,你调换一下 对i和j的定义的顺序你想要的结果就出来了
作者: 周朋飞    时间: 2012-6-24 21:55
楼上说的对,当你创建一个对象的时候,需要对其进行赋值,你的这个调用是无惨的构造函数,所以默认值都会是0,你程序执行到new NewTest().i得时候还没有对j进行赋值呢,你调换一下 对i和j的定义的顺序你想要的结果就出来了
作者: oracleserver    时间: 2012-6-24 23:40
你是在eclipse中运行的吧!一般来说在cmd里面很少出现你这种情况的。要是你是在eclipse中运行出现的。
我们用javac编译JAVA文件时,javac不会智能到猜出你所要编译的文件是什么编码类型的,所以它需要指定读取文件所用的编码类型。默认 javac使用平台缺省的字符编码类型来解析JAVA文件。平台缺省编码是操作系统决定的,我们使用的是中文操作系统,语言区域设置通常都是中国大陆,所以平台缺省编码类型通常是GBK。这个编码类型我们可以在JAVA中使用Properties pro=System.getProperty(),pro. getProperty(“file.encoding”)来查看。所以javac会默认使用GBK来解析JAVA文件。如果我们要改变javac所用的编码类型,就要加上-encoding参数,如javac -encoding utf-8 Test.java。
这里要另外提一下的是eclipse使用的是内置的编译器,并不能添加参数,如果要为javac添加参数则建议使用ANT来编译。不过这并非出现乱码的塬因,因为eclipse可以为每个JAVA文件设置字符编码类型,而内置编译器会根据此设置来编译JAVA文件。
- 运行:编译后字符数据会以UNICODE格式存入字节码文件中。然后eclipse会调用java命令来运行此字节码文件。因为字节码中的字符总是 UNICODE格式,所以java读取字节码文件并没有编码转换过程。虚拟机读取文件后,字符数据便以UNICODE格式存储在内存中了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2