简单的java代码无法编译 - “在'java.lang'类型中创建类'对象'”

时间:2014-11-17 19:06:17

标签: java eclipse object compiler-errors

以下代码无法编译(使用eclipse Luna):

public class Main {
    public static void main(String[] args) {
        java.lang.Object Object = new java.lang.Object(); // Error line
        System.out.println(Object.class);
    }
}

class java {
    static lang lang;
}

class lang {
    static Object Object;
}

class Object {
    static java java;
}

Eclipse自动建议我"创建类'对象'在类型' java.lang'" ...

(我 DO 在构建路径中有JRE。)

那么,我的代码出了什么问题?

修改

错误在于取消和实例化状态。

编辑2:

实例化java仍会产生相同的错误:

public class Main {
    public static void main(String[] args) {
        java java = new java();
        java.lang.Object Object = new java.lang.Object();
        System.out.println(Object.class);
    }
}

class java {
    static lang lang = new lang();
}

class lang {
    static Object Object = new Object();
}

class Object {
    static java java = new java();
}

4 个答案:

答案 0 :(得分:3)

你的问题是,通过定义一个名为java的类,你已经改变了java.lang.Object的含义 - 所以编译器现在认为这是语义上不正确的东西,而是将其视为java.lang.Object类的名称。

不要创建一个名为java的课程。它打破了一切。

答案 1 :(得分:0)

  1. 使用Java的标准命名约定,即大写类,不要大写变量名称。
  2. java.lang.Object已经存在,因此无需编写

    class java {
        static lang lang;
    }
    
    class lang {
        static Object Object;
    }
    
    class Object {
        static java java;
    }
    
  3. 隐式导入
  4. java.lang,因此您无需说

    java.lang.Object object = new java.lang.Object();
    

    你可以说

    Object object = new Object();
    
  5. 最终代码:

    public class Main {
        public static void main(String[] args) {
            Object object = new Object();
            System.out.println(object.class);
        }
    }
    

答案 2 :(得分:0)

在这种情况下,您必须先实例化java才能访问其子项,从而导致不太优雅。

public static void main(String[] args) {
    Object Object = (new java()).lang.Object; // instantiate java, THEN call lang.Object
    System.out.println(Object.getClass());
}

这导致:

  

线程中的异常" main"显示java.lang.NullPointerException       在Test.main(Test.java:4)

由于lang null java位于lang内,因为您尚未宣布静态{{1}}的初始值。

答案 3 :(得分:0)

java被定义为本地作用域中的一个类,它优先于全局定义的java包。因此,当您的代码引用java.lang.Object时,编译器会将其理解为对lang类的静态Object属性的引用。对象是"对象"而不是类型,你的语法是非法的

java.lang.Object Object = new java.lang.Object();  //this is illegal because java.lang.Object is an object, not a type

Object o = java.lang.Object; //this is legal because you're just creating a reference to an object