【问题标题】:Why wouldn't this code run in Java? Eror : <identifier> expected为什么这段代码不能在 Java 中运行?错误:预期 <标识符>
【发布时间】:2021-09-16 19:00:15
【问题描述】:

要调用内部类的函数,我只需要一个内部类的对象。但是如果我已经创建了对象,为什么我不能在任何我想要的地方调用内部类的方法?试图暗示的错误是什么?

class Outer 
{
    int x;
    
    class Inner // creating an Inner class
    {
        public void display()
        {
            System.out.println("Hello from Inner class"+x);
        }
    }
    
    Inner i = new Inner();
    i.display(); // This is where the error comes. Why do I have to create a method to call
                 // methods of my inner class. Why Can't I call it anywhere I want?
}


public class Main
{
    public static void main(String[] args) 
    {
        System.out.println("Hello World");
    }
}

【问题讨论】:

  • 什么时候你希望i.display()运行?!
  • Inner i = new Inner(); i.display(); 移动到main
  • 既然您了解您需要创建一个方法或一个块,您已经知道如何解决您的问题。那么实际的问题是什么?
  • 我知道如何修复它,我也知道我不能调用或使用那行代码,除非我把它移到一个方法中。但我知道这是因为我有大脑,而编译器没有。那么为什么编译器会拒绝这段代码呢?
  • @nSack 出于同样的原因,编译器将拒绝 public void doInt(int a) -> doInt("clearly not a primitive")。它检查您的代码是否有效。如果不是,则无法编译。

标签: java class oop inner-classes


【解决方案1】:

那么为什么编译器会拒绝这段代码呢?

因为代码在语法上与 Java 一样无效,并且 Java 编译器需要拒绝无效代码。

Java 语言规范说,唯一可以立即嵌套在类中的是成员声明或初始化块。成员声明是:

  • 字段声明
  • 嵌套类、接口、枚举等
  • 方法
  • 构造函数

初始化程序块是 static 初始化程序块或实例初始化程序块。

一个典型的语句(比如你试图插入的那个)既不是成员声明也不是块。


Java 语言规范的相关部分是JLS 8.1.6

【讨论】:

  • 但是为什么在 main() 函数中放入相同的 2 行代码就可以了?
  • 这是一个不同的问题。但如果你问为什么它在语法上是有效的,答案是方法体中允许的语法规则与类体的规则不同
  • 如果你问为什么规则不同......嗯,基本上是因为这就是语言的设计方式。理由是没有实际意义的。如果你想让你的 Java 编译,你必须遵循 Java 语法规则。
  • 谢谢。出于某种原因,我直接将我的外部类与主类相关联,完全忽略了写在主类中的内容实际上是在 main() 方法中的事实。我知道这是一个愚蠢的疑问,但非常感谢您清除它。
【解决方案2】:

您正试图直接在类主体中运行一段代码。类的主体只能用于初始化和函数创建。 Java 所做的是遍历类的所有创建成员并初始化它们,就像您对 Inner i = new Inner() 所做的那样。

要运行一段代码,它必须在一个函数中,并且这个函数必须被调用!一个很好的例子是main() 函数。你在里面写的任何东西都会被执行,因为这个函数会在程序运行后立即被调用。

但是如果在函数中间抛出错误,你也应该知道执行会被中断,命令不会执行到最后。

【讨论】:

  • 这就是为什么在 main() 函数中使用相同的代码[在类 Outer 中给我错误] 将不再给我错误吗?因为 main() 函数是自动调用的,而我的 Outer 函数不是?
  • @nSack 完全正确。编译器不会抛出错误,因为允许在另一个函数中调用函数。是的,main() 将在程序运行后立即被调用,所有其他类函数都不会!除非它们在执行链中的某处被显式调用,始终从 main() 开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
相关资源
最近更新 更多