Java 不是';类中的t字段类似于全局变量?

Java 不是';类中的t字段类似于全局变量?,java,global-variables,field,Java,Global Variables,Field,我开始学习函数式编程语言(SML),并用这种语言编程了一点。然后我开始检查Java,我有一种感觉,类字段看起来像全局变量,它们使编程复杂化。例如,我必须读取方法以查看哪个方法读取/写入它们等等 据我所知,在像C这样的编程语言中使用全局变量是个坏主意但是Java类字段呢,它们不是所有类方法的全局变量吗?使用字段是个坏主意吗?(或者可能我理解错了什么,或者我用“错误的方式”Java编程)但在Java中,整个程序不是使用单个类编写的。常量(公共静态最终字段)与全局变量类似。 我的建议是,不要把注意力集

我开始学习函数式编程语言(SML),并用这种语言编程了一点。然后我开始检查Java,我有一种感觉,类字段看起来像全局变量,它们使编程复杂化。例如,我必须读取方法以查看哪个方法读取/写入它们等等


据我所知,在像C这样的编程语言中使用全局变量是个坏主意但是Java类字段呢,它们不是所有类方法的全局变量吗?使用字段是个坏主意吗?(或者可能我理解错了什么,或者我用“错误的方式”Java编程)

但在Java中,整个程序不是使用单个类编写的。常量(公共静态最终字段)与全局变量类似。
我的建议是,不要把注意力集中在java的每一部分上,java的好处在于它作为一个整体提供了什么。因为那时你可以看到java的每一个特性的重要性。

不,类字段不是全局变量,尽管它们可能被误用到几乎相同的目的

全局变量可以从每个范围访问。它们往往也可以从每个范围写入。这使得大型代码库难以理解和调试。全局变量也会引发名称冲突


类字段位于类作用域中。它们倾向于封装在一个类中,具有私有访问权限,防止来自类外的访问。这将直接访问和修改限制在代码的一小部分

我想说,您不太了解Java(或任何其他面向对象语言)的工作方式

在面向对象语言中,类表示整个程序中可能需要的不同类型的东西。最好用一个例子来说明这一点。比如说,在你的计划中,你要做汽车模型

您将拥有一个Car类,并将创建Car类的一个新对象(一个新实例)来表示您需要的每一辆新车。汽车本身由不同的组件组成,您有车轮、电机、车窗等。因此,每个组件都有类,每个汽车对象都包含来自所有不同类的自己的对象集,即:

Car1 {
       motor1
       window1.1, window1.2
       wheel1.1,wheel1.2
}

Car2 {
       motor2
       window2.1, window2.2
       wheel2.1,wheel2.2
}
在本例中,您可以将每个汽车组件定义为类字段。这些字段适用于所有“全局”效果,因为它们可以从该类中的任何方法访问。您似乎缺少的细节是该类的每个新对象都有自己的字段和方法集。它们不共享它们,因此每个电机、一组车轮等都属于汽车类的一个实例。因此,如果在car类中有一个名为deleteWindows()的方法,该方法将删除所有窗口,并且在car2上调用了该方法,则不会删除car1的窗口

另一个重要的细节是,您可以使用几个“前缀”(方法)定义这些变量。首先,你有公共和私人(受保护的,但我不会进入那个)。通过将变量声明为private,您可以说唯一可以访问和更改该变量的对象是拥有该变量的对象。另一方面,公共变量可以被任何其他对象访问和更改。它们是可访问的,但您必须明确表示希望更改该对象的变量(通过编写objectsName.variable,在本例中是car1.motor)

您还可以拥有由类的所有实例共享的变量/方法。要做到这一点,您需要将它们声明为静态的(它们实际上属于该类,而不是特定于该类的任何对象)。私有/公共仍然适用,私有静态变量只能由该类的实例(以及同一类的静态方法)访问,而公共变量可以由任何其他类/对象访问。为了从它们所属的类之外访问它们,可以使用ClassName.variable/method(在前面的示例中是so Car.variable)

有时,您可能希望拥有一个创建的实例毫无意义的类。我发现我经常需要创建一个数学类,其中包含几个我希望在整个程序中使用的数学运算符。创建数学对象毫无意义,因此您只需将其所有方法定义为“publicstatic”,并在其他类中随时访问它们

我希望我已经消除了你的疑虑。无论哪种方式,我都会建议您阅读一些面向对象编程方面的书籍,也许会读一本教Java的书,书中一开始就非常关注面向对象(OO),因为尽管这不是一个很难理解的概念,但如果您来自非OO背景,可能很难习惯它并正确地使用OO语言编程

你可能想调查一下BlueJ。它是一个JavaIDE,基本上迫使您理解和使用OO编程。我不建议将其使用太久,但在您掌握OO基础知识之前,它可能是一个很好的起点


Zepee

级别变量是类上下文中的全局变量。这样做是为了保持某种状态,你需要把它们放在某个地方。在某些情况下,
级别变量被认为是不好的做法,尽管它们不是不可变的。

我假设“类变量”是指“静态变量”

您会问“对于您的所有类方法,它们不是类似于全局变量吗?”

是的,你说得对。在类中,所有问题的行为都像全局人一样

不同之处在于,您的类不应该像整个程序那样复杂,因此更容易理解和修复由它们引起的问题。
代码越少,就可以修改变量,从而减少你必须考虑的情况。全局变量可以由任意未知代码修改

在某些情况下,让一个类的所有实例共享一个变量也是绝对有意义的