- portability is not a high priority.
- garbage collection is not a high priority.
Those are 2 reasons why you don't want to start with Java. You can teach it later, sure. But it's not a good start.
Here I disagree. I would not start teaching programming in a manual memory language (though that is how I started) because memory corruption is really hard to deal with and completely inconsequential to the basics of programming.
I do think it's important that every programmer should know how to work with raw memory and pointers, but it is a good subject for an intermediate class, after you have the basics of what you are supposed to do while programming.
And then over the next few years it would be great to dissect this. CPU, ALU, ASM, raw memory, network basics, IP (BGP ~ distance vector routing), TCP, buffers, syscalls. RDBMS, MVCC, B-trees, merge sort, heap sort, and so on.
Oh well, one can dream. But usually students are just bombarded with completely disconnected courses.
1. Java enums
2. Java's generics, especially covariance/contravariance with wildcards (erasure really isn't as bad as people make it out to be)
3. Java's standard collections library
4. Java's method override rules (lets you extend return types on derived classes)
5. Default interface methods (.Net has them too now, but Java was first)
6. @Functional interfaces. They may seem a bit funny at first, but they are very useful (especially when combined with default interface methods)