3

例如,我知道 Objective-C 类方法可以被覆盖,而 Java 不能。

这样做有什么好处,还有什么其他区别?

4

3 回答 3

11

简而言之,Java 中的静态方法只是附加到类的函数。它们不像实例方法那样工作,因为您不能使用 this 或 super。他们实际上对他们在课堂上没有真正的概念。

不过,Objective-C 的类方法非常不同。它们与实例方法完全相同,除了在一个类上。这并不奇怪,因为类是 Obj-C 中的对象。因此它们通过所有相同的动态调度,您可以使用 self 访问其他类方法,您可以使用 super 调用超类的类方法。这提供了更大的灵活性,因为您可以使用类方法执行所有与使用实例方法相同的操作,例如 nil 消息传递、方法调配等。

于 2011-06-04T15:18:14.770 回答
4

马克皮尔金顿的回答是正确的。这是一个具体示例,说明了您可以使用 Objective-C 类方法而不是 Java 静态方法来做什么。

Objective-C

@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

现在,如果您调用printMyFooParent 和 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
于 2011-06-04T15:44:21.780 回答
0

这是关于 Oracle(最初是 Sun)的 Java 文档关于类变量和方法的说明:http: //download.oracle.com/javase/tutorial/java/javaOO/classvars.html

于 2011-06-04T09:15:32.893 回答