类中的字段不是类似于全局变量吗?

时间:2010-11-29 03:35:56

标签: java global-variables field

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

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

5 个答案:

答案 0 :(得分:3)

Class级变量是类的上下文中的全局变量。这是为了保持一些状态,你需要把它们放在某个地方。在某些情况下,Class级变量被认为是不好的做法,尤其是当它们不是不可变的时候。

答案 1 :(得分:3)

我认为“类变量”是指“静态变量”。

你问“他们不是所有类方法的全局变量吗?”。

是的,你是对的。在类中,行为像全局因素一样。

不同之处在于,您的课程不应该像整个课程一样复杂,因此更容易理解和解决由它们引起的问题。
代码越少,修改变量的情况就越少。 Globals可以通过任意未知代码进行修改。

在某些情况下,让类的所有实例共享变量(例如单例)也是绝对有意义的。你只需负责任地使用它。

你不应该使用它们吗? 不,你可以使用它们。但是将它们的可见性限制在所需的最小值,这样它们就不会成为“事实上的”全局变量 如果可能的话,也让它们成为最终的。

答案 2 :(得分:2)

我想说你不太了解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的窗口。

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

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

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

我希望我已经克服了你的疑虑。无论哪种方式,我建议你做一些关于面向对象编程的阅读,也许得到一本教授Java的书,重点关注面向对象(OO),尽管它不是一个难以理解的概念,但它可能很难如果你来自非OO背景,那就习惯它并用OO语言正确编程。

您可能想要了解BlueJ。它是一个Java IDE,它基本上迫使您理解和使用OO编程。这不是我建议使用太久的东西,但它可能是一个好的开始,直到你掌握了OO基础知识。

Zepee

答案 3 :(得分:1)

不,类字段不是全局变量,尽管它们可能被滥用于同样的目的。

可从每个范围访问全局变量。它们往往也可以在各个范围内写入。这使得大型代码库难以理解和调试。全局变量也会邀请nameclash。

类字段在类范围内。它们倾向于封装在具有私有访问权的类中,从而阻止从类外部访问。这限制了对一小部分代码的直接访问和修改。

答案 4 :(得分:0)

但是在Java中,整个程序不是使用单个类编写的。它是常量(公共静态最终字段),就像全局变量一样。 我的建议是你不要专注于java的这一部分,java的优点在于它作为一个整体提供什么。因为当你看到java的每个特性的传播时。