为什么Java方法中不允许像C/C++;功能?

为什么Java方法中不允许像C/C++;功能?,java,c++,c,variables,Java,C++,C,Variables,在C和C++中,您可以执行以下操作: void foo() { static int i = 0; ++i; } 但是,在Java中,您会得到一个“参数的非法修饰符”错误: public void foo() { static int i =0; ++i; } 我并不是在寻找为什么或者为什么这不是一个好主意/坏主意的原因。我只是好奇为什么这在C/C++中是合法的,而不是JavaJava是一种功能贫乏的语言。它不愿意添加除最简单的功能集之外的其他功能,这些功能集将允许

CC++中,您可以执行以下操作:

void foo()
{
   static int i = 0;
   ++i;
}
但是,在Java中,您会得到一个
“参数的非法修饰符”
错误:

public void foo()
{
    static int i =0;
   ++i;
}

我并不是在寻找为什么或者为什么这不是一个好主意/坏主意的原因。我只是好奇为什么这在C/C++中是合法的,而不是Java

Java是一种功能贫乏的语言。它不愿意添加除最简单的功能集之外的其他功能,这些功能集将允许您编写好的程序。这意味着许多模糊的特性,甚至一些在其他语言中可用的非常有用的特性,在Java中都不可用,因为通常有另一种方法来做同样的事情,或者有更好的方法,或者他们已经决定,如果没有这一功能,你会更好

在本例中,我怀疑这是因为您可以将字段放在方法之外,并执行大致相同的操作


顺便说一句:Java确实有方法本地命名类,这些类很少使用,如果它们是最简单的,Java也不需要这些类

Java是一种功能较差的语言。它不愿意添加除最简单的功能集之外的其他功能,这些功能集将允许您编写好的程序。这意味着许多模糊的特性,甚至一些在其他语言中可用的非常有用的特性,在Java中都不可用,因为通常有另一种方法来做同样的事情,或者有更好的方法,或者他们已经决定,如果没有这一功能,你会更好

在本例中,我怀疑这是因为您可以将字段放在方法之外,并执行大致相同的操作


顺便说一句:Java确实有方法本地命名类,这些类很少使用,如果它们是最简单的,Java也不需要这些类

< P>代码> static < /COD>函数范围变量在C++中是有用的,以避免“静态初始化顺序Fasaso”。这在Java中是不必要的,因为它已经很好地指定了静态初始化的顺序

我想最好避免这些变量,因为它会导致混乱的行为:

some_code();
static int x = something();
some_code();
其中
something()
仅在第一次调用时被调用,而其他指令在您使用此函数时随时被调用


默认情况下,没有实现特征。

< >代码>静态< /COD>函数范围变量在C++中是有用的,以避免“静态初始化顺序Fasaso”。这在Java中是不必要的,因为它已经很好地指定了静态初始化的顺序

我想最好避免这些变量,因为它会导致混乱的行为:

some_code();
static int x = something();
some_code();
其中
something()
仅在第一次调用时被调用,而其他指令在您使用此函数时随时被调用


另外,默认情况下不会实现功能。

因为它们是不同的语言&James Gosling不像Bjarne Stroustrup那样喜欢
static
。为什么不呢?这意味着什么?因为这就是语言的定义。请记住,这种语言是由确信
enum
没有用处的人设计的。@bn。所以,总的来说,这不是一个询问设计决策理论的好地方。绝大多数会员都不是任何语言的设计师,很少有人会问。也有例外,特别是C#感谢Eric Lippert的贡献;以及一些维护人员是活动成员的库。但总的来说,你可能得到的答案是或多或少有根据的猜测,或者“因为有人打了那个电话而不是另一个”。@fge甚至不接近静态< /代码>是将全局变量的名称范围化为其封闭方法的一种方法。这纯粹是一个词汇问题。闭包是运行时单个给定方法调用状态的具体化,可以保留并在其他地方使用。因为它们是不同的语言&James Gosling不像Bjarne Stroustrup那样喜欢
static
。为什么不呢?这意味着什么?因为这就是语言的定义。请记住,这种语言是由确信
enum
没有用处的人设计的。@bn。所以,总的来说,这不是一个询问设计决策理论的好地方。绝大多数会员都不是任何语言的设计师,很少有人会问。也有例外,特别是C#感谢Eric Lippert的贡献;以及一些库,其维护人员是活动成员。但总的来说,你可能得到的答案是或多或少有根据的猜测,或者“因为有人打了那个电话而不是另一个”。@fge甚至不接近静态< /代码>是将全局变量的名称范围化为其封闭方法的一种方法。这纯粹是一个词汇问题。闭包是运行时单个给定方法调用状态的具体化,然后可以保留并在其他地方使用。对命名内部类的胡乱猜测:有一个论点是禁止它们在语言中引入不规则性。因此,这似乎是一致性与“功能匮乏”之间的折衷。Java仍然非常复杂,以至于许多开发人员都不太了解它的所有功能。拥有一个类似C++的语言,给你很多方法来做同样的事情,对于经验丰富的开发人员来说是更好的,但是在混合能力的团队中是可怕的。不管怎么说,你最终不得不设置Java对你施加的那种限制。对命名的内部类的胡乱猜测:有一个论点是为了禁止它们在语言中引入不规则性。因此,这似乎是一致性与“功能匮乏”之间的折衷。Java仍然非常复杂,以至于许多开发人员都不太了解它的所有功能。拥有一个类似C++的语言,给你很多方法来做同样的事情,对于经验丰富的开发人员来说是更好的,但是在混合能力的团队中是可怕的。你最终不得不设置这样的限制