我开始用Java编程.
public static void main(String[]args)
Run Code Online (Sandbox Code Playgroud)
一本书说我应该在这种情况下使用静态,但没有明确说明为什么我应该或它意味着什么.
你能澄清一下吗?
coo*_*ird 23
这个概念static与某些东西是一个类还是一个对象(实例)的一部分有关.
在main声明为方法的情况下static,它表示该main方法是一个类方法 - 一个类的一部分,而不是一个对象的一部分.这意味着另一个类可以通过引用另一个类来调用另一个类的类方法ClassName.method.例如,调用run方法MyClass将通过以下方式完成:
MyClass.main(new String[]{"parameter1", "parameter2"});
Run Code Online (Sandbox Code Playgroud)
另一方面,没有static修饰符的方法或字段意味着它是对象的一部分(或者也称为"实例")而不是类的一部分.它由方法或字段所属的特定对象的名称引用,而不是类名:
MyClass c1 = new MyClass();
c1.getInfo() // "getInfo" is an instance method of the object "c1"
Run Code Online (Sandbox Code Playgroud)
由于每个实例可能具有不同的值,因此不同对象中具有相同名称的方法或字段的值不一定必须相同:
MyClass c1 = getAnotherInstance();
MyClass c2 = getAnotherInstance();
c1.value // The field "value" for "c1" contains 10.
c2.value // The field "value" for "c2" contains 12.
// Because "c1" and "c2" are different instances, and
// "value" is an instance field, they can contain different
// values.
Run Code Online (Sandbox Code Playgroud)
结合实例和类变量的两个概念.假设我们声明一个包含实例和类变量和方法的新类:
class AnotherClass {
private int instanceVariable;
private static int classVariable = 42;
public int getInstanceVariable() {
return instanceVariable;
}
public static int getClassVariable() {
return classVariable;
}
public AnotherClass(int i) {
instanceVariable = i;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的类有一个实例变量instanceVariable,以及一个classVariable用static修饰符声明的类变量.类似地,有一个实例和类方法来检索值.
实例的构造函数接受一个值以将实例变量指定为参数.类变量初始化为42且永远不会更改.
让我们实际使用上面的类,看看会发生什么:
AnotherClass ac1 = new AnotherClass(10);
ac1.getInstanceVariable(); // Returns "10"
AnotherClass.getClassVariable(); // Returns "42"
Run Code Online (Sandbox Code Playgroud)
请注意调用类和实例方法的不同方法.它们通过名称引用类的方式AnotherClass,或名称引用的实例ac1.让我们进一步看看方法的行为差异:
AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);
ac1.getInstanceVariable(); // Returns "10"
AnotherClass.getClassVariable(); // Returns "42"
ac2.getInstanceVariable(); // Returns "20"
AnotherClass.getClassVariable(); // Returns "42"
Run Code Online (Sandbox Code Playgroud)
可以看出,实例变量是由对象(或"实例")保持的实例变量,因此对于该特定实例是唯一的,在该示例中,该实例是由ac1和引用的对象ac2.
另一方面,类变量仅对整个类是唯一的.为了更好地理解这一点,让我们为AnotherClass:添加一个新方法:
public int getClassVariableFromInstance() {
return classVariable;
}
Run Code Online (Sandbox Code Playgroud)
然后,运行以下命令:
AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);
ac1.getInstanceVariable(); // Returns "10"
ac1.getClassVariableFromInstance(); // Returns "42"
ac2.getInstanceVariable(); // Returns "20"
ac2.getClassVariableFromInstance(); // Returns "42"
Run Code Online (Sandbox Code Playgroud)
虽然getClassVariableFromInstance是一个实例方法,如可通过参考实例被调用中可以看出ac1和ac2,它们都返回相同的值,42.这是因为在这两个实例方法,它们是指类方法classVariable是唯一的类,而不是实例-只有一个单一的副本classVariable的类AnotherClass.
我希望有些内容可以澄清static修饰符的用途.
Sun 的Java教程有一个名为Understanding Instance and Class Members的部分,它也涉及两种类型的变量和方法.
Mar*_*tta 11
请在维基百科上看到一个很好的描述
例如,请注意在Math类中,您可以说出类似的内容
Math.Abs(x);
Run Code Online (Sandbox Code Playgroud)
不必说
Math m = new Math();
Run Code Online (Sandbox Code Playgroud)
这些是静态方法,因为您不需要实例.实例方法是要求您拥有类实例的方法.
Employee e = new Employee();
e.Terminate();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
948 次 |
| 最近记录: |