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

Java中的对象创建语句不允许使用单行循环。为什么?

蒙墨竹
2023-03-14
问题内容

以下程序本身并不重要。它只使用类Counter内部的静态字段,通过使用for循环来计算创建的对象数,如下所示。

package temp;

final class Counter
{
    private static int cnt;

    public Counter()
    {
        cnt++;
    }

    public static int show()
    {
        return(cnt);
    }
}

final public class Main
{
    public static void main(String[] args)
    {
        for (int i=0;i<50;i++)
        {
            Counter counter=new Counter();
        }

        /*for (int i=0;i<50;i++)
            Counter counter=new Counter();*/

        System.out.print("\nNumber of objects constructed:->"+Counter.show()+"\n\n");
    }
}

唯一的问题是,注释的for循环的含义与上述for循环的含义相同(同一事实也适用于while循环)根本不起作用,从而导致指示“ 不是语句
的编译时错误。意味着在这种特殊情况下,即使for循环仅包含一个语句,一对括号也是必须的!为什么?


问题答案:

要了解为什么会发生这种情况,您必须查看语言规范中Java的Blocks和Statements语法。

ForStatement定义为:

ForStatement:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt )
        Statement

声明定义为:

Statement:
    StatementWithoutTrailingSubstatement
    LabeledStatement
    IfThenStatement
    IfThenElseStatement
    WhileStatement
    ForStatement

StatementWithoutTrailingSubstatement:
    Block
    EmptyStatement
    ExpressionStatement
    SwitchStatement
    DoStatement
    BreakStatement
    ContinueStatement
    ReturnStatement
    SynchronizedStatement
    ThrowStatement
    TryStatement

然后,查看Block:

Block:
    { BlockStatementsopt }

BlockStatements:
    BlockStatement
    BlockStatements BlockStatement

BlockStatement:
    LocalVariableDeclarationStatement
    ClassDeclaration
    Statement

您会注意到,在此规范内,LocalVariableDeclarationStatement无效,除非它在一个块中。但是,由于ForStatement要求在其后加上一条语句,因此必须存在括号才能使表达式有效。这样,在没有括号的情况下,任何局部变量声明在循环中都是无效的。



 类似资料:
  • 问题内容: 我想知道为什么允许它具有不同类型的对象引用?例如; 您能否举一个使用不同类型的对象引用有用的示例? 编辑: 问题答案: 这是多态性和抽象的核心。例如,这意味着我可以写: …并处理 任何 类型的输入流,无论是来自文件,网络,内存中的输入流。还是同样地,如果您有一个,则可以不考虑其实现而要求其元素0。 将子类的实例视为超类的实例的能力称为Liskov的替代原理。它允许松散耦合和代码重用。

  • 来自JDBC规范 关闭语句对象将关闭该语句对象生成的任何ResultSet实例并使其无效。在垃圾收集再次运行之前,ResultSet对象持有的资源可能不会被释放,因此当不再需要ResultSet对象时,显式关闭它们是一种很好的做法。 > 调用ResultSet.close()是否立即释放ResultSet对象? 调用Statement.close()是否立即释放语句对象? 调用语句。close()

  • 我一直在使用JavaScript代码进行自动GUI测试。我一直在进行全面的测试,并优化了一些代码。例如,我有一个函数可以将值输入到窗口的所有字段中,该窗口大致如下所示: 最初输入函数看起来是这样的:这是相当笨拙的,占用了很多空间,不如编辑函数以接受一个将字段作为属性值的对象那样整洁。现在函数看起来像这样:其中是这样定义的: 在我进入测试一个特殊需求的部分之前,这一直工作得很好,该需求说明当您在窗口

  • 我对编程有点陌生,我被卡住了。假设我在一个项目中有五个不同的类:foo1、foo2、foo3、foo4和foo5,它们都做不同但相似的事情。现在假设我需要为每个对象创建一个新对象,比如:foo1 bar1=new foo1();foo2 bar2=新的foo2();foo3 bar3=新的foo3();等等当然这是可行的,但如果我能在一个for循环中实例化我需要的所有对象,或者至少把我想要创建的所

  • 问题内容: 我正在尝试使用pyodbc创建一个SQL Server数据库。 失败并显示此错误 多语句事务中不允许使用CREATE DATABASE语句 它失败,因为该方法启动了事务,并且无法在事务内运行。 那么还有其他方法可以使用python执行命令吗? 问题答案: 建立连接时,pyodbc的默认设置符合Python的DB- API规范。因此,当执行第一个SQL语句时,ODBC将开始有效的数据库事

  • 循环结构能够让程序员以最少的精力去完成大量重复的工作,它可以让计算机根据条件做循环计算,当条件成立时继续循环,当条件不成立时结束循环。 依据前面所学的知识,如果我们想在屏幕上依次打印1到5,可以编写以下程序: 案例演示 预览 复制 复制成功! // PrintNums.java class PrintNums { public static void main(String[] args)