0

我在静态和非静态之间很困惑。

我真的不明白在哪里使用静态变量或静态方法以及在哪里使用非静态变量或非静态方法?

等待伸出援助之手

4

5 回答 5

1

这是针对 Java 的。C++ 可能在前两个方面很相似,也许更多,尽管我不能确定。

静态:对类应用一次。使用FooClass.staticField或访问FooClass.staticMethod(args)

非静态:按实例应用。使用fooInstance.field或访问fooInstance.method()fooInstance是一个实例,FooClass并且是通过构造函数或工厂获得的。

通常,诸如类的常量Color之类的YELLOW常量是声明的static final FooClass

另一个用途static是静态初始化器:

class FooClass
    static{
        //Code here gets called once when the class is loaded.
    }
于 2013-08-12T14:47:49.530 回答
1

在 Java 中,静态指的是整个类,而不是类的对象(实例化)。例如,如果我创建了一个名为 Bicycle 的类:

  • instance变量可以是它的颜色或注册号。
  • 然而,如果每辆自行车都有两个轮子,轮子的数量可能是一个static变量,因为它是类范围的(注意,这也应该用final关键字作为常量,因为它不会改变)。

方法也是一样。静态方法是类范围的,非静态方法特定于该对象。

于 2013-08-12T14:48:00.510 回答
1

static在 C++ 和 Java 中的含义略有不同,但静态类成员(方法和变量)的规则基本相同:静态成员适用于整个类,非静态成员适用于类的各个实例。

举一个常见的例子,Java 中通常有一个属于整个类的记录器,因为每个实例不需要自己的副本。所以你看

private static final Logger logger = LoggerFactory.getLogger("loggerName");

final此处的含义与 C++ 中的含义相同const。)

静态方法是不适用于特定实例的方法。一个常见的例子是Integer.parseInt(String),它不会在现有对象上调用,Integer因为它将aString 变成Integer.

适用于单个实例(例如length()name)的变量和方法不是静态的。

于 2013-08-12T14:48:02.967 回答
1

我不知道这个问题要在stackoverflow上回答多少次访问静态变量
首先阅读这篇文章,也使用维基百科,然后寻找一本名为Headfirst Java(Sierra&Bates)的书以及Java How To Program(Deitel,Deitel) . 这些书对你有用。在你阅读并认为你已经掌握了这个概念之后,给自己一个项目来做这个项目。如果你练习,你会更快更好地理解它,所以阅读和编码。

于 2013-08-13T04:49:52.690 回答
1

以这种方式理解,静态变量由所有对象共享,而不像非静态变量对于不同的对象是不同的。考虑一个场景,你正在开发一个学生班,这个班的不同对象将代表不同的学生,每个学生都有唯一的卷号,不同的名称(或相同的)。现在,所有这些学生都代表同一所大学。

class Students
{
int roll;
String name;
int collegecode;
public static void main (String args[])
{
   Students o1= new Students();
   o1.roll =12;
   o1.name ="james";        // This is a bad practice,fields should be private
   o1.collegecode = 7523 ;         
   Students o2 = new Students();
   o2.roll =13;            //  getter, setter methods should be used
   o2.name ="Michael";
   o2.collegecode= 7523;
}

}

由于每个学生(对象)的collectionid都是相同的,因此它可以独立于对象并且可以设为静态。静态方法/变量由所有对象共享并且可以通过classname.variableor访问classname.methodobject.method虽然,您可以使用或访问静态变量/方法object.variable。(但没有意义,你可以像o1.staticvariable,o2.staticvariable等一样引用它,它们都是指同一个变量)

如果你在上面的例子中将大学代码设为静态,它看起来像

 static int collegecode;

      o1------->  college code  <---- o2
      roll (12)                      roll(13)
      name(James)                    name(Michael)
于 2013-08-13T06:05:19.230 回答