当前位置: 首页 > 面试题库 >

Java:不是声明

伏德义
2023-03-14
问题内容

我想这更多是关于语言理论的问题。为什么第一条陈述在主要法律中是合法的,而第二条陈述却没有?他们不认为是同一回事吗?

public class Main {
        public static void main(String[] args) {
                foo();
                0;
        }
        public static int foo(){
                return 0;
        }
}

问题答案:

Java限制了所谓的“表达式语句”中允许的表达式类型。仅允许具有潜在副作用的有意义的表达式。它不允许在语义上无意义的语句,例如0;a + b;。它们只是从语言语法中排除。

像这样的函数调用foo()可以而且通常确实具有副作用,因此它不是毫无意义的声明。编译器不会深入检查主体foo()以检查其是否实际执行了任何操作。调用函数
可能 会有副作用,因此在语法上是有效的。

这反映了C / C ++与Java之间的哲学差异。Java禁止使用各种构造,这些构造会导致代码无效或毫无意义。

return;
foo();    // unreachable statement

C和C ++在这方面相对宽松。随便写 他们没有时间照顾你。

引用Java语言规范§14.8表达式语句:

某些类型的表达式可以在其后加上分号来用作语句。

ExpressionStatement:
    StatementExpression ;

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression

通过评估表达式来执行表达式语句;如果表达式具有值,则将值丢弃。

当且仅当表达式的评估正常完成时,表达式语句的执行才能正常完成。

与C和C
++不同,Java编程语言仅允许将某些形式的表达式用作表达式语句。请注意,Java编程语言不允许“强制转换为void”(void不是类型),因此编写表达式语句的传统C技巧如下:

(void)... ;  // incorrect!

不起作用。另一方面,Java编程语言允许在expressions语句中使用所有最有用的类型的表达式,并且它不需要用作表达式语句的方法调用来调用void方法,因此几乎不需要这种技巧。如果需要技巧,则可以改用赋值语句(第15.26节)或局部变量声明(第14.4节)。



 类似资料:
  • 问题内容: 在正确掌握接口最佳实践的过程中,我注意到一些声明,例如: 代替 -据我所知,原因是因为它有一定的灵活性,以防万一你不想实现ArrayList,但又可能实现另一种类型的列表。 通过这种逻辑,我建立了一个示例: 我的问题是,我无法访问batheSelf()方法,因为它仅适用于Cat。这使我相信,仅在使用接口中声明的方法时才应从接口声明(而不是子类中的其他方法),否则应直接从类中声明(在本例

  • 问题内容: 这个问题在Google上到处都有,但我仍然遇到问题。这就是我想要做的。因此,就像标题状态一样,我遇到了“对象不是声明类的实例”错误。有任何想法吗?谢谢! Main.java TestFunction.java 问题答案: 您正在使用该类调用该方法,但需要一个实例。试试这个:

  • 用户类 我把这个复制方法叫做 并在执行writeMethod.invoke(dest,val)时获得以下异常。有人能帮忙吗? 对象不是在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.Invoke0(原生方法)在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.Invoke

  • 问题内容: 如下代码: 返回以下错误: 为什么会这样呢?我对布尔值非常熟悉。 问题答案: 尝试以下方法: 或使用其他名称。关键是在Java中,它是一个关键字,不能用作变量名- 在语言规范中就在这里。供将来参考,这是用于: 该声明跳过的当前迭代,或循环。未标记的形式跳到最里面的循环主体的末尾,并评估控制该循环的布尔表达式。

  • 根据我读到的其他问题(为什么重写方法不能抛出比重写方法更广的异常?以及Java方法抛出异常) 我知道子类中的重写方法必须抛出在重写方法中抛出的异常的相同或一个子类。 Java方法总是至少抛出一个类型为exception的异常吗? ...换句话说,编译器添加抛出异常 因此类X将如下所示 我想澄清的是,对于始终添加默认异常处理程序异常这一事实,我没有搞错。 相关问题: IOException与Runt

  • 我正在尝试编写布尔方法,但它不起作用 它的工作,如果我写这个方法: 我应该如何为它制作布尔方法?