"MyType#myMethod()"中的"#"是什么意思?与"MyType.myMethod()"中的"."有何不同?(这是一个关于IT技术的问题)

10

好的,题目已经说得很清楚了...

我知道这两种形式都是指方法,但我不明白#在另一种形式中有何作用。


2
前者是Javadoc形式,如果我没记错的话。我试图用它来表示“在MyType中定义的方法”,而点更多地用于实际方法调用,但我不太确定“真正”的含义是什么。 - awksp
3个回答

11

哈希字符(#)不是Java语言的一部分。

它在javadoc中具有特殊用途。 规范指出:

 

package.class#member 是任何有效的程序元素名称,即引用的包,类,接口,构造函数,方法或字段名称,除了在成员名称之前的字符应该是井号(#)。

并且

 

如上所述,井号(#)而不是点(.)将成员与其类分开。这使Javadoc工具能够解决歧义问题,因为点还分隔类,嵌套类,包和子包。但是,Javadoc工具通常是宽松的,如果您知道没有歧义,则会正确解析点,尽管会打印警告。

这种表示法不仅适用于方法,也适用于任何类型成员。它有助于从完全限定的类型名称中消除歧义。


谢谢。看起来这个答案与Javadoc API有关。那么关于区分静态成员和实例成员的一般讨论呢,就像skiwi提到的那样? - mins
@mins 我猜你可以这样做,但我不认为有太大意义。你不能同时拥有相同签名的static和非static方法,因此通过这种方式区分它们并不是很重要。 - Sotirios Delimanolis

10

.版本是Java编程语言中使用的正式表示法,更具体地说,请考虑以下代码:

class Animal {
    void fly() { 
    }
}

我们使用方法fly()需要执行以下步骤:
Animal animal = new Animal();
animal.fly();

我们在文档中真正想要记录的是调用实例方法fly(),因此我们使用Animal#fly(),看似另一种选择是Animal.fly(),但这将表示Java代码中Animal类的静态方法。
因此,Animal#fly()被用于所有其他形式,总结来说,替代方案包括:
- Animal.fly(),但这可能意味着一个静态方法。 - animal.fly(),但没有叫做animal的类。
值得一提的是,自Java 8以来,我们实际上可以直接在Java代码中执行这些操作,方法如下:
Runnable animalFly = Animal::fly;

在这里,我们还引用了Animal#fly()方法,然而javadoc的时间比Java 8早很多。


我觉得你的回答不够清晰。你是说 # 只用于文档吗?还是说它用于表示实例方法?为什么要提到方法引用? - Sotirios Delimanolis
感谢。总结一下:Animal#fly()和Animal.fly()分别表示实例和静态调用,为了区分目的在一般文档中,其他发布者提到:Javadoc还使用#来消除成员名称和其限定符之间的歧义,但没有静态或实例含义。 - mins
那么,静态方法呢?如果fly()是类Animal的静态方法,那么在javadoc中我们仍然将其表示为Animal#fly()吗? - starriet

2

MyType#myMethod()是用于JavaDoc的语法,以便您的文档可以链接到不同方法的文档。

例如,Object.equals()的javadoc包含文本,以链接到Object.hashCode()方法,因为它们是相关的。

/**
 * ...
 *
 * @see Object#hashCode()
 */
  public boolean equals(Object obj)

而 MyType.myMethod() 是在 Java 代码中调用该方法的实际语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接