Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态方法和静态变量,糟糕的设计实践?_Java_Oop_Static - Fatal编程技术网

Java 静态方法和静态变量,糟糕的设计实践?

Java 静态方法和静态变量,糟糕的设计实践?,java,oop,static,Java,Oop,Static,可能重复: 几年前在大学里学习过面向对象编程和设计,我记得讲师们对使用静态变量或静态方法的人非常生气,因为他们把静态描述为一种非常糟糕的设计 我的理解是 静态类型的东西,是获得全局“愿景”的东西,即它可以被任何东西访问 我的理解正确吗?是否有关于使用static的信息导致其使用不当?有没有办法避免在代码中使用静态变量或方法 顺便说一句,我知道主方法的静态是应用程序成功运行的先决条件。静态变量或方法没有错。只是在OOP中,您希望尽可能多地将行为与对象关联起来,这意味着使用实例方法和变量。话虽如此

可能重复:

几年前在大学里学习过面向对象编程和设计,我记得讲师们对使用静态变量或静态方法的人非常生气,因为他们把静态描述为一种非常糟糕的设计

我的理解是 静态类型的东西,是获得全局“愿景”的东西,即它可以被任何东西访问

我的理解正确吗?是否有关于使用static的信息导致其使用不当?有没有办法避免在代码中使用静态变量或方法


顺便说一句,我知道主方法的静态是应用程序成功运行的先决条件。

静态变量或方法没有错。只是在OOP中,您希望尽可能多地将行为与对象关联起来,这意味着使用实例方法和变量。话虽如此,在某些特定情况下,静态成员是必需的:构造函数(如您所提到的)和单例模式就是很好的例子。

静态变量或方法没有错。只是在OOP中,您希望尽可能多地将行为与对象关联起来,这意味着使用实例方法和变量。话虽如此,在某些特定情况下,静态成员是必需的:构造函数(如您所述)和单例模式就是很好的例子。

静态主要用于访问类成员而不创建类实例。正如您所知,我们为什么要编写
publicstaticvoidmain()
只要在运行时使用bcoz,jvm就可以访问此方法,而无需创建类对象并启动程序

这取决于您的需求,即您如何使用或说如何使用访问说明符将类的成员声明为private、public、default和protect作为访问级别,而static用于将其作为访问级别的static

如果没有static,您必须将您的成员声明为public,或者如果您继承了您的类,那么也必须将其声明为protected。与在同一个包中一样,您定义了类,然后只是静态地继承该类。对于不使用inhert类的情况,您需要创建该类的对象,然后可以访问这些成员(请注意,它基于访问说明符)

以下是链接以了解更多详细信息


静态主要用于访问类成员而不创建类实例。正如您所知,我们为什么要编写
publicstaticvoidmain()
只要在运行时使用bcoz,jvm就可以访问此方法,而无需创建类对象并启动程序

这取决于您的需求,即您如何使用或说如何使用访问说明符将类的成员声明为private、public、default和protect作为访问级别,而static用于将其作为访问级别的static

如果没有static,您必须将您的成员声明为public,或者如果您继承了您的类,那么也必须将其声明为protected。与在同一个包中一样,您定义了类,然后只是静态地继承该类。对于不使用inhert类的情况,您需要创建该类的对象,然后可以访问这些成员(请注意,它基于访问说明符)

以下是链接以了解更多详细信息


使用静态变量的主要合法理由是

单例的访问器方法,特别是使用的方法,需要静态方法


关于单例没有什么“不好”的。

使用静态变量的主要合法理由是,没有其他方法可以做到这一点

单例的访问器方法,特别是使用的方法,需要静态方法


关于单例并没有什么“坏”的。

静态变量和静态方法是完全不同的事情

静态变量是不好的,除非它们表示某种类型的“单例”,如果它们表示,那么在OOP中最好创建实际的单例类(特别是如果可以使用enum单例)。除此之外,静态变量使多线程编程变得困难,甚至在单线程编程中也可以做到这一点,在单线程编程中,您“意外地”需要两个带有静态字段的类实例


另一方面,静态方法通常很好,只要它们不访问任何静态数据,而只对其参数进行操作。当然,如果您注意到有
static void MyStaticUtils.operateOnFoo(Foo-Foo)
,那么最好使用非静态
void Foo.operate()
方法。但有时您没有向现有类添加方法的特权,必须对现有方法返回的实例进行操作,静态实用程序方法绝对是不错的选择。

静态变量和静态方法完全不同

静态变量是不好的,除非它们表示某种类型的“单例”,如果它们表示,那么在OOP中最好创建实际的单例类(特别是如果可以使用enum单例)。除此之外,静态变量使多线程编程变得困难,甚至在单线程编程中也可以做到这一点,在单线程编程中,您“意外地”需要两个带有静态字段的类实例

另一方面,静态方法通常很好,只要它们不访问任何静态数据,而只对其参数进行操作。当然,如果您注意到有
static void MyStaticUtils.operateOnFoo(Foo-Foo)
,那么最好使用非静态
void Foo.operate()
方法。但有时您没有向现有类中添加方法的特权,必须对现有方法返回的实例进行操作,然后静态实用程序方法绝对是不错的选择。

可能重复-注意:链接只处理静态变量。静态方法没有错-