this is an interesting thread- although my degrees are in EE, I did almost the entire undergraduate and some of the master curriculum in CS at Stanford (there is a lot of cross-over)

the initial language courses are taught in C but you spend the whole time focused on abstraction and data structures- what you don't realise until a bit later is that although you've learned C, and all the mechanics of pointers and allocation and so on that come with it, you've really being building objects with setters and getters etc.- then when you get to Java the OO concept is a natural progression.

the other brilliant thing is that there are almost no courses about a specific language- the Java courses are really "object oriented programming" classes where java is just the tool to learn the concepts- you learn Perl in networking classes because its an easy language to interact with sockets, etc. in- you learn assembly in the OS classes because it is the right tool to figure out how operating systems run at the core level, interrupt driven programming and so on.

you come out knowing the concepts, and then learning an additional language is not a big deal because you have the core paradigms down