我在静态和非静态之间很困惑。
我真的不明白在哪里使用静态变量或静态方法以及在哪里使用非静态变量或非静态方法?
等待伸出援助之手
这是针对 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.
}
在 Java 中,静态指的是整个类,而不是类的对象(实例化)。例如,如果我创建了一个名为 Bicycle 的类:
instance
变量可以是它的颜色或注册号。static
变量,因为它是类范围的(注意,这也应该用final
关键字作为常量,因为它不会改变)。方法也是一样。静态方法是类范围的,非静态方法特定于该对象。
static
在 C++ 和 Java 中的含义略有不同,但静态类成员(方法和变量)的规则基本相同:静态成员适用于整个类,非静态成员适用于类的各个实例。
举一个常见的例子,Java 中通常有一个属于整个类的记录器,因为每个实例不需要自己的副本。所以你看
private static final Logger logger = LoggerFactory.getLogger("loggerName");
(final
此处的含义与 C++ 中的含义相同const
。)
静态方法是不适用于特定实例的方法。一个常见的例子是Integer.parseInt(String)
,它不会在现有对象上调用,Integer
因为它将aString
变成Integer
.
适用于单个实例(例如length()
或name
)的变量和方法不是静态的。
我不知道这个问题要在stackoverflow上回答多少次访问静态变量
首先阅读这篇文章,也使用维基百科,然后寻找一本名为Headfirst Java(Sierra&Bates)的书以及Java How To Program(Deitel,Deitel) . 这些书对你有用。在你阅读并认为你已经掌握了这个概念之后,给自己一个项目来做这个项目。如果你练习,你会更快更好地理解它,所以阅读和编码。
以这种方式理解,静态变量由所有对象共享,而不像非静态变量对于不同的对象是不同的。考虑一个场景,你正在开发一个学生班,这个班的不同对象将代表不同的学生,每个学生都有唯一的卷号,不同的名称(或相同的)。现在,所有这些学生都代表同一所大学。
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.variable
or访问classname.method
。object.method
虽然,您可以使用或访问静态变量/方法object.variable
。(但没有意义,你可以像o1.staticvariable,o2.staticvariable等一样引用它,它们都是指同一个变量)
如果你在上面的例子中将大学代码设为静态,它看起来像
static int collegecode;
o1-------> college code <---- o2
roll (12) roll(13)
name(James) name(Michael)