当前位置: 首页 > 面试题库 >

为什么C#和Java要求所有内容都在一个类中?

孙才捷
2023-03-14
问题内容

似乎应该已经问过这个问题,但是搜索没有发现任何问题。

我一直想知道让我们将所有代码放入类或接口的意义何在。我似乎记得,要求main()像C这样的函数有一些优点,但对于类却没有。像Python这样的语言在某种程度上比Java更面向对象,因为它们没有基元,但是您可以将代码放在任何需要的地方。

这是对OOP的某种“误解”吗?毕竟,您可以像在C语言中一样编写过程代码,并将其放在类中,但是不会面向对象。


问题答案:

我认为要求所有内容都包含在类中的目标是 最大程度地减少 您需要使用该语言处理 的概念的数量
。在C#或Java中,您只需要了解对象模型(尽管相当复杂)。但是,只有类具有成员和类(对象)的实例。

我认为这是大多数语言尝试以一种或另一种方式遵循的一个非常重要的目标。如果C#有一些全局代码(例如,允许在不使用Main方法的情况下进行交互式评估和启动代码的规范),则您将需要学习另一种概念(顶级代码)。C#/
Java所做的选择当然只是获得简单性的一种方法。

当然,这是否是正确的选择是一个问题。例如:

  • 在功能语言中,程序是使用 类型 (类型声明)和 表达式 构造的。程序的主体只是一个被评估的表达式,这比带有Main方法的类要简单得多,并且它还支持交互式脚本编写(如Python)。

  • 在Erlang(和类似语言)中,程序被构造为同时执行的进程和一个启动其他进程的主进程。这是一种截然不同的方法,但是对于某些类型的应用程序来说很有意义。

通常,每种语言都有某种看待世界并建模的方式,并且在看待 所有事物
使用了这种观点。这在某些情况下效果很好,但我认为没有一个模型是完全通用的。这可能是混合多种范式的语言在当今非常流行的原因。

附带说明一下,我认为Main方法的使用有些争议(可能继承自C / C
++语言)。我想,更清晰的面向对象解决方案将是通过创建某个Main类的实例来启动程序。



 类似资料:
  • 问题内容: 我认为您可以在类中定义“ ”或“ ”,但是为什么都在django.utils.datastructures.py中定义。 我的代码: datastructures.py: 以及将在什么情况下致电。 谢谢 问题答案: 您可以定义一个或两个的和。 必须返回一个对象- 可以是一个新对象(通常将任务委派给该对象),一个现有对象(以实现单例,从池中“回收”实例,依此类推),甚至可以 不是 一个实

  • 问题内容: 根据JLS: 15.9.5匿名类声明编译器会自动从类实例创建表达式派生匿名类声明。 匿名类从不抽象(第8.1.1.1节)。匿名类始终是内部类(第8.1.3节);它永远不是静态的(第8.1.1节,第8.5.2节)。 匿名类始终是隐式最终的(第8.1.1.2节) 。 这似乎是一个特定的设计决定,所以它有一定的历史。 如果我选择上这样的课: 如果选择的话,为什么不允许我再次对其进行子类化?

  • 我如何优雅地检查这个? 现在我的方式是

  • 问题内容: 使用ant,maven和buildr有什么意义?在eclipse或netbeans中使用using构建会无法正常工作吗?我很好奇扩展构建工具的目的和好处是什么。 问题答案: 依赖管理 :构建工具遵循组件模型,该组件模型提供有关在哪里寻找依赖的提示。在Eclipse / Netbeans中,您必须依赖JAR,并且您实际上并不知道此JAR是否已更新。使用这些构建工具,它们“知道”依赖项中的

  • 我是否遗漏了包装类中的某些细节? 我有以下程序,在其中我定义了一个类,它包装并提供运算符: 我以为这会编译成同样的东西--它在做同样的计算,所有的东西都是内联的。 编辑-如果我使用而不是,它将产生相同的输出。 编辑-我发布了错误的ASM版本(而不是),因此本节没有帮助。 我在我的Mac电脑上使用Xcode的gcc,在一个64位系统上。除了for-loop的主体之外,结果是相同的。

  • 问题内容: 我在许多JavaScript简介中都读了很多。我只是不明白。我一直认为对象是具有方法和属性的东西。我了解数组,因为它具有键值对。“字符串”或“数字”或“函数”怎么样?上面列出的这些东西对我来说就像是功能。这意味着您输入了一些东西,然后得到了一些东西。您实际上并没有获得访问属性或其他任何内容。在数组或“对象”列表中没有使用点符号。 是否有人用点符号编写每个方法的示例示例,这些示例的方法和