为什么java中的静态方法只接受其方法中的final或non-final变量,而不接受静态变量?
为什么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
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
是正交概念。这并不像问题所暗示的那样,有(或可能有)三种选择。在允许静态变量的情况下,它们可以是最终变量或非最终变量,无论是静态变量还是非静态变量。