have_to_be 2023-09-04 17:06 采纳率: 59.1%
浏览 3
已结题

package的编译问题


package day14;

import java.io.*;
class Apple implements Serializable{
    private String name;
    private String color;
    private double weight;
    
    public Apple() {
        super();
    }

    public Apple(String name, String color, double weight) {
        super();
        this.name = name;
        this.color = color;
        this.weight = weight;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getColor() {
        return color;
    }
    
    public void setColor(String color) {
        this.color = color;
    }
    
    public double getWeight() {
        return weight;
    }
    
    public void setWeight(double weight) {
        this.weight = weight;
    }
    
    public String toString() {
        return "Apple[name=" 
                + name +",color=" + color
                + ",weight=" + weight + "]";
    }
}

public class WriteObject {
    public static void main(String[] args) {
        Apple ap = new Apple("红富士", "红色", 3.4);
        System.out.println(ap);
        
        // 当程序结束时,虚拟机退出,内存中的Apple对象就被销毁了
        try (
            ObjectOutputStream oos = new ObjectOutputStream(
                    new FileOutputStream("app.bin"));
        ) 
        {
            oos.writeObject(ap); //把ap对象写入app.bin文件中
        }
        catch (Exception ex) {
            // TODO: handle exception
        }
    }
}

问题1:为什么直接在eclipse上运行无法在当前文件夹下生成app.bin?
使用javac编译运行会找不到主类

img


去掉package day14后使用javac编译运行后才可以在当前文件夹下生成app.bin

img


如果必须要在eclipse上运行,则bin.app必须写完整路径

img

问题2:在同一个包中新建一个类ReadObject,使用WriteObject定义的类Apple,同样使用javac编译,结果怎么样都是找不到符号Apple(除非把两个类中的package day14都去掉)。

package day14;

import java.io.*;
public class ReadObject {
    public static void main(String[] args) {
        try (
            ObjectInputStream ois = new ObjectInputStream(
                    new FileInputStream("app.bin"));
        )
        {
            Apple ap = (Apple)ois.readObject();
            System.out.println(ap);
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

img

两个类都不去掉package day14,在eclipse上又可以正常运行了。这是怎么回事?

img

  • 写回答

2条回答 默认 最新

  • Leodong. 2023-09-04 17:26
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

    问题1:为什么直接在Eclipse上运行无法在当前文件夹下生成app.bin?

    在Eclipse中直接运行程序时,默认的当前工作目录可能与你所期望的不同。通常情况下,Eclipse运行程序时会使用项目的根目录作为当前工作目录,而不是源代码文件所在的目录。因此,当你使用相对路径来指定文件路径时,可能无法在当前文件夹下生成app.bin。

    解决这个问题的一种方法是在Eclipse中设置当前工作目录。你可以按照以下步骤进行操作:

    1. 右键单击项目,在弹出菜单中选择"Properties"(属性)。
    2. 在属性窗口中,选择"Run/Debug Settings"(运行/调试设置)。
    3. 选择你的运行配置文件,然后点击"Edit"(编辑)按钮。
    4. 在"Arguments"(参数)选项卡中,可以看到"Working directory"(工作目录)部分。选择"Other"(其他)并指定你希望的当前工作目录。
    5. 点击"Apply"(应用)和"OK"(确定)保存更改。

    通过设置当前工作目录,你应该能够在Eclipse中直接运行程序时,在当前文件夹下生成app.bin。

    问题2:在同一个包中新建一个类ReadObject,使用WriteObject定义的类Apple,同样使用javac编译,结果怎么样都是找不到符号Apple(除非把两个类中的package day14都去掉)。

    在Java中,如果你定义了一个类在某个包中,其他类要使用该类时,需要使用完整的包名加上类名来引用。在你的情况下,WriteObject类和ReadObject类都在day14包中,因此在ReadObject类中使用Apple类时,应该使用完整的包名day14.Apple。

    以下是修改后的ReadObject类的代码示例:

    package day14;
    
    import java.io.*;
    
    public class ReadObject {
        public static void main(String[] args) {
            try (
                ObjectInputStream ois = new ObjectInputStream(
                        new FileInputStream("app.bin"));
            )
            {
                day14.Apple ap = (day14.Apple) ois.readObject();
                System.out.println(ap);
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    

    通过使用完整的包名day14.Apple,你应该能够在同一个包中正常引用WriteObject中定义的Apple类。

    希望这些解释能帮助你理解并解决问题。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月15日
  • 已采纳回答 10月7日
  • 修改了问题 9月4日
  • 创建了问题 9月4日