Марк Пилкингтон ответ правильный. Вот конкретный пример, иллюстрирующий то, что вы можете делать с помощью методов класса 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
Теперь, если вы вызовете printMyFoo
для экземпляра Parent и Child, вы получите разные результаты, потому что +[Parent foo]
динамически отправляет вызов bar
во время выполнения:
id parent = [[Parent alloc] init];
id child = [[Child alloc] init];
[parent printMyFoo]; // -> 0
[child printMyFoo]; // -> 1
Java
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