Java - 包装问题

时间:2011-05-06 21:04:08

标签: java

我不是Java的新手,但我从未学过包。无论如何,假设我创建了一个名为maina的文件夹。

我将文件main.java放入文件夹maina

package maina;

import other.Dice;

public class main
{


    public static void main(String[] args)
    {

        System.out.println("Hello world!");
        System.out.println(Dice.test);
    }
}

然后我在文件夹other内创建一个名为maina的新文件夹。在文件夹other中,我放置了文件Dice.java

package other;

public class Dice
{

public Dice() {

        String test = "Testing!";
    }

}

好的,现在Dice.java编译得很好。 但是,当我编译main.java时,我收到此错误:

C:\Users\tekaffi\Documents\ask\maina\main.java:13: cannot find symbol
symbol  : variable test
location: class other.Dice
        System.out.println(Dice.test);
                               ^
1 error

Tool completed with exit code 1

我做错了什么?

这是我编译时遇到的错误:

C:\Users\wekaffi\Documents\ask\maina\myMain.java:3: package maina.other does not exist
import maina.other.Dice;
                  ^
C:\Users\wekaffi\Documents\ask\maina\myMain.java:13: cannot find symbol
symbol  : class Dice
location: class maina.myMain
        Dice myDice = new Dice();
        ^
C:\Users\wekaffi\Documents\ask\maina\myMain.java:13: cannot find symbol
symbol  : class Dice
location: class maina.myMain
        Dice myDice = new Dice();
                          ^
3 errors

Tool completed with exit code 1

7 个答案:

答案 0 :(得分:5)

它与包无关。

你的代码严重搞砸了,你试图在“骰子”类上调用“测试”成员,但你还没有创建该成员。除此之外,你不能有一个名为“main”的类,然后在其中有一个静态main方法,因为编译器认为主方法是你需要的构造函数将您的课程重命名为其他内容。

要让您的代码正常工作,您的Dice类需要如下所示:

package maina.other;

public class Dice
{

public String test;

public Dice() {

        this.test = "Testing!";
    }

}

要使打印工作,您需要在打印之前创建一个新的Dice 实例 无论是那个还是你让骰子静止。因此,您的主要需要重命名为myMain,然后该类应如下所示:

package maina;

import maina.other.Dice;

public class myMain
{


    public static void main(String[] args)
    {

        System.out.println("Hello world!");
        Dice myDice = new Dice();
        System.out.println(myDice.test);
    }
}

如果你把东西放在你所说的位置,它应该可以很好地打包

答案 1 :(得分:2)

您的Dice类必须具有类似的包声明

package maina.other;

你的主要课程应该像这样导入骰子

import maina.other.*;

答案 2 :(得分:1)

它是包maina.other,如果它在/ maina / other

答案 3 :(得分:1)

Dice需要public static string test。当前测试是构造函数的非静态局部变量。或者您可以使test非静态,然后让构造函数设置test成员,然后在new Dice().test

中执行main.java

包名无关紧要,文件夹只是一种惯例,编译器忽略了IIRC。所以这不是问题!

答案 4 :(得分:0)

当您将'other'包装在'maina'中时,新包装

package maina.other;

答案 5 :(得分:0)

package maina.other;

作为旁注,如果您使用的是像Eclipse这样的IDE,则不必手动创建目录 - 它会为您完成。使用包查看器导航包也很容易。

答案 6 :(得分:0)

这个很难解释,你提到你是Java的新手,所以请不要让我迷惑你。

顶级类型的包(例如mainDice)是包声明中列出的内容。 Dice的包可能只是other,即使相应的目录嵌套在与包amain对应的目录中。

关键是编译和运行时的资源发现。编译时,可以指定源路径和类路径,以帮助编译器解决依赖关系。同样,在运行时,您可以指定一个帮助JVM解析依赖关系的类路径。 root包没有相互嵌套的限制。因此,amainother都可以是root包,如下所示:

% cd <directory-that-contains-amain>
% javac -sourcepath .:amain amain/main.java amain/other/Dice.java
% java -classpath .:amain amain.main

然而,这被认为是异常(并因此很差)的做法。你不应该这样做,但你可以。