2010-11-29 60 views
7

我开始学习一种功能性编程语言(SML),并用这种语言编写了一点。然后我开始检查Java,并且我有这样的感觉,即类字段看起来像全局变量,它们使编程复杂化。例如,我必须阅读方法,看看哪一个读/写他们等类中的字段是否与全局变量类似?

从我听到在编程语言像C使用全局变量是一个坏主意。 但是,Java类字段呢,它们不是像所有类方法的全局变量那样吗?使用字段是不好主意吗? (或者,也许我已经了解错误的东西或我在“错误的方式”Java编程)

回答

0

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

1

不,类字段不是全局变量,虽然它们可能会被滥用于相同的目的。

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

类字段在类范围内。他们往往被封装在一个班级,私人访问,防止从课堂以外的访问。这限制了对小部分代码的直接访问和修改。

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对象是没有意义的,因此您只需将其所有方法定义为“公共静态”,并在您需要的其他类中访问它们。

我希望我已经让你怀疑。无论哪种方式,我建议你阅读一下面向对象的程序设计,或许可以找一本教授Java的书,重点关注面向对象(OO),尽管这不是一个难以理解的概念,但可能很难如果你来自非OO背景,那么习惯它并正确地用OO语言进行编程。

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

Zepee

+0

我知道静态和非静态字段之间的差异,并且每个对象都有自己的状态。让我以其他方式说。假设你在一个基本上有很多函数的文件中有2000行C代码,在这个文件中使用这些函数将使用的全局变量是否好?据我所知,答案是否定的(因为你不知道哪些函数写/读每个全局变量)。同样的情况发生在类上,一个类可以有2000行代码,在这个类的作用域中,这些字段就像全局变量。是不是像C代码示例这样的坏事? – 2010-11-29 20:13:53

+0

我在OO语言之外没有那么多的经验,但是它似乎是你指出的问题,不知道什么改变了它自身适用于公共变量的事实。您应该担心哪些对象可以直接访问并更改变量。这是面向对象封装的基本原则之一,它说明对象/类只应该知道其他事情做什么,但不知道它们是如何做的。因此,通常的做法是将领域设置为私人领域,并且仅在每个对象可以控制对外部世界的透明度的地方提供获取者/设置者。 – Zepee 2010-11-30 04:28:22

+0

但是,每个课程都需要完全透明。即使你不知道你的长相,你的存在有多好?换句话说,没有类变量,你会如何区分对象A和对象B? 你不应该担心你的对象有几种方法访问它的字段,只有其他对象访问它的字段。 类变量不仅不坏,因为它们是必需的,它们定义了一个对象,并且能够拥有一个具有它自己的一组属性的类的多个实例,这正是为什么OO语言首先被创建的原因。 – Zepee 2010-11-30 04:31:12

3

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

3

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

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

是的,你是对的。在课堂上,他们的表现就像全局问题一样。

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

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

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