Actually, compared to other languages, learning Java is about middling difficulty.
Pascal used to be used for teaching — it was designed to be a pedagogical language — and it was easy to learn. It wasn’t easy to use to build real things, until Turbo Pascal came along — and Delphi later — but those were no longer as easy to learn.
Practicality, it seems, is somewhat at odds with being easy.
BASIC used to be used for teaching, but had soooo many flaws and gotchas and general unpleasantness that it was best avoided, really. Now it’s essentially gone, and good riddance.
Python is the modern equivalent to BASIC. Everybody wants to learn Python, the same way everybody wanted to learn BASIC in the 1980s. Python seems easy to learn, but its simplicity is deceptive. Fundamental concepts like value representations, how types are handled, and pointers are mostly hidden.
If you never need to know them, you’re ok, but if you do need to know them, that lack of foundation knowledge can hold you back and cause confusion for years.
Then there are languages that are more difficult. Haskell and Lisp are sometimes taught as first languages, and they do seem to work for that — if you’re of a particular mindset. The temptation is to say “mathematical mindset”, but that’s not really accurate; they’re no more “mathematical” than other programming languages, but beginners often find them difficult.
It’s a lot to take in all at once.
Therefore, I suggest starting with C.
I like C for learning. It’s like looking into the machine with all the covers off, so you can see the moving parts. The standard library is simple, it doesn’t hide pointers and value representations, and it doesn’t occlude programming fundamentals behind a veneer of object orientation. When you learn C, you really learn the fundamentals of programming and only the fundamentals of programming, along with a good dose of machine foundations.
But once you’ve used C to learn programming, unless you plan to be a systems programmer, switch to something like Java or C#.
C has many gotchas that will eventually bite you if you’re not a systems programmer. More than anything, don’t use C as a business application development language. For that, it is the wrong tool for the job.
And having learned C, picking up Java or C# is easy.
By the way, Java and C# are so similar that they’re effectively different versions of the same language. C# has a few more language features and C# people really like them. Java people think they add unnecessary noise, but we’re really comparing apples to slightly different kinds of apples here.
Think of C# and Java as the same thing.
I’d argue that learning C first, followed by learning Java or C#, is easier than learning either Java or C# on its own.
So why is Java considered a hard programming language?
In short, it’s because Java has hugely extensive libraries and object orientation and all the complexity of a fully statically-typed programming language. It’s made for building industrial-quality software machinery, which means it’s an industrial tool that requires an industrial-level commitment to learning it.
That makes it inherently complex, and complexity makes anything hard.