我想知道什么时候使用静态方法?假设我有一个类,有几个getter和setter,一个或两个方法,我希望这些方法只能在类的实例对象上调用。这是否意味着我应该使用静态方法?
例子:
Obj x = new Obj();
x.someMethod();
或:
Obj.someMethod(); // Is this the static way?
我很困惑!
我想知道什么时候使用静态方法?假设我有一个类,有几个getter和setter,一个或两个方法,我希望这些方法只能在类的实例对象上调用。这是否意味着我应该使用静态方法?
例子:
Obj x = new Obj();
x.someMethod();
或:
Obj.someMethod(); // Is this the static way?
我很困惑!
当前回答
静态方法和变量是Java中“全局”函数和变量的受控版本。其中方法可以作为classname.methodName()或classInstanceName.methodName()访问,即静态方法和变量可以使用类名以及类的实例访问。
类不能被声明为静态的(因为它没有意义。如果一个类被声明为public,它可以从任何地方访问),内部类可以被声明为static。
其他回答
静态方法与实例不关联,因此它们不能访问类中的任何非静态字段。
如果方法不使用类的任何字段(或仅使用静态字段),则使用静态方法。
如果使用类的任何非静态字段,则必须使用非静态方法。
静态方法不需要在对象上调用,这就是你使用它的时候。例如:你的Main()是一个静态的,你没有创建一个对象来调用它。
一个经验法则:问问自己“即使还没有构造对象,调用这个方法有意义吗?”如果是这样,它肯定是静态的。
在Car类中,你可能有一个方法:
double convertMpgToKpl(double mpg)
...这将是静态的,因为有人可能想知道35英里/加仑转换成什么,即使没有人制造过汽车。但是这个方法(设置一个特定Car的效率):
void setMileage(double mpg)
...不能是静态的,因为在构造任何Car之前调用该方法是不可想象的。
(顺便说一下,相反的情况并不总是正确的:你可能有时有一个方法涉及两个Car对象,但仍然希望它是静态的。例如:
Car theMoreEfficientOf(Car c1, Car c2)
虽然这可以转换为非静态版本,但有些人会认为,由于没有“特权”选择哪个Car更重要,所以不应该强迫调用者选择一个Car作为调用方法的对象。不过,这种情况在所有静态方法中只占相当小的一部分。
只在以下场景下定义静态方法:
如果您正在编写实用程序类,并且它们不应该被更改。 如果该方法没有使用任何实例变量。 如果任何操作不依赖于实例创建。 如果有一些代码可以很容易地被所有实例方法共享,那么将这些代码提取到静态方法中。 如果您确定方法的定义永远不会被更改或重写。因为静态方法不能被覆盖。
实际上,我们在类中使用静态属性和方法,当我们想要使用程序的某些部分时,它们应该一直存在,直到程序运行为止。我们知道,要操作静态属性,我们需要静态方法,因为它们不是实例变量的一部分。如果没有静态方法,操作静态属性是非常耗时的。