Challenges

Remember the rules for this are

  • Try to use only the information given up to this point in this book.
  • Try not to give up until you've given it a solid attempt

Challenge 1.

Write a class called Tree which extends ArrayList<Apple>.

Add a .grow() method which adds two apples to itself of arbitrary size.

record Apple(double size) {}

// CODE HERE

class Main {
    Tree tree = new Tree();
    tree.grow();
    tree.grow();

    // You should have inherited the toString
    // from ArrayList
    IO.println(tree);

    // As well as all the other methods
    tree.add(new Apple(100));
    IO.println(tree);

    for (var apple : tree) {
        IO.println(apple);
    }
}

Challenge 2.

Rewrite your Tree class from above to instead extend AbstractList<Apple>. You can find the documentation for AbstractList here.

Challenge 3.

Make an abstract class called Fish. It should provide a method named swim and a method named howLongSwim that returns how many times swim was called.

This

// CODE HERE

class Dory extends Fish {
    void justKeepSwimming() {
        IO.println("Just keep swimming");
        this.swim();

        IO.println("Just keep swimming");
        this.swim();

        IO.println("Just keep swimming");
        this.swim();

        IO.println("swimming");
        this.swim();

        IO.println("swimming");
        this.swim();
    }
}

class Main {
    void main() {
        var dory = new Dory();
        dory.justKeepSwimming();

        IO.println(dory.howLongSwim());
    }
}

Challenge 4.

Make the field you use to track how many times the fish swam protected. Also make the swim method protected and abstract.

Write comments in your code such that the "contract" between your class and classes implementing it is that they must keep the swam field up to date.

This

// CODE HERE

class Dory extends Fish {


    @Override
    void swim() {
        IO.println("Just keep swimming");
        this.swam++;

        IO.println("Just keep swimming");
        this.swam++;

        IO.println("Just keep swimming");
        this.swam++;

        IO.println("swimming");
        this.swam++;

        IO.println("swimming");
        this.swam++;
    }
}

class Main {
    void main() {
        var dory = new Dory();
        dory.swim();

        IO.println(dory.howLongSwim());
    }
}