如何在 Java 中复制对 File 对象的引用
How to copy a reference to a File object in Java
File file = new File ("image.gif");
// Is this a copy, a reference, or something else?
File File2 = file;
我想做的是复制对 File 对象的引用。我不想复制,我不确定上面的代码是复制引用还是复制对象。我试图避免内存泄漏或孤儿,尤其是当我要从代码中删除文件时。
谢谢。
您刚才所做的是:您创建了另一个变量 File2
,它指向 堆 上完全相同的对象。 没有创建新对象!
如果您要操作任何变量,您将操作 堆 上的相同对象。在此过程中不会创建新的。仅使用 new
关键字(或一些反射,但现在超出范围)创建一个新对象。
此外,请务必阅读变量创建位置、对象在程序运行时驻留的位置以及什么是 heap 和 stack (搜索:"java heap vs stack")。
一个File
对象是
An abstract representation of file and directory pathnames.
这只是一个奇思妙想 String
(具有与文件系统交互的方法)。
file
是一个变量。变量保存值。由于这是一个引用类型变量,它保存着引用值。
new File ("image.gif");
是创建新对象并产生引用值(引用新创建的对象)的表达式。
File2
是另一个变量。当您执行作业时
File File2 = file;
存储在file
中的值被复制,副本存储在File2
中。
这与将参数值绑定到方法参数的概念相同,讨论于:
- Is Java "pass-by-reference" or "pass-by-value"?
复制文件对象:
File f = new File("home/users", "alice/documents");
File copied = new File(f.getPath());
System.out.println(copied.equals(f)); // true
System.out.println(copied == f); // false
通常,这是没有必要的。但是它可能有用的一种情况是,当您在子类化 java.io.File:
时需要 File 的构造函数
public class MyFile extends File {
public MyFile(File path) {
super(path.getPath());
}
// ...
File file = new File ("image.gif");
// Is this a copy, a reference, or something else?
File File2 = file;
我想做的是复制对 File 对象的引用。我不想复制,我不确定上面的代码是复制引用还是复制对象。我试图避免内存泄漏或孤儿,尤其是当我要从代码中删除文件时。
谢谢。
您刚才所做的是:您创建了另一个变量 File2
,它指向 堆 上完全相同的对象。 没有创建新对象!
如果您要操作任何变量,您将操作 堆 上的相同对象。在此过程中不会创建新的。仅使用 new
关键字(或一些反射,但现在超出范围)创建一个新对象。
此外,请务必阅读变量创建位置、对象在程序运行时驻留的位置以及什么是 heap 和 stack (搜索:"java heap vs stack")。
一个File
对象是
An abstract representation of file and directory pathnames.
这只是一个奇思妙想 String
(具有与文件系统交互的方法)。
file
是一个变量。变量保存值。由于这是一个引用类型变量,它保存着引用值。
new File ("image.gif");
是创建新对象并产生引用值(引用新创建的对象)的表达式。
File2
是另一个变量。当您执行作业时
File File2 = file;
存储在file
中的值被复制,副本存储在File2
中。
这与将参数值绑定到方法参数的概念相同,讨论于:
- Is Java "pass-by-reference" or "pass-by-value"?
复制文件对象:
File f = new File("home/users", "alice/documents");
File copied = new File(f.getPath());
System.out.println(copied.equals(f)); // true
System.out.println(copied == f); // false
通常,这是没有必要的。但是它可能有用的一种情况是,当您在子类化 java.io.File:
时需要 File 的构造函数public class MyFile extends File {
public MyFile(File path) {
super(path.getPath());
}
// ...