例如,我知道 Objective-C 类方法可以被覆盖,而 Java 不能。
这样做有什么好处,还有什么其他区别?
简而言之,Java 中的静态方法只是附加到类的函数。它们不像实例方法那样工作,因为您不能使用 this 或 super。他们实际上对他们在课堂上没有真正的概念。
不过,Objective-C 的类方法非常不同。它们与实例方法完全相同,除了在一个类上。这并不奇怪,因为类是 Obj-C 中的对象。因此它们通过所有相同的动态调度,您可以使用 self 访问其他类方法,您可以使用 super 调用超类的类方法。这提供了更大的灵活性,因为您可以使用类方法执行所有与使用实例方法相同的操作,例如 nil 消息传递、方法调配等。
马克皮尔金顿的回答是正确的。这是一个具体示例,说明了您可以使用 Objective-C 类方法而不是 Java 静态方法来做什么。
@interface Parent : NSObject
+ (int)foo;
+ (int)bar;
- (void)printMyFoo;
@end
@interface Child : Parent
+ (int)bar; // Override bar only.
@end
@implementation Parent
+ (int)foo {
return [self bar];
}
+ (int)bar {
return 0;
}
- (void)printMyFoo {
NSLog(@"%d", [[self class] foo]);
}
@end
@implementation Child
+ (int)bar {
return 1;
}
@end
现在,如果您调用printMyFoo
Parent 和 Child 的实例,您将得到不同的结果,因为在运行时+[Parent foo]
动态调度bar
调用:
id parent = [[Parent alloc] init];
id child = [[Child alloc] init];
[parent printMyFoo]; // -> 0
[child printMyFoo]; // -> 1
class Parent {
static int foo() { return bar(); }
static int bar() { return 0; }
void printMyFoo() { System.out.println(foo()); }
}
class Child extends Parent {
static int bar() { return 1; }
}
现在,如果您调用printMyFoo()
Parent 和 Child 实例,它们都会打印相同的内容,因为即使对于孩子,也Parent.foo()
调用Parent.bar()
而不是Child.bar()
:
Parent parent = new Parent();
Child child = new Child();
parent.printMyFoo(); // -> 0
child.printMyFoo(); // -> 0
这是关于 Oracle(最初是 Sun)的 Java 文档关于类变量和方法的说明:http: //download.oracle.com/javase/tutorial/java/javaOO/classvars.html