Java - 无法查看包中的类

时间:2014-12-05 15:49:26

标签: java packages

我尝试创建一个包含一些类的包,但似乎我有一些可见性问题。

这是我的第一堂课:

package trees;

public class Tree{

private static final int HEIGHT;
private static final String NAME;

public Tree(){
    HEIGHT = 5;
    NAME = "Basic Tree";
}

public Tree(int a, String n){
    HEIGHT = a;
    NAME = n;
}

public static int getHeight(){
    return HEIGHT;
}

public static String getName(){
    return NAME;
}
}

这是我的第二堂课:

package trees;

public class Evergreen{

public static void main(String[] args){
    Tree first_tree = new Tree(20, "Fir");

    System.out.println(first_tree.getName());
    System.out.println(first_tree.getHeight());
}
}

但是当我编译时,终端给了我这些错误:

Evergreen.java:6: error: cannot find symbol
    Tree first_tree = new Tree(20, "Fir");
    ^
symbol:   class Tree
location: class Evergreen

Evergreen.java:6: error: cannot find symbol
    Tree first_tree = new Tree(20, "Fir");
                      ^
symbol:   class Tree
location: class Evergreen

这两个类位于名为“trees”的文件夹中。 我试图在Evergreen类中插入一个“实现树。*”,但没有任何改变。 我正在使用Mac Maverick,使用终端进行编译,Java是最新的。

我做错了吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

由于编译错误,您的构造函数无法访问,主要是因为您定义了添加修饰符的变量:final加上static关键字,

执行此操作时,需要指定默认值,否则会出现编译错误。

在您的构造函数中,您为final变量赋值,这在您在构造函数之前声明变量的方式中是不允许的,每个定义为final的变量都应该具有该值value,这是您为代码定义常量的方式。

我建议你检查最终和静态修饰符的两个概念:

static

final

如果您正在尝试创建一个简单的类来创建它的实例并使用它们的属性,那么您应该删除静态和最终修饰符,例如:

public class Tree {

    private  int height;
    private  String name;

    public Tree() {
        height = 5;
        name = "Basic Tree";
    }

    public Tree(int a, String n) {
        height = a;
        name = n;
    }

    public int getHeight() {
        return height;
    }

    public String getName() {
        return name;
    }

}

另外,尝试遵循用于定义变量的代码约定,如果变量是常量,肯定你可以用大写字母写它们,如果没有,你应该用较低的驼峰情况编写它:lowerCamelCase;例如:double baseSalary.

然后您可以为您的班级定义常量,例如:private static final int MAX_TREE_HEIGHT = 100;

答案 1 :(得分:1)

这不是可见性问题。基本上发生的事情是你有变量HEIGHT和NAME是最终变量。根据提到here的Java最终变量合约,

  

始终允许您初始化最终变量。编译器   确保你只能做一次。

您的代码中有2个问题,

  1. 初始化最终变量时,您没有提供任何值。
  2. 您正尝试在稍后的时间点为最终变量分配一些值
  3. 这两项都违反了上述合同。

    您可以尝试通过从变量修饰符中删除final来修改代码。

    package trees;
    
    public class Tree {
    
        private static int HEIGHT;
        private static String NAME;
    
        public Tree() {
            HEIGHT = 5;
            NAME = "Basic Tree";
        }
    
        public Tree(int a, String n) {
            HEIGHT = a;
            NAME = n;
        }
    
        public static int getHeight() {
            return HEIGHT;
        }
    
        public static String getName() {
            return NAME;
        }
    }
    

答案 2 :(得分:0)

尝试

package trees;

public class Tree {

    private final int HEIGHT;
    private final String NAME;

    public Tree() {
        HEIGHT = 5;
        NAME = "Basic Tree";
    }

    public Tree(int a, String n) {
        HEIGHT = a;
        NAME = n;
    }

    public int getHeight() {
        return HEIGHT;
    }

    public String getName() {
        return NAME;
    }
}


package trees;

    public class Evergreen{

    public static void main(String[] args){
        Tree first_tree = new Tree(20, "Fir");

        System.out.println(first_tree.getName());
        System.out.println(first_tree.getHeight());
    }
    }