The course is for Java and I am finding myself really enjoying it and following along very well, but I have heard that Java is not a very good language. Why is that? I think I'd like to continue with programming after this course, so where should I go from here? (I'd like to be able to program some simple game ideas eventually as well as to be able to use programming for my work as a physicist).
It's not so much if Java is good so much as what Java is good for. This is my understanding of how Java got to where it is today.
Let me set aside the general tenor of startup-focused internet programming communities and how they don't like Java because it's perceived to be old and slow, and Oracle owns the IP and controls development behind it. It's better to explain how it got here.
It was adopted by IBM at a very critical juncture in the mid 90s, when they were deciding what programming language and environment they should be pushing for less experienced programmers in IT environments that wasn't as hard to use as C, C++ and friends. For that reason, Java's been a pretty critical mainstay of Fortune 500 IT departments and other "enterprise" domains, government software, that stuff. And most development around the language has focused on appealing to those customers.
Sun and IBM were major developers of software and mainframe solutions, and Java was widely adopted by their customers, because at the time they were also pushing to provide a very high level of support for their Fortune 500 customers. Oracle does this, as well. And when considering the future direction of the Java language, they've listen to those customers first and foremost.
So Java is very good about garbage collection, in preventing collection cycles that can show up in JavaScript and other languages with a less sophisticated garbage collector. But it's also not fine tuned out of the box for real time performance, and its legacy as a "better C++" with a focus on Simula-like objects in terms of language design make it a bit inflexible in some ways compared to Python and other scripting languages, and even C's function abstraction to some degree.
I don't consider "knowing Java" to be a handicap, but I do think at some point, it would be a good idea to learn other programming languages. Scripting languages like Python and Ruby and JavaScript (via Node.js) are popular in startups for server side applications. C++ is popular for certain kinds of games programming, but garbage collected, "managed" languages like C# (via Unity) and even Java can work in a pinch if your needs for real time graphics aren't so resource intensive. Vanilla C is kind of trendy in some settings, but few people use it for applications programming, it tends to be more popular when you're dealing with kernel extensions and more to the metal forms of programming. And if you plan on doing any kind of front end web programming, JavaScript with the same markup languages everybody else has to put up with is an absolute must.
And before I forget! Java can be used in mobile through native apps for Android, though you'll have to get used to the elaborate Android GUI frameworks and understanding how to keep your app fast on what amount to less powerful computers by keeping garbage collection cycles short. There's new things to learn for every platform, even if you use the same language. iOS has a similar dependency on its Objective-C frameworks, and much of the time spent in learning the platform amounts to learning how to leverage that toolkit, not really the language.
Think of each language in terms of the domain that it's best suited for. If you'd like, pick up something suited for the kind of job you plan on getting someday, or for what interests you. If you'd like to stick with Fortune 500 and enterprise, Java right out of college is fine, and even for indie games Java's perfectly fine, though it lacks a game dev environment as rich as Unity to really propel it forward. Android pushed Java a little bit out of the enterprise, but I consider mobile development to be different enough in terms of what you have to look for that it's not something you'll jump into immediately.
There's challenges everywhere to be overcome. Pick and choose what you want to solve, see how it goes, move on from there. You won't stop learning as a software developer, trust me.