如你所知,我们建议编码初学者使用 Java 开始学习编程语言,CodeGym 无所不包,即使对准备不充分的学生来说,也可以让学习 Java 的过程如履平地。
但是,尽管游戏化元素、轻松的故事和有趣的角色有助于简化学习过程,但对于大多数初学者来说,全面学习 Java 的基础知识很少没有波折。
今天我们了解下 Java 编程基础中一些最难的领域,试着理解下为何让许多人觉得很难,以及是否有什么方法可以帮助你掌握这些内容。
![卡住了?学习 Java 最难的部分以及如何解决 - 1]()
1.泛型
在 Java 中,泛型是带有参数的类型。在创建泛型类型时,不仅要指定类型,还要指定它将使用的数据类型。
Java 学习者经常提到泛型,认为它是 Java 中最难理解的部分之一。
“我的主要问题仍然是处理泛型。当你使用带参数的方法时,事情就简单多了,但当你不得不自己编写代码时,事情就变得混乱了”,一位匿名的 Java 学习者说。
提示和建议
这是 Ravi Reddy 对 Java 中泛型的
观点, Ravi Reddy 是一位经验丰富的程序员和大学教授:“Java 泛型做了 C++ 模板没有做到的事情 — 实现类型安全性。C++ 模板的实现是一个简单的预处理器技巧,并不能确保类型安全。Java 中的泛型类似于 C++ 模板,但具有额外的类型安全。依我看,类型安全是任何优秀开发环境所具有的基本特征。
而且,我们在脑子中一会是参数,一会是类型,这就会出现混淆的情况。但我相信花时间去掌握是值得的。因为一旦我理解了接口和泛型,我发现自己以 Java 的方式来‘思考’就大有裨益。"
2.多线程
Java 中的多线程是并发执行两个或多个线程的过程,以实现应用程序对 CPU 的最大利用率。
多线程解决了非常重要的任务,可以让我们的程序运行得更快,常常是快数倍。但这是很多 Java 新手卡主不前的主题之一。这都是因为多线程还会制造问题,而不是解决问题。
多线程会产生两个特定的问题:死锁和争用条件。死锁是多个线程都在等待彼此持有的资源且无任何线程能够继续运行的情况。争用条件是多线程系统或应用程序中的设计错误,其中系统或应用程序的运行取决于部分代码的执行顺序。
提示和建议
就如何处理多线程,StackExchange(一个常用的问答网站)的软件架构师和活跃用户 S.Lott 提供了不错的
建议。“多线程非常简单。为应用程序实现多线程非常非常简单。可以使用简单的技巧,即使用一个设计良好的消息队列(不要自己创建)在线程间传递数据。难的是尝试让多线程以某种方式神奇地更新一个共享对象。此时就很容易出错,因为人们没有注意到存在争用情况。许多人不使用消息队列并尝试更新共享对象,这会自行制造问题。而难点是设计一种在几个队列之间传递数据时可有效工作的算法。这很难。但是(通过共享队列)共存线程的机制很简单。”
![卡住了?学习 Java 最难的部分以及如何解决 - 2]()
3.类路径问题
类路径错误也被认为是 Java 开发人员在日常工作中抱怨最多的问题之一。
“调试类路径问题可能很耗时,往往发生在最糟糕的时间和地点:在发布之前,通常发生在开发团队很少或根本没有访问权限的环境中。这些问题还会发生在 IDE 级别并且会成为降低生产力的原因之一”,资深 Java/Javascript 开发人员和与编程有关的教程作者 Vasco Ferreira
说 。
提示和建议
“咋一看,类路径问题并非那么低级或难以解决。不过就是关于 zip 文件 (jar) 在某些目录中存在/不存在,如何找到这些目录,以及如何在访问受限的环境中调试类路径的问题。通过了解有限的一些概念,如类加载器、类加载器链和父类优先/父类最后模式,这些问题可以被有效地解决”,专家解释道。
4.多态和正确使用
当谈到面向对象编程的原则时,许多人都表示很难理解多态。
多态是程序以相同的方式处理具有相同接口的对象的能力,而不需要关于对象的具体类型的信息。尽管多态是一个很基础的概念,但这个概念使用非常广泛,而且是构成 Java 基础的重要部分。对于许多学生来说,多态是学习 Java 时遇到的第一个难题。这都是因为在不同的上下文中使用了不同形式的多态,这可能会令人困惑。
提示和建议
除了学习之外,在使用多态方面没有捷径。下面是 Copenhagen 大学讲授编程课程的 Torben Mogensen 对此概念的
解释:“简单重载:+可以表示整数加法、浮点加法和(在某些语言中)字符串连接。子类型多态:如果 B 是 A 的子类型(继承自 A),则 B 类型的任何值都可以在预计 A 类型的值的上下文中使用。
参数多态:类型可以用类型参数进行参数化,这样,在不同的上下文中,你可以提供不同的类型参数,因此,你可以将参数化的类型实例化为不同的具体类型。这也称为“模板”或“泛型”,在面向对象语言中通常使用尖括号(如 T<A >)来指定。接口多态。基本而言,这是一种这样的机制:你将子类型多态限制为实现特定接口的子类型,或者将参数多态限制为实现特定接口的类型参数。”
5.反射
反射是一种在程序运行时探索程序数据的机制。反射可用于探索关于字段、方法和类构造方法的信息。反射还支持你处理编译时不存在的类型,但该类型在运行时会变得可用。反射和发布错误信息的逻辑一致模型支持创建正确的动态代码。但对于许多人来说,想弄清楚如何使用反射并不那么容易。
提示和建议
“如果在 Java 中使用反射,则反射支持 Java 动态指定类型,而 Java 原本是通过静态方式指定类型的。动态指定类型本身并不是一件不好的事情。它支持程序员打破某些面向对象编程原则,但同时它允许使用许多强大的功能,如运行时代理和依赖性注入。Java 让你使用反射射你的脚。不过,你必须直接把枪瞄准你的脚,打开保险,扣动扳机”, 资深 Java 程序员和应用程序架构师 Jayesh Lalwani
解释道。
6.输入/输出流
流可让你使用任何数据源:互联网、计算机的文件系统或其他数据源。流是一个通用的工具。程序使用流可以从任何地方接收数据(输入流),并将数据发送到任何地方(输出流)。流的任务都相同:从一个地方获取数据并将其放到另一个地方。流有两种类型:输入流(用于接收数据)和输出流(用于发送数据)。
对于使用流,很多人难以理解的是 Java 有多个 I/O 流类。
提示和建议
“Java 有这么多的 I/O 流类,主要是两个原因。第一个是遗留。由于历史原因,一些类仍然存在并未被废弃,因为留下有没害处。第二是灵活性。不同的应用程序有不同的要求,因此,按照你的要求,你可以进行多种选择。有用的抽象在你阅读时会让你窥斑见豹,少数几行代码就可以做很多事情”, 瑞典的 Java 专家 Jonas Mellin
说。
你觉得 Java 的哪些方面最难理解或者有一段时间进展不大?请在评论中分享你的体验。
Lihu Zhai
Software Architect 位于 Ruijie Networks
Lihu is a back-end developer and specializes in service-oriented system architecture.
His professional life has been 100% driven ...
[阅读完整的传记]
GO TO FULL VERSION