2014-10-08 144 views
0

我大约在软件学士学位一个月,我们正在研究这个森林项目,我们有不同类型的树木(灰烬和山毛榉),它们以不同的速度增长。它们是普通类Tree的子类。将子类对象添加到ArrayList中

我的问题是现在我被要求将每种树(灰和山毛榉)的两棵树添加到ArrayList - 它们的int agedouble height应该都是不同的。我根本不能把我的头放在如何设置,所以任何建议/提示/解决方案非常感谢。

来源为Tree

public class Tree{ 

public int age; 
public double height; 

public void growOneYear() 
{ 
    age++; 
} 

public void show() 
{ 
    System.out.println("Træet er " +age+ " år gammelt og " +height+ " meter højt."); 
} 
} 

来源为Ash(几乎相同山毛榉)

public class Ash extends Tree { 

public Ash() 
{ 
    age = 1; 
    height = 1.0; 
} 

public void growOneYear() 
{ 
    super.growOneYear(); 
     if(height < 15){ 
      height = height*1.20; 
     } 
} 

public void show() 
{ 
    System.out.println("Ask: "); 
    super.show(); 
} 
} 

Screenshot of the structure

+0

看来,你会想仿制药和仿制药的集合。看这里:cs.nyu.edu/courses/spring12/CSCI-GA.3033-014/generics-tutorial.pdf – 2014-10-08 14:06:55

回答

1

考虑你已经在类的声明中extends Tree继承Tree,在这一点上,所有你需要为了存储所有的树木和Tree小号子类中TreeList s到做的基本上是创建列表,并将树添加到列表中。

public class Forest 
{ 
    private List<Tree> trees; 

    public Forest() 
    { 
     trees = new ArrayList<>(); //diamond syntax Java 7, ArrayList<Tree>() on Java 6 
    } 

    public void addTree(Tree tree) 
    { 
     trees.add(tree); 
    } 

    public void growTreesByOneYear() 
    { 
     for(Tree tree : trees) 
     { 
      tree.growOneYear(); 
     } 

     //you can do trees.stream().forEach(x -> x.growOneYear()); on Java 8 
    } 

    public void showTrees() 
    { 
     for(Tree tree : trees) 
     { 
      tree.show(); 
     } 
    } 
} 

public class MainClass 
{ 
    public static void main(String[] args) 
    { 
     Forest forest = new Forest(); 
     Ash ashTree = new Ash(); 
     Beech beechTree = new Beech(); 
     forest.addTree(ashTree); 
     forest.addTree(beechTree); 
     forest.show(); 
     forest.growTreesByOneYear(); 
     forest.show(); 
    } 
} 

我希望有帮助!

哦,为树 - 你或许可以提供一个构造函数参数的年龄和身高,并建立他们是这样的:

Ash ash = new Ash(5, 1.5); //age, height 

它将使用

public class Ash extends Tree 
{ 
    public Ash(int age, double height) 
    { 
     this.age = age; 
     this.height = height; 
    } 
} 

还是要说实话,是这样的更清楚:

public class Tree 
{ 
    public Tree(int age, double height) 
    { 
     this.age = age; 
     this.height = height; 
    } 
} 

public class Ash extends Tree 
{ 
    public Ash(int age, double height) 
    { 
     super(age, height); 
    } 
} 
+1

非常感谢你!明天再回来看看我是否应该遇到任何后续问题,但这很有道理。再次,非常感谢。 – Aphex 2014-10-13 00:16:12

1

使用继承。

申报Ash和使用Tree类应该让你的Tree对象添加到trees集合Beech对象。

Tree ash = new Ash(); 
Tree beech = new Beech(); 
ash.growOneYear(); 
beech.growOneYear(); 
trees.add(ash); 
trees.add(beech); 
0

我附上您说明一些代码;在评论中你应该理解的“关键词”是大写字母。

我的类与PACKAGE访问修饰符(实际上不是写入;不同的访问修饰符是PUBLIC,保护& PRIVATE),因为这允许我在一个源文件中有几个类。

我希望这可以帮助,你可以从中学到一些东西。如果我能帮忙,不要犹豫,问问。


import java.util.ArrayList; 


class Forest { 

    public ArrayList<Tree> trees = new ArrayList(); 

    public void initialize() { 
     // create and add 3 ashes on 3 different ways 
     Ash ash1 = new Ash(10,32.5);  
     Tree ash2 = new Ash(1,2.5); 
     this.trees.add(ash1);  // "this" references the current object, but 
     trees.add(ash2);   // as there is no local trees variable 
     trees.add(new Ash(3,12.0)); // defined the compilier picks the right one 
     trees.add(new Tree(1,1.0)); 
    } 

    public static void main(String[] args) { 
     Forest forest = new Forest(); 
     forest.initialize(); 
     for (Tree tree : forest.trees) { // FOR EACH loop 
      System.out.println(tree.getClass()+" Age: "+tree.age); 
     } 
    }    
} 


class Tree { 
    public int age; 
    public double height; 
    public Tree(int age,double height) { // CONSTRUCTOR - creates an the object 
     this.age=age;   // "this" references the current object, so in 
     this.height=height;  // this case the MEMBER VARIABLE is assigned 
    }       // the PARAMETER value 
} 


class Ash extends Tree { 
    public Ash(int age,double height) { 
     super(age,height);  // calls the constructor of the SUPERCLASS (Tree 
    }       // in this case with the PARAMETERs 
}