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

该回答通过自己思路及引用到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类。

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


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

【以下回答由 GPT 生成】

这段代码的作用是将Apple对象序列化并保存到文件中。

Apple类有以下成员变量: - name:苹果的名称,类型为字符串 - color:苹果的颜色,类型为字符串 - weight:苹果的重量,类型为双精度浮点数

Apple类有以下方法: - 构造方法Apple():构造一个空的Apple对象 - 构造方法Apple(String name, String color, double weight):构造一个具有指定名称、颜色和重量的Apple对象 - getName():返回苹果的名称 - setName(String name):设置苹果的名称 - getColor():返回苹果的颜色 - setColor(String color):设置苹果的颜色 - getWeight():返回苹果的重量 - setWeight(double weight):设置苹果的重量 - toString():返回一个包含苹果名称、颜色和重量的字符串表示形式

WriteObject类有以下方法: - serializeObject(Apple apple):将指定的Apple对象序列化并保存到文件中 - main(String[] args):一个包含序列化示例的main方法。在这个示例中,创建了一个Apple对象,然后调用serializeObject方法将其序列化并保存到文件中。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^