【问题标题】:Java error: class, interface, or enum expectedJava 错误:需要类、接口或枚举
【发布时间】:2014-02-11 10:42:59
【问题描述】:

我需要知道这段代码的输出。但它不起作用。也许代码是错误的。 我仍在学习如何使用 Java,我尝试修复这个问题几个小时但仍然没有运气。

代码如下:

public class A 
{ 
    public A() 
    {
        System.out.println ("A");
    }
}
public class B extends A 
{
    public B() 
    {
        System.out.println ("B");
    }
}
public class C extends B 
{ 
    public C() 
    {
        System.out.println ("C");
    }
}

public static void main(String args[]) {

    A a = new A();  
    B b = new B();  
    C c = new C();  
}

谁能告诉我代码中有什么错误或遗漏?

【问题讨论】:

  • 代码的“输出”是无效代码。您的 main 方法不在类中。方法必须在类中 - 您希望它在哪个类中?请注意,如果您以更常规的方式格式化代码,则会更容易看到错误。
  • 尝试缩进你的代码并将你的大括号放在不同的行上。您很快就会发现问题。
  • 另外,一个文件中不能有多个公共类。并且文件名必须与公共类名相同。
  • 每个公共类必须在其自己的文件中,其名称与该类本身相同。满了吗?顺便说一句,这里也有编译器错误。

标签: java compiler-errors javac


【解决方案1】:

将你的主要方法放在一个类中。

Filename : DemoClass.java

class A 
{ 
    public A() 
    {
        System.out.println ("A");
    }
}
class B extends A 
{
    public B() 
    {
        System.out.println ("B");
    }
}
class C extends B 
{ 
    public C() 
    {
        System.out.println ("C");
    }
}

public class DemoClass {

   public static void main(String args[]) {

       A a = new A();  
       B b = new B();  
       C c = new C();  
   }
}

这里还有一点,一个文件中只能有公共类,所以你的ABC所有类不能在同一个java文件中是public

您的 java 文件名必须与公共类名相同。即这里DemoClass 是公共类,所以文件名将是DemoClass.java

Java 入门文档:getting started with java

【讨论】:

    【解决方案2】:

    例如:

    public class Example {
    
        public static void main(String...args) {
            new C();
        }
    
        public static class A {
            public A() {
                System.out.println("A");
            }
        }
        public static class B extends A {
            public B() {
                System.out.println("B");
            }
        }
        public static class C extends B {
            public C() {
                System.out.println("C");
            }
        }
    }
    

    另请注意,这可能不会打印出您所期望的内容。它实际上会打印:

    A
    B
    C
    

    为什么?构造函数总是链接到超类。

    【讨论】:

      【解决方案3】:

      您可以但不建议将类嵌套在文件中。这是完全有效的。

      在下面的输出中请注意,每个连续的子代都会隐式调用其父代的默认构造函数 (super())。

      我建议您创建文件:A.javaB.javaC.javaInheritenceTest.java

      public class InheritenceTest {
          public class A {
              public A() {
                  System.out.println("A");
              }
          }
      
          public class B extends A {
              public B() {
                  System.out.println("B");
              }
          }
      
          public class C extends B {
              public C() {
                  System.out.println("C");
              }
          }
      
          public static void main(String args[]) {
              InheritenceTest i = new InheritenceTest();
              A a = i.new A();
              B b = i.new B();
              C c = i.new C();
          }
      }
      

      输出:

      A
      A
      B
      A
      B
      C
      

      【讨论】:

        【解决方案4】:

        警告: 不建议在 1 个 java 文件中包含超过 1 个公共类。但是,如果您不使用“公共”标识符(或使用静态或在另一个类中),它仍然可以工作。但首先,我建议您将它们全部放在单独的文件中。

        错误: 您的主要方法不属于任何类。我建议您创建另一个包含公共静态 void main 方法的类来测试您的应用程序。

        信息:请注意继承,因为您的打印可能不是您所期望的。 (B类的构造函数调用A的构造函数,C类的构造函数调用B的构造函数,B又调用A的构造函数。

        这就是你得到的原因

        A
        A  
        B
        A
        B
        C
        
        *due to A() it prints A, then due to B() it prints A B and finally due to C() it prints A B C.
        

        在你的情况下,我会尝试以下方法:

        //Filename: A.java
        public class A { 
            public A() {
                System.out.println ("A");
            }
        }
        

        //Filename: B.java
        public class B extends A { 
            public B() {
                System.out.println ("B");
            }
        }
        

        //Filename: C.java
        public class C extends B { 
            public C() {
                System.out.println ("C");
            }
        }
        

        //Filename: Test.java
        //use a Test class for testing
        public class Test {
           public static void main(String args[]) {
               A a = new A();  
               B b = new B();  
               C c = new C();  
           }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-18
          • 1970-01-01
          • 2016-04-16
          • 1970-01-01
          • 2015-07-20
          相关资源
          最近更新 更多