深圳幻海软件技术有限公司 欢迎您!

学习 Java 中最困难的部分以及如何克服它们

2023-02-28

今天,我们将看看Java编程基础中一些最难的领域,试图了解为什么很多人觉得它们很困难,以及是否有什么需要你做的。1.泛型Java中的泛型是具有参数的类型。创建泛型类型时,你不仅要指定类型,还要指定它将使用的数据类型。Java学习者经常提到泛型是Java最难理解的部分之一,当你有带参数的方法要遵循时,

今天,我们将看看 Java 编程基础中一些最难的领域,试图了解为什么很多人觉得它们很困难,以及是否有什么需要你做的。

1. 泛型

Java 中的泛型是具有参数的类型。创建泛型类型时,你不仅要指定类型,还要指定它将使用的数据类型。 Java学习者经常提到泛型是Java最难理解的部分之一,当你有带参数的方法要遵循时,这会容易得多,但当你必须编写自己的方法时会感到困惑。

提示和建议

Java 泛型做了 C++ 模板不做的一件事——实现类型安全。C++ 模板的实现是一个简单的预处理器技巧,并不能确保类型安全。Java 中的泛型类似于 C++ 模板,但具有额外的类型安全性。类型安全是任何良好开发环境的基本特征。

2. 多线程

Java中的多线程是同时执行两个或多个线程以实现应用程序最大利用CPU的过程。多线程解决了非常重要的任务,可以让我们的程序更快,通常快很多倍。但它被认为是许多新的 Java 学习者往往会陷入困境的主题之一。这一切都是因为多线程也会产生问题而不是解决问题。多线程会产生两个特定的问题:死锁和竞争条件。死锁是指多个线程都在等待彼此占有的资源,并且没有一个可以继续运行的情况。竞争条件是多线程系统或应用程序中的设计错误,其中系统或应用程序的操作取决于部分代码的执行顺序。

提示和建议

有一个简单的技巧,那就是使用精心设计的消息队列(不要自己滚动)在线程之间传递数据。困难的部分是尝试让多个线程以某种方式神奇地更新共享对象。那是它容易出错的时候,因为人们不注意存在的竞争条件。许多人不使用消息队列,而是尝试更新共享对象并为自己制造问题。变得困难的是设计一种在多个队列之间传递数据时运行良好的算法。这很难。但是共存线程的机制(通过共享队列)很简单。”

3. 类路径问题

类路径错误也被认为是 Java 开发人员在日常工作中面临的最受抱怨的问题之一。 “类路径问题的调试可能很耗时,并且往往发生在最糟糕的时间和地点:在发布之前,并且通常在开发团队几乎没有访问权限的环境中。它们也可能发生在 IDE 级别,并成为降低生产力的根源。

提示和建议

“类路径问题并不像最初看起来那样低级或难以解决。这完全是关于某些目录中存在/不存在的 zip 文件(jar)、如何找到这些目录以及如何在访问受限的环境中调试类路径。通过了解一些有限的概念,例如类加载器、类加载器链和父优先/父后模式,可以有效地解决这些问题,”专家解释说。

4. 多态性和正确使用

谈到 OOP 的原理,很多人说他们很难理解多态性。多态性是程序以相同方式处理具有相同接口的对象的能力,而无需有关对象特定类型的信息。尽管多态是一个相当基本的主题,但它相当广泛,并且构成了 Java 基础的很大一部分。对于许多学生来说,多态是学习 Java 的第一个难点。这一切都是因为在不同的上下文中使用了不同形式的多态性,这可能会造成混淆。

提示和建议

除了学习它之外,没有其他方法可以处理多态性。“简单的重载:+ 可以表示整数加法、浮点加法和(在某些语言中)字符串连接。子类型多态性:如果 B 是(继承自)A 的子类型,则 B 类型的任何值都可以在需要 A 类型值的上下文中使用。参数多态性:可以使用类型参数对类型进行参数化,这样你就可以在不同的上下文可以提供不同的类型参数,因此你将参数化类型实例化为不同的具体类型。这也称为“模板”或“泛型”,在 OO 语言中通常使用尖括号(例如 T)指定。接口多态。这基本上是一种机制,你将子类型多态性限制为实现某个接口的子类型或将参数多态性限制为实现某个接口的类型参数。”

5. 反射

反射是一种在程序运行时探索有关程序数据的机制。反射使你可以探索有关字段、方法和类构造函数的信息。它还允许你使用在编译时不存在但在运行时可用的类型。反射和用于发布错误信息的逻辑一致模型使得创建正确的动态代码成为可能。但是对于很多人来说,要弄清楚如何使用反射并不那么容易。

提示和建议

“在反射和 Java 的情况下,反射允许设计为静态类型的 Java 进行动态类型。动态类型本质上并不是邪恶的。它允许程序员打破某些 OOP 原则,但同时它允许许多强大的功能,如运行时代理和依赖注入。Java 让你可以使用反射击中自己的脚。但是,你必须非常明确地将枪对准你的脚,取下保险装置并扣动扳机。”

6. 输入/输出流

流允许你使用任何数据源:Internet、计算机的文件系统或其他东西。流是一种通用工具。它们允许程序从任何地方接收数据(输入流)并将其发送到任何地方(输出流)。他们的任务是相同的:从一个地方获取数据并将其发送到另一个地方。流有两种类型:输入流(用于接收数据)和输出流(用于发送数据)。使许多人难以理解使用流的原因是 Java 有多个 I/O 流类。

提示和建议

“Java 有这么多 I/O 流类,主要是由于两个促成因素。首先是遗产,由于历史原因,一些类仍然存在,并且由于它们不被认为是有害的,因此它们没有被弃用。第二,灵活性。不同的应用程序有不同的要求,因此,你有多种选择,具体取决于你的要求。有用的抽象在你阅读时会带来清晰性,并且只需几行代码,你就可以做很多事情。”