Java-Can';在包中看不到类

Java-Can';在包中看不到类,java,packages,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;

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

这是我的第一节课:

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类中插入一个“implementtrees.*”,但没有任何变化。 我用的是MacMaverick,用终端编译,Java是最新的

我做错什么了吗

谢谢你的帮助。

试试看

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;
    }
}


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

当您这样做时,您需要指定一个默认值,否则您将得到一个编译错误

在构造函数中,您为
final
变量赋值,这是在构造函数之前声明变量时不允许的,每个定义为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;例如:
双基工资。


然后,您可以为类定义常量,比如:
private static final int MAX_TREE_HEIGHT=100

这不是可见性问题。基本上,你有变量HEIGHT和NAME,它们是最终的变量。根据提到的Java最终变量合同

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

代码中有两个问题

  • 初始化最终变量时不提供任何值
  • 您正试图在稍后的时间点将一些值赋给最终变量
  • 这两项都违反了上述合同

    您可以尝试通过从变量修饰符中删除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;
        }
    }
    

    除了
    高度
    名称
    是非静态的之外,在主方法中,
    应该替换为
    第一棵树
    。请注意,这不符合camelCase惯例。很好的一点,没有看到它,谢谢!如果要删除
    静态
    ,为什么要删除
    最终
    ?允许在构造函数中初始化
    final
    字段。是的,允许您这样做,我不是说禁止您这样做,我没有正确解释。谢谢PD:我删除了“final”,因为我遵循了我附加的关于如何使用“final”的链接中的指示。仅此而已,如果你认为有必要的话,你就可以使用期末考试,但要记住,如果你想在以后的课程中加入Stestter,你就做不到。就这些,谢谢你的回答!但是,即使现在类树是正确的,并且编译时没有错误,终端仍然会给我这两个错误,因为它在编译Evergreen时看不到这两个错误。尝试重新清理和构建项目并重新编译类。我尝试在Eclipse中用包重新创建类,所有工作都很好,显然,除了一些语法错误外,问题在于终端的java编译器。我希望有一天我能把它修好。不过,非常感谢大家的支持!谢谢你的回答!然而,即使现在类树是正确的,并且编译时没有错误,终端仍然会给我这两个错误,因为它在编译Evergreen时看不到。Evergreen中的错误可能在那里,因为,1。您已经用标识符(名称)初始化了第一棵树上的对象,并且正在尝试访问具有树标识符的对象。因此,System.out.println(tree.getName());将是System.out.println(first_tree.getName());二,。可能是因为您试图使用对象引用访问静态方法。静态方法在类的上下文中工作,而不是在对象的上下文中工作。因此,System.out.println(first_tree.getName());将再次是System.out.println(Tree.getName());。我试图用Eclipse中的包重新创建这些类,所有的工作都很好,所以很明显,除了一些语法错误之外,问题出在终端的java编译器上。我希望有一天我能把它修好。不过,非常感谢大家的支持!
    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;
        }
    }