当前位置: 首页 > 知识库问答 >
问题:

为什么不需要分号,但允许在类定义的末尾使用分号?

葛安和
2023-03-14

我正在尝试从C转换到Java。

我想知道的是,在C中,在类定义之后需要分号(),但在Java中则不是。

也就是说,在C中:

class Person {
    public:
    string name;
    int number;
}; // Note this semicolon

但在Java中:

class Person {
    public String name;
    public int number;
} // Semicolon is not required

那很好,我理解。

然而,我的问题是:

当我在类定义的末尾添加分号时,Java也可以工作,例如:

class Person {
    public String name;
    public int number;
}; // Now this semicolon is confusing me!

我已经编译并执行了为Java显示的两个程序片段,它们都有效。有人能解释为什么会这样吗?Java中类定义末尾的分号代表什么?

如果这个问题质量不高,我很抱歉,但我真的需要对此进行澄清。我希望Java方面的专家能帮助我。

我已经在类定义和其他相关问题中看到了分号。

提前谢谢。

共有3个答案

阙阳夏
2023-03-14

Java添加这个只是为了像你这样从C切换的人!

在Java中,一个分号是一个几乎可以在任何地方编写的声明。它的唯一目的是简化这些语言的过渡。

例如,以下Java也是正确的:

;;;;;;;;;;
class X{
    ;;;;;;;;;;;;;;
} ;;;;;;;;;;;;;;;

分号被简单地视为不起任何作用的空声明。

以下引用规范第7.6段:

额外“;”出现在编译单元中类型声明级别的标记对编译单元的含义没有影响。Java编程语言中只允许使用零散的分号,作为对习惯于放置“;”的C程序员的让步在类声明之后。它们不应该在新的Java代码中使用。

所以如你所见,这真的只适合像你这样的人:)。

您甚至可以使用一行分号作为良好的视觉分隔。然而,我强烈建议不要这样做。但这可能有助于吹牛。E、 g.:

class X {
   // Member variables
   private int i;

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   // Constructors
   X(){}

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   // Methods
   void foo(){}    

}
长孙哲
2023-03-14

在早期,允许这样做是C/C程序员更熟悉Java的方式之一。这种熟悉对Java的采用很重要。

下面是它在语法上的工作方式。

根据JLS 7.3,在顶级类之后,它可以工作,因为编译单元包含以下序列:

CompilationUnit:
 PackageDeclaration(opt) ImportDeclarations(opt) TypeDeclarations(opt)

根据JLS 7.6,类型声明为以下任一项:

TypeDeclaration:
   ClassDeclaration
   InterfaceDeclaration
   ;

根据JLS 8.1.6,在嵌套在其他类中的成员类之后,它可以工作,因为分号可以是类成员声明:

ClassMemberDeclaration:
    FieldDeclaration
    MethodDeclaration
    ClassDeclaration    
    InterfaceDeclaration
    ;

根据JLS 14.6,在本地类之后,在方法内部,它可以工作,因为分号可以是空语句:

EmptyStatement:
    ;
葛奇
2023-03-14

我已经编译并执行了为Java显示的两个程序片段,它们都可以工作。有人能解释为什么会这样吗?

它是允许的,因为Java语法说它是允许的;见JLS 7.6。

Java中类定义末尾的分号代表什么?

没有什么它是可选的“语法噪音”。

JLS解释如下:

在编译单元中类型声明级别出现的额外";"标记对编译单元的含义没有影响。在Java编程语言中允许使用迷路分号,这仅是对习惯于将";"放在类声明之后的C程序员的让步。它们不应用于新的Java代码。

(请注意,这不是“空语句”。空语句(JLS 14.6)出现在允许使用语句的语法上下文中。空语句的存在可能会改变代码的含义;e、 g.<代码>如果(a==b);c() 与<代码>相对

 类似资料:
  • 问题内容: 我正在尝试从C ++转向Java。 我想知道的是,在C ++中,在类定义之后,需要使用分号(),而在Java中则不需要。 也就是说,在C ++中: 但是在Java中: 很好,我知道。 但是, 我的问题是 : 当我在类定义的末尾添加分号时,Java也可以使用,例如: 我已经编译并执行了Java所示的两个程序片段,并且它们均有效。谁能解释为什么会这样?Java类定义末尾的分号代表什么? 很

  • 我正在学习Rust,我发现函数有些混乱。根据官方参考,一个返回表达式: ...[is]用关键字返回表示。评估返回表达式将其参数移动到当前函数的输出槽中,破坏当前函数激活帧,并将控制权转移到调用者帧。 所以,这个程序工作: 当我在“返回”表达式中添加分号时,它仍然有效: 我对表达式语句(例如)的理解是,它将计算表达式,并忽略结果(而是使用)。如果使用

  • 问题内容: 我不小心写了一个Java语句,结尾有两个分号。Java编译器不显示任何错误,它可以运行。 码: 出于学习目的,我尝试在分号后添加不同的字符,并且Java编译器已将编译时错误显示为 令牌“)”上的语法错误,请删除此令牌 。 这个说法: 为什么Java将分号和其他字符视为不同? 问题答案: 因为双分号不会被视为双分号,而是会被视为分号和空语句。空的语句不执行任何操作,这不是错误。

  • 我在系统的分号后面加了一个分号。出来打印ln: 这对Java编译器来说是合法的,所以我检查了其他语句,它们也都是合法的。所以当我搜索并找到这些链接时: > 为什么Java在语句末尾不显示双分号错误? 当我用两个分号结束一行时,编译器并没有抱怨。为什么? 什么时候在方法结束括号后面加上分号? 为什么使用连续分号的代码会编译? “if”语句末尾的分号 我开始明白一个额外的分号意味着一个额外的空语句。

  • 问题内容: 我只是想要一些有关此的信息。 什么是在的结尾文字呢?这叫什么?为什么使用它? 问题答案: 在表明它是一个浮点文字,不是双字面它并没有一个特定的技术名称,我知道(这将暗示以其它方式) -我倾向于把它称为“字母后缀”如果我需要参考具体来说,尽管有点武断! 例如: 您当然可以: …几乎可以完成同一件事,但是F是一种更简洁,更简洁的表示方式。 为什么选择double作为默认值而不是float?

  • 《铁锈之书》第3.5章摘录: 我们使用关键字和值。循环结束后,我们使用分号结束将值赋给的语句。 加上代码片段: 我理解这是如何工作的,以及为什么结果是20,但我注意到,如果我删除包含关键字的行上的分号,程序是等效的。 为什么分号在这种情况下是可选的?