日期:2014-05-20  浏览次数:20686 次

新手提问,高手帮我看看这个程序
本人刚学JAVA,好多问题都不懂,希望各位高手不要嫌我提的问题太白痴,谢谢!

题目是这样的:创建一个简单的类。在第二个类仲,将一个引用定义为第一个类的对象。运用惰性初始化来实例化这个对象。

class Simple {
  String s;
  public Simple(String si) {
  s = si;
  }
  public String toString() {
  return s;
  }
  public void setString(String sNew) {
  s = sNew;
  }
}

class Second {
  Simple simple;
  String s;
  public Second(String si) {
  s = si; // 'simple' not initialized
  }
  public void check() {
  if(simple == null)
  System.out.println("not initialized");
  else
  System.out.println("initialized");
  }
  private Simple lazy() {
  if(simple == null) {
  System.out.println("Creating Simple");
  simple = new Simple(s);
  }
  return simple;
  }
  public Simple getSimple() { return lazy(); }
  public String toString() {
  return lazy().toString();
  }
  public void setSimple(String sNew) {
  lazy().setString(sNew);
  }
}

public class E03_Composition {
  public static void main(String args[]) {
  Second second = new Second("Init String");
  second.check();
  System.out.println(second.getSimple());
  second.check();
  System.out.println(second); // toString() call
  second.setSimple("New String");
  }
} ///:~

输出结果是:
not initialized
Creating Simple
Init String
initialized
Init String


我的问题是:第一个类Simple中,s = si是什么意思
各个return语句又是什么意思
能不能详细给我说下程序的执行过程?

------解决方案--------------------
第一个类Simple中,s = si是使用传递参数si为s初始化,否则s为null。
类Simple中toString()是重写了Object中的toString()方法,因此当执行System.out.println(second);时会自动执行toString()方法,并通过return返回自定义的内容s。
类Second的lazy()方法通过return返回一个已经初始化的Simple引用对象。
类Second的toString()方法和Simple的toString性质相同,也是返回自定义内容。只不过这个toString()方法其实返回的是Simple.toString返回出来的自定义内容,Simple是通过lazy()方法返回的对象。
执行过程:
Second second = new Second("Init String"); //自调用构造方法public Second(String si)
second.check();
//调用过程:second.getSimple()->second.lazy()(产生并初始化Simple对象)->Simple类toString()
System.out.println(second.getSimple()); 
second.check();
//调用过程:second.toString()->lazy()(产生并初始化Simple对象)->Simple类toString()
System.out.println(second);
//调用过程:second.setSimple(String sNew)->second.lazy()(产生并初始化Simple对象)->Simple类setString(String sNew)
second.setSimple("New String");
------解决方案--------------------
第一个类Simple中,public Simple(String si) { 
s = si; 

s = si在类的构造函数中,这个类在初始化中就会调用这个构造函数来初始化这个类,就是给si的值传递给s 
=======================================
关于return的含义:
你可以看到有return这个字样的每个方法都要求有个返回值,return表示返回这个值,而且可以看到return后的值都是和方法要求返回的类型是一样的