什么是静态而非静态?何时使用以及如何使用它们?

时间:2013-08-12 14:45:18

标签: java

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

我真的无法理解在哪里使用静态变量或静态方法以及在哪里使用非静态变量或非静态方法?

等待伸出援手

5 个答案:

答案 0 :(得分:1)

这是针对Java的。 C ++在前两个方面可能相似,可能更多,但我无法确定。

静态:适用于该课程一次。访问FooClass.staticFieldFooClass.staticMethod(args)

非静态:适用于每个实例。访问fooInstance.fieldfooInstance.method()fooInstanceFooClass的一个实例,是使用构造函数或工厂获得的。

通常,Color类的YELLOW常量等常量声明为static final FooClass

static的另一个用途是静态初始值设定项:

class FooClass
    static{
        //Code here gets called once when the class is loaded.
    }

答案 1 :(得分:1)

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

  • instance变量可以是其颜色或注册号。
  • 但是,如果每辆自行车都有两个轮子,那么轮子的数量可以是static变量,因为它是全班的(请注意,这应该与final关键字一致。 ,因为它不会改变)。

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

答案 2 :(得分:1)

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

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

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

(这里的final与C ++中的const意思相同。)

静态方法是不适用于特定实例的方法。一个常见示例是Integer.parseInt(String),在现有Integer上没有调用,因为它将String 转换为 Integer

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

答案 3 :(得分:1)

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

答案 4 :(得分: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;
}

}

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

如果你在上面的例子中使collegecode静态,它将看起来像

object.variable