Java可以在Objective C中做类似的事情吗?

考虑以下情况:

Object > MyClass > MyClassA, MyClassB 

例如,如果我想要对象级别的东西,我添加了printDetail(); 我怎么能在Java实现中做到这一点? 此外,我可以覆盖所有Object的方法。 例如,我需要一个全新的.toString(),我可以覆盖它吗? 谢谢。

不,它不能,不管怎么说。 Objective C是一种动态类型和范围的语言,使其非常适合类别等function。 您可以在Java中最接近的是通过字节代码操作库(如ASM或Javassist)进行类检测 。

但实际上,当使用类似Java的强类型OO语言时,你应该接受它的function,而不是试图复制另一种语言的function。

正如其他答案中所提到的,没有什么比这更像一个类别了。 在移植到java时,我确实有一些常用的解决方案,用于我的objective-c代码中的一些类别。 我的许多objective-c类别都存在,因为我不想扩展iOS基类,但我确实想为该类添加一些function。 其中许多objective-c类别不使用objc_SetAssociatedObject添加属性。 对于这些情况,我在Java中使用静态助手类。 我们来看一个使用NSString和String的例子。 我将为两者添加function以向字符串添加引号。 我们假设这是有用的,并且为了说明的目的不存在。 在objective-c中,我们可能有:

 @interface NSString (MyCategory) /** * Creates and autoreleased image from self. */ - (NSString*)quotedString; @end @implementation NSString (MyCategory) - (NSString *)quotedString { return [NSString stringWithFormat:@"\"%@\"", self]; } @end 

你可以从这样的地方调用它:

 NSString *myString = @"When you're curious, you find lots of interesting things to do."; NSString *quotedString = [myString quotedString]; 

以下是我将如何在Java中实现它:

 public class StringHelper { public static String quotedString(String that) { return '"' + that + '"'; } } 

并称之为:

 String myString = = "When you're curious, you find lots of interesting things to do."; String quotedString = StringHelper.quotedString(myString); 

如果您将类别方法视为自动将自变量作为第一个方法参数(尽管是不可见的)发送的方法,那么这就更有意义了。

对于您的示例,如果我不扩展特定对象,我可能会执行以下操作:

 public class ObjectHelper { public static void printDetail(Object that) { // do what it takes; } } 

更新:评论者要求限制。

限制是代码在一个单独的静态类中。 它不像一个类别那么方便。 您必须记住这些类名,或者找到它们,并且您将无法在帮助程序中对原始对象方法进行自动完成。 此外,您不能使用objc_SetAssociatedObject获得的对象级属性或属性。 您可以使用哈希映射并使用原始对象实例创建类似哈希键的内容。

 public class StringHelper { private static Map order = new HashMap(); public static int getOrder(String that) { if(that == null) { return 0; } Integer ret = StringHelper.order.get(that); if(ret == null) { return 0; } else { return ret; } } public static void setOrder(String that, int order) { if(that != null) { StringHelper.order.put(that, order); } } } 

原始类别也没有名称冲突,这将更有利。 Objective-c类别中的名称冲突被认为是错误的。

所有Java类最终都有java.lang.Object因此,所有Java classes inheritObject Java classes inherit方法。 这些方法中有一半是final ,无法overridden 。 但是, 可以覆盖Object中的其他方法
Object类中的toString()方法用于显示有关任何对象的一些信息。
所以你可以根据自己覆盖它……
EX ..

 public class Test{ @Override public String toString() { /// staff } }