为什么java中的静态方法只接受其方法中的final或non-final变量,而不接受静态变量?

为什么java中的静态方法只接受其方法中的final或non-final变量,而不接受静态变量?,java,android,Java,Android,为什么java中的静态方法只接受其方法中的final或non-final变量,而不接受静态变量 例如,我有以下方法: public static void myfunc(int somethig) { int a=10; final int b=20; static int c=30; //gives Er

为什么java中的静态方法只接受其方法中的final或non-final变量,而不接受静态变量

例如,我有以下方法:

public static void myfunc(int somethig)
{                                      
  int a=10;                            
  final int b=20;                      
  static int c=30;   //gives Error why?
}

不能有静态局部变量。这真的没有道理

但是,在类中可以有一个静态字段


资源:


    • 不能有静态变量。没有这样的事。您可以将类变量改为静态。

      在Java中(通常是面向对象编程),对象携带状态。方法应该通过对象属性共享状态,而不是通过静态局部变量

      问题是:为什么不呢

      考虑一下:静态局部变量意味着什么

      我认为唯一合理的含义是:

      public class Foo {
          static int bar = 21;
          public void foo() {
              static int bar = 42;  // static local
              return bar;
          }
      }
      
      相当于:

      public class Foo {
          static int bar = 21;
          private static foo$bar = 42;  // equivalent to static local
          public void foo() {
              return bar;
          }
      }
      
      换句话说,(假设的)静态局部变量将等同于具有略微不同可见性规则的常规静态属性


      Java语言设计人员可能考虑到了这一点,认为静态局部变量所增加的实际价值太少,不值得在语言中包含它们。(当然,这是我投票的方式。)

      因为java中的每个函数都必须在一个类中,所以可以通过在类中声明字段来获得相同的效果。这是最简单的方法,java语言设计者非常保守。当有一种更明显、更简单的方法来做同样的事情时,他们永远不会添加这样的功能


      编辑:我想从哲学上讲,函数在java中并不是第一流的。他们不应该存储数据。课程是有意义的,而且确实如此。

      为什么没有意义?它应该是有意义的,因为C++使它成为可能。它不仅是与C的向后兼容性,否则C++只允许函数中的静态局部变量,而不是方法。@ FJSJ我不是C++专家,我的意思是,不需要这样的事情,这可能是很难理解的(如操作符重载等)。java就是这样,它的创建者已经做出了一些选择,使它尽可能容易理解。说实话,(我很明显地)这就像是在问“为什么java中没有
      goto
      ,而C和C++中却有
      goto
      ”@Colin HEBERT“它的创作者已经做出了一些选择,使它尽可能容易理解。”-现在这就是答案了!@Colin Hebert我个人认为你关于易理解性的说法只适用于该语言的第四版。其中没有泛型和疯狂枚举(不过,注释很好).当Java 5问世时,这对我来说是一场灾难-伟大的库必须被一种蹩脚的语言所消耗。它的设计更多的是考虑到C#。它引入的功能肯定没有达到上述目标,即尽可能让人理解。这是一个不错的答案。确实,这样的功能很少使用,而且会被使用有一个C++的味道,但有时我真的很怀念那个巧妙的把戏。有时候我需要的是“一个有轻微不同的可见性规则的地方”。"我真的不明白人们怎么能把它和臭名昭著的goto操作符相比。goto从定义上说是垃圾,静态本地人不是t@nixau-事实上,你对它们的怀念说明了你的编程风格。一般来说,避免使用静态是一种很好的风格,当你不得不使用静态来使用单例设计时模式。@Stephen C:我想你把这个论点颠倒过来了:Java根本不提供这些模式,这就需要使用单例模式,这在其他语言中是很少需要的。大多数模式都是Java语言中缺少功能的变通方法。如果语言支持这些模式,d将更容易识别它们开发人员和编译时工具,以便更容易正确地应用它们。@reinierpost-不,我不是。不赞成静态的原因与没有静态局部变量无关。这是因为静态会导致应用程序的可重入性问题、利用并行性问题、重用代码问题等等。@Stephen C common dude,你太夸张了。这是一个简单的静态局部变量,在方法范围之外是不可见的。如果开发人员愚蠢到从多线程调用这样一个方法,而不应用任何语言的同步原语,那么他生成的代码中的缺陷可能比你想象的严重得多Language做出了这个决定,我同意。但是,我遇到了几种情况,我的代码肯定会从使用静态局部变量功能中受益。效果不同:现在类中的所有方法都可以访问变量。好吧,但我认为在实践中,能够做到这一点是完全无用的,因为如果访问一个函数的源代码,您将能够看到其他函数的代码。通过限制同一类中函数的访问,封装没有任何好处。如果您可以看到,就没有“信息隐藏”。如果这值得一个“-1”,我将引以为豪:-).
      final
      static
      是正交概念。这并不像问题所暗示的那样,有(或可能有)三种选择。在允许静态变量的情况下,它们可以是最终变量或非最终变量,无论是静态变量还是非静态变量。