Hey! I might be useful here! This is a good website for programming practice problems. They get tough pretty quick but worth looking at. Within the first ten problems you're covering staple programming practice stuff like arrays, functions, loops, and optimizing an algorithm (order of n^2 vs order of n operations nomsayin) and of course how to find errors when you make them. All solutions are available online in various blogs.
Also, this Java class at my high school gave us something to understand those main OOP concepts (polymorphism, encapsulation). It was called Grid World, basically a grid with creatures and things of different types on it.
So it had the abstract class GridWorld, and you use it to construct an object of type Grid(int width, int height) you dig? and you had an abstract class Critter, which had other classes below it like Bug, Lizard, stuff like that.
And for example objects of type Bug would run around in squares of width determined by the integer you put in the constructor like: Bug myBug = new Bug(5) or w.e.
There was some other things to it, like you could say bug.getRight() to return the object that was to the right of the bug on the grid, and in general it was a really good way to visually understand the high level concepts that OOP is based on.
Worst case have them dress up as numbers and act out sorting algorithms:D