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

java clone


package CloningObject;
//: appendixa:CopyConstructor.java
//From 'Thinking in Java, 2nd ed.' by Bruce Eckel
//www.BruceEckel.com. See copyright notice in CopyRight.txt.
//A constructor for copying an object of the same
//type, as an attempt to create a local copy.

class FruitQualities {
private int weight;
private int color;
private int firmness;
private int ripeness;
private int smell;
// etc.
FruitQualities() { // Default constructor
 // do something meaningful...
}
// Other constructors:
// ...
// Copy constructor:
FruitQualities(FruitQualities f) {
 weight = f.weight;
 color = f.color;
 firmness = f.firmness;
 ripeness = f.ripeness;
 smell = f.smell;
 // etc.
}
}

class Seed {
// Members...
Seed() { /* Default constructor */ 

System.out.println("seed Constructor");
}
Seed(Seed s) { /* Copy constructor */

}
@Override
public String toString() {
// TODO Auto-generated method stub
return "seed";
}
}

class Fruit {
private FruitQualities fq;
private int seeds;
private Seed[] s;
Fruit(FruitQualities q, int seedCount) { 
 fq = q;
 seeds = seedCount;
 s = new Seed[seeds];
 for(int i = 0; i < seeds; i++)
   s[i] = new Seed();
}
// Other constructors:
// ...
// Copy constructor:
Fruit(Fruit f) {
 fq = new FruitQualities(f.fq);
 seeds = f.seeds;
 System.out.println("seeds = " +seeds);
 // Call all Seed copy-constructors:
 for(int i = 0; i < seeds; i++)
 {
 
  s[i] = new Seed(); 
  }
 // Other copy-construction activities...
}
// To allow derived constructors (or other 
// methods) to put in different qualities:
protected void addQualities(FruitQualities q) {
 fq = q;
}
protected FruitQualities getQualities() {
 return fq;
}
}

class Tomato extends Fruit {
Tomato() {
 super(new FruitQualities(), 100);
}
Tomato(Tomato t) { // Copy-constructor
 super(t); // Upcast for base copy-constructor
 // Other copy-construction activities...
}
}

class ZebraQualities extends FruitQualities {
private int stripedness;
ZebraQualities() { // Default constructor
 // do something meaningful...
}
ZebraQualities(ZebraQualities z) {
 super(z);
 stripedness = z.stripedness;
}
}

class GreenZebra extends Tomato {
GreenZebra() {
 addQualities(new ZebraQualities());
}
GreenZebra(GreenZebra g) {
 super(g); // Calls Tomato(Tomato)
 // Restore the right qualities:
 addQualities(new ZebraQualities());
}
void evaluate() {
 ZebraQualities zq = 
   (ZebraQualities)getQualities();
 // Do something with the qualities
 // ...
}
}

public class CopyConstructor {
public static void ripen(Tomato t) {
 // Use the "copy constructor":
 t = new Tomato(t); 
 System.out.println("In ripen, t is a " +
   t.getClass().getName());
}
public static void slice(Fruit f) {
 f = new Fruit(f); // Hmmm... will this work?
 System.out.println("In slice, f is a " +
   f.getClass().getName());
}
public static void main(String[] args) {
 Tomato tomato = new Tomato();
 System.out.println("test1");
 ripen(tomato); // OK
 System.out.println("test2");
 slice(tomato); // OOPS!
 GreenZebra g = new GreenZebra();
 ripen(g); // OOPS!
 slice(g); // OOPS!
 g.evaluate();
}
} ///:~


java编程思想的一个例子,会有空指针异常出现,什么原因?