java 方法可以包含的修饰符的最大数量是多少?

Posted

技术标签:

【中文标题】java 方法可以包含的修饰符的最大数量是多少?【英文标题】:What are the maximum number of modifiers, a java method can contain? 【发布时间】:2017-04-14 19:09:39 【问题描述】:

在声明java方法之前使用了几个修饰符,如publicstaticsynchronized等。

我只想知道一个java方法可以包含的修饰符的最大数量或所有修饰符的组合。

【问题讨论】:

阅读language spec。 确实如此。实时调频。那应该可以。 Java modifiers syntax and format的可能重复 【参考方案1】:

请参阅 Java 语言规范,chapter 8.4:

MethodDeclaration:
  MethodModifier MethodHeader MethodBody

和:

 MethodModifier:
 (one of) 
 Annotation public protected private 
 abstract static final synchronized native strictfp

你不能混:

访问修饰符(所以你得到了这 3 个中的一个,或者没有包保护) 抽象的、静态的、最终的 抽象与(私有、静态、最终、本机、strictfp、同步) 最后是:native 和 strictfp

将所有这些放在一起(感谢用户 Andreas 出色的措辞):

使用正则表达式语法,我们得到:

 [ public | protected | private] static final synchronized [native | strictfp]

所以,最大数量是 5;以及这 5 个关键字的 6 种不同组合。

【讨论】:

其中一些是互斥的,因此仅将它们全部列出并不能回答问题。 不完整,因为规范说“不能将abstractprivatestaticfinalnativestrictfpsynchronized 中的任何一个混合使用”和“不能混合nativestrictfp”。 所以留下[public | protected | private] static final synchronized [native | strictfp],即答案是5,这个长度有6种组合。 感谢您的所有意见;再次改写!在别处表达了我的感激之情! 这不是正则表达式语法。不过,+1。【参考方案2】:

根据 Java 规范 §8.4.3. Method Modifiers,修改的总列表是(不包括注释):

public protected private
abstract static final synchronized native strictfp

publicprotectedprivate 是互斥的,尽管该部分没有这么说。

规范还说:

如果包含关键字 abstract 的方法声明还包含关键字 privatestaticfinalnativestrictfp 或 @ 中的任何一个,则会出现编译时错误987654332@.

因此,如果您包含 abstract,而仅留下 public | protected,则最多为 2。

规范中的下一条规则是:

如果包含关键字native 的方法声明也包含strictfp,则为编译时错误。

所以,这意味着没有abstract,你可以混合如下:

public | protected | private
static
final
synchronized
native | strictfp

最大长度为 5,该长度有 3 * 2 = 6 种组合。

【讨论】:

在退化的方式中,缺少任何修饰符 publicprotectedprivate 在成员上是修饰符,“默认”或“包私有”幻像访问修饰符。 @LewBloch 我不同意。 “修饰符”一词的意思是它修饰了某些东西。在这种情况下,方法是包私有的,除非修饰符更改它。因此, package-private 不是修饰符,它是默认值/状态。请注意,没有用于指定默认状态的修饰符关键字,例如virtualfinal 相反。所有关键字真正都是修饰符。 注意:“以一种退化的方式”。当然,您是正确的,但具有讽刺意味的是,实际上“默认”访问并不是默认设置。如果他们实际上是在编程,人们必须有意识地选择使用默认访问。大多数人似乎都足够了解publicprotectedprivate。 Package-private 有其工程目的​,并且与其他人处于平等地位,除非它拥有自己的关键字。

以上是关于java 方法可以包含的修饰符的最大数量是多少?的主要内容,如果未能解决你的问题,请参考以下文章

初来驾到学java修饰符的使用

swift中填充修饰符的默认值是多少?

java中final修饰符的使用

面试题解五 访问修饰符的区别

Java中各种(类方法属性)访问修饰符与修饰符的说明

java-访问修饰符的区别