对变量名有任何限制,以免它与包名冲突吗?

时间:2015-02-13 11:47:56

标签: java variable-names package-name

假设我在测试包中有一个Test类:

package test;

public class Test {

    private static int clarying=20;

    public static void main(String[] args) {
        clarying.Product.display(clarying); // this line is giving error 
                                            // The primitive type int of
                                            // clarying does not have a field Product
    }
}

假设我在澄清包中有另一个类产品:

package clarying;

public class Product {
    private static int test;

        public static void display(int data) {
            test = data;
            System.out.println(test);
        }
}

我编译了Product类,现在我正在尝试编译Test类,但它抛出了一个编译器错误:

 Exception in thread "main" java.lang.Error:
 Unresolved compilation problem:  
 The primitive type int of clarying does not have a field Product
  at test.Test.main(Test.java:5)

问题符合:

clarying.Product.display(clarying);

因为变量名称在Test类中是明确的,所以与包名称clarying 相同。所以,当我写 clarying.Product 时,它正在 clarying 类变量中搜索字段产品

我只想澄清:是否有任何规则禁止定义与包名称相同的变量?

2 个答案:

答案 0 :(得分:4)

您可以在此处阅读完整规则:6.4.2. Obscuring

  

一个简单的名称可能出现在上下文中,它可能被解释为变量,类型或包的名称。在这些情况下,§6.5的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包。因此,有时可能无法通过其简单名称引用可见类型或包声明。我们说这样的声明是模糊的。

答案 1 :(得分:1)

是的,有规则。编译器认为您的意思是字段clarying。它无法知道你实际意味着包,我不认为有办法告诉它你的意思是包(它必须是this,但意味着包根而不是当前的实例)。由于该字段只是int,您将收到错误。

如果你想绕过那只是导入Product类:

package test;

import clarying.Product;

public class Test{
    private static int clarying=20;

    public static void main(String[] args) {
        Product.display(clarying);
    }
}

但是,您应该重新考虑变量的名称,因为这会引起相当多的混淆,尤其是当其他人试图读取您的代码时。