静态方法与否?全局变量?

sud*_*udo 1 java oop static

我想知道哪种方式更有效率.

  1. 没有全局变量,通过参数传递变量,所有方法都是静态的

  2. 没有全局变量,只有main方法静态并在main中创建类对象来访问方法

  3. 仅使用全局变量,仅使用main方法static并在main中创建类对象以访问方法

我目前正在使用方法3,但我想知道哪些更有效.这个类不会被它之外的任何其他类使用,它几乎是独立的.

我的代码结构示例:

public class myClass {
   private int globalVariable;

   public static void main(String args[]) {
      myClass c;
      c.someMethod(); // Changes global variable from method
      System.out.println(someMethod); // Prints solution
   }

   public void someMethod() {...}
}
Run Code Online (Sandbox Code Playgroud)

Ade*_*ari 11

  • 没有班级是一个岛屿.
  • 没有银子弹,至少它在编程中是非常真实的.
  • 过早优化是万恶之源.
  • 在Java中,我们没有全局变量.我们只有类变量,实例变量和方法变量.

[编辑]

我想在这里解释我的最后一点.事实上,将下面评论中正在进行的讨论带到实际的帖子中.

首先看一下这个C#的SO线程.人们也在暗示同样的事情,即

所以,我们走了.

retort:类是全局范围的,因此所有类变量都是全局范围的.因此应该被称为全球性的.

反驳:并非所有类都是全局范围的.一堂课可以package-private.因此,包中的static变量将不会在包外显示.因此,不应该被称为全球性的.此外,类可以嵌套,因此也可以private,并且肯定可以有一些static变量,但那些不会被称为全局变量.

retort: public类是全局范围的,因此所有类变量都是全局范围的.

反驳:不完全是.我想在此处移动上一个参数,但是在可变级别上.无论班级本身如何public.那里的变量可以是protected,package-privateprivate.因此,static在这种情况下,变量不会是全局的.

现在,如果你想public staticpublic static类中调用变量,那么可以通过任何方式调用它.但是考虑一下,当你创建一个新的ClassLoader(作为引导程序的子代ClassLoader)并加载一个你已经加载的类.然后,这会产生一个"非常新的类副本" - 完成它自己的新的一组statics.确实非常"非全球化".但是,我们在Java中不使用global这个词,因为它往往会混淆事物,然后我们需要提供大量的解释才能使一切都清楚.人们正好喜欢global用Java 来解释变量的特征static变量.这没有问题.如果您有任何其他语言的问题/代码并且使用全局变量并且您需要将该代码转换为Java,那么您很可能使用static变量作为替代.

我想在这里渲染几个例子

  1. 当我启动Java时,教师喜欢解释传递对象类型变量和原始变量的区别.他们经常使用术语对象pass-by-reference,而原始对象是pass-by-value.学生们发现这个解释很混乱.因此,我们提出了Java中的所有内容都是按值传递的概念.我们解释说,对象引用是按值传递的.它变得更加清晰和简单.

  2. 同样,有些语言支持多重继承.但可以说,Java并不是这样.但人们倾向于用interfaces 来解释这个特征.他们通过实现许多接口的类来解释它,并将其称为多继承.那很好.但实际上,类通过继承许多接口来接收.坦率地说,没什么.为什么?

    .因为接口中的所有变量都是隐式的public,final并且static显然意味着那些属于类,任何人都可以访问它们.现在我们可以说inner class在接口中可能会有一些,然后实现接口的类将拥有它.但是,这将是static隐含的并且将属于接口.因此,该类将获得的所有方法都是方法.并且不要忘记定义和合同,它说"实现此接口的类必须提供所有方法的实现或声明自己abstract".因此,那个班级只会得到责任而没有多少.但这可以很好地解决我们的问题.

底线

因此,我们说

  • Java中没有全局变量
  • Java不支持多继承,但可以通过实现多个接口来实现.这确实有效
  • Java中没有任何pass-by-reference,但引用是按值传递的

现在我想在几个地方站点

  • Java不支持全局,普遍可访问的变量.您可以使用具有静态变量的类获得相同类型的效果[Ref]
  • 但是,extern在ObjectiveC中,Java不能替代类范围的静态变量,实际上它更像是一个全局变量......所以请谨慎使用.[参考文献]
  • 代替C/C++中的全局变量,Java允许将类中的变量声明为static [Ref]
  • 此外,过度使用静态成员可能会导致类似于支持全局变量和全局函数的C和C++等语言所遇到的问题.[参考文献]

所有这些都推断出同一个想法.哪个是Java不支持全局变量.

见鬼,我写了那么多.对不起,伙计们.