📜  在Java中将预定义的类名用作类或变量名

📅  最后修改于: 2020-02-12 14:23:09             🧑  作者: Mango

在Java中,允许使用预定义的类名作为类名或变量名。但是,根据Java规范语言(第3.9节),在Java中进行命名的基本规则是,不能将关键字用作类的名称、变量的名称或用于包的文件夹的名称。
在Java中使用任何预定义类都不会引起编译器错误,因为Java预定义类不是关键字。
以下是Java中的一些无效变量声明:

boolean break = false; // 不被允许,break是关键字
int boolean = 8; // 不被允许,boolean是关键字
boolean goto = false; // 不被允许,goto是关键字
String final = "hi"; // 不被允许,final是关键字

我们可以在程序中将类名作为预定义的类名之一吗?
答:是的,我们可以。以下是将Number用作用户定义的类的示例

// Number是一个预定义名称,存在于java.lang包中
// 注意 : java.lang在默认情况下,被所有java程序导入
public class Number
{
    public static void main (String[] args)
    {
        System.out.println("芒果文档");
    }
}

输出:

芒果文档

使用字符串作为用户定义的类:

// String 是一个预定义名称,存在于java.lang模块中
// 注意 : java.lang在默认情况下,被所有java程序导入
public class String
{
    public static void main (String[] args)
    {
        System.out.println("程序很困惑");
    }
}

但是,在这种情况下,您将得到如下运行时错误:

Error: Main method not found in class String, please define
the main method as:
   public static void main(String[] args)

说明:这是因为Main线程正在寻找具有预定义String类数组参数的main method()。但是在这里,它得到了带有用户定义的String类的main method()。每当主线程看到类名时,它都会尝试按作用域搜索该类作用域。首先它将搜索在您的程序中出现的,然后搜索在您的程序包中出现的; 如果未找到,则JVM遵循委托层次结构原理来加载该类,因此将出现运行时错误。
 
要运行上述程序,我们还可以提供String类的完整路径,即java.lang.String

// String 是一个预定义名称,存在于java.lang模块中
// 注意 : java.lang在默认情况下,被所有java程序导入
public class String
{
    public static void main (java.lang.String[] args)
    {
        System.out.println("程序很困惑");
    }
}

输出:

程序很困惑

使用预定义的类名作为用户定义的变量名

我们可以在程序中将变量名作为预定义的类名之一吗?
答:是的,我们可以。

// Number是一个预定义名称,存在于java.lang模块中
// 注意 : java.lang在默认情况下,被所有java程序导入
public class Number
{
    // instance variable
    int Number = 20;
    public static void main (String[] args)
    {
        // reference variable
        Number Number = new Number();
        // printing reference
        System.out.println(Number);
        // printing instance variable
        System.out.println(Number.Number);
    }
}

输出:

Number@15db9742
20