站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题System.out.println(sprinklers)输出toString()的返回字符串,没有人工赋值

System.out.println(sprinklers)输出toString()的返回字符串,没有人工赋值

摘要: System.out.println(sprinklers)输出toString()的返回字符串,没有人工赋值


代码如下:
class WaterSourse
{
private String s;
WaterSourse()
{
System.out.println("WaterSourse()");
s=new String("Constructed");
}
public String toString()
{
return s;
}
}

public class SprinklerSystem
{
private String valve1,valve2,valve3,valve4;
private WaterSourse source;
private int i;
private float f;
public String toString()
{
return
"valve1="+valve1+"/n"+
"valve2="+valve2+"/n"+
"valve3="+valve3+"/n"+
"valve4="+valve4+"/n"+
"i="+i+"/n"+
"f="+f+"/n"+
"source="+source;
}
public static void main(String []args)
{
SprinklerSystem sprinklers=new SprinklerSystem();
System.out.println(sprinklers);
}
}
能告诉我它的执行过程吗?


System.out.println(sprinklers)
//输出toString()的返回字符串,没有人工赋值,所以显示各类型默认值


呵呵 我觉的也是的


SprinklerSystem类中虽然有包含WaterSourse类,但只是定义,并没有实例化,所以上面的WaterSourse类基本没用到!

所以最后的显示如下:
valve1=null
valve2=null
valve3=null
valve4=null
i=0
f=0.0
source=null



还有详细点的说法吗?谢谢!


困扰了两天你就出10分。。。


they are all right,you do not give their values by yourself ,you can do follow;
class WaterSourse
{
private String s;
WaterSourse()
{
s=new String("Constructed");
System.out.println("WaterSourse()"+"/n"+s);

}
public String toString()
{
return s;
}
}

public class fds
{
private String valve1,valve2,valve3,valve4;
private WaterSourse source = new WaterSourse();

private int i;
private float f ;
// source = new WaterSourse();
public String toString()
{
return
"valve1="+valve1+"/n"+
"valve2="+valve2+"/n"+
"valve3="+valve3+"/n"+
"valve4="+valve4+"/n"+
"i="+i+"/n"+
"f="+f+"/n"+
"source="+source;
}
public static void main(String []args)
{
fds sprinklers=new fds();
System.out.println(sprinklers);
}
}



***********this is the result*********
WaterSourse()/nConstructed
valve1=null
valve2=null
valve3=null
valve4=null
i=0
f=0.0
source=Constructed



其实我真正不明白的是,Sprinklers 并没有调用toString()方法,但是为什么会执行呢?


当调用System.out.println输出一个类的对象的时候,
系统自动调用该类的toString()方法!




lz牛X,搞了两天才把自己的真正想法说出来。


你自己写了toString 方法把Object的toString 覆盖了,
System.out.println输出一个对象会自动调用toString,
你可以不覆盖,在输出对象,这时调用的是Object的toString,是个对象的地址



从main函数入手~根据内容一步步往下读你就知道是什么意思了
1、SprinklerSystem sprinklers=new SprinklerSystem();创建了个SprinklerSystem()的实例
看SprinklerSystem类中的代码。
2、分析SprinklerSystem,其中除了定义些参数外还有个方法是public String toString(),
定义参数应该很好理解,是吗?(参数中有个private WaterSourse source;和下面内容一起讲解)。
3、现在要搞懂toString()方法的作用,所有的类都是从Object继承而来的,SprinklerSystem因此也继承了toString()方法.public String toString()是重写了继承而来的该方法,toString()方法有什么作用呢?从java提供的帮助文档中得知: 返回该对象的字符串表示。继承而来的toString()方法的字符串是由类名、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。重写只后该类对象的字符串表示就是
"valve1="+valve1+"/n"+
"valve2="+valve2+"/n"+
"valve3="+valve3+"/n"+
"valve4="+valve4+"/n"+
"i="+i+"/n"+
"f="+f+"/n"+
"source="+source;
也就是所,在打印语句中你直接输入对象名他就会打印出上面内容的字符串。
4、搞懂了toString()方法后现在对里面的内容进行分析:前面的部分不说了很容易理解
关键在source="+source;这时调用了source对象,source是WaterSourse类的对象。
5、因此现在又分析WaterSourse中的代码:定义参数s,但没被初始化,因此他的内容为空(null).
6、下一句是“WaterSourse(){...}”语句块,对他进行分析:该语句块是个构造方法,在为类创建类的对象并用new对对象分配空间时自动调用。但在你的代码中只是WaterSourse source;创建了引用而没分配空间,因此构造方法不被调用。对s的赋值语句也被写在构造方法中,但构造方法没被调用所以s值依然为null。假如把private WaterSourse source改为private WaterSourse source= new WaterSourse();那么在分配空间时同时调用该类的构造方法,构造方法中的打印和赋值语句这是被执行。
7、该类的toString()方法我不多说了结合前面对SprinklerSystem类的分析应该能理解。
8、System.out.println(sprinklers),从字面理解就是打印sprinklers对象,其实就是调用sprinklers的toString()方法,和sprinklers.toString()是一个意思。
9、那么现在就又回到了刚才所讲的那些了。

全部代码分析完毕。
不知道你是否能理解,把自己看做是电脑,电脑的运行顺序是什么你就按什么顺序去分析代码。比如电脑从main函数入口,那么你就从main函数作为起点看。


↑返回目录
前一篇: sleep是线程类(Thread)的方法
后一篇: java.lang.NullPointerException