Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是软接触的物体?_Java_Garbage Collection_Soft References - Fatal编程技术网

Java 什么是软接触的物体?

Java 什么是软接触的物体?,java,garbage-collection,soft-references,Java,Garbage Collection,Soft References,我试图通过这篇“Java中的软引用”文章来研究软引用的含义: 我理解这篇文章的问题是,它通过术语“软可达对象”定义了术语“软引用”,但我不知道“软可达对象”是什么意思 也就是说,堆中的对象要么有对它的引用,要么没有,对吗 引用要么指向有效对象,要么为null,对吗 什么时候一个对象变得“柔和地”可到达 还是我完全弄错了?强引用、软引用和弱引用 Student strongReference = new Student(); WeakReference<Student> weak

我试图通过这篇“Java中的软引用”文章来研究软引用的含义:

我理解这篇文章的问题是,它通过术语“软可达对象”定义了术语“软引用”,但我不知道“软可达对象”是什么意思

也就是说,堆中的对象要么有对它的引用,要么没有,对吗

引用要么指向有效对象,要么为null,对吗

什么时候一个对象变得“柔和地”可到达


还是我完全弄错了?

强引用、软引用和弱引用

Student strongReference = new Student(); 

WeakReference<Student> weakReference = new WeakReference<>(strongReference);
因此,避免将从
get()
方法返回的非null对象作为静态变量或实例变量的弱引用或软引用,否则它只会破坏这些变量的使用。如果需要以弱引用或软引用的形式存储静态或实例变量,那么最好使用其中任何一种方法。当您需要使用
get()
时,请检查NOTNULL并仅用作本地变量。如果可能,只传递给其他方法弱引用或软引用

WeakReference和SoftReference之间的区别在不同的链接中得到了很好的解释,其中一个链接是:

p.S.WeakReference和SoftReference对象类型的引用是强引用的,如果没有强引用可用,则是弱或软可访问的包装对象(可以使用
get()
检索对象)。
WeakReference weakRefOfStudent=newweakreference(newstudent())

weakRefOfStudent
是类型为
WeakReference.java
的强引用,并且可以每周访问Student类型堆中的对象。可通过
weakrefstudent.get()
访问该对象。如果它已被垃圾收集或未被垃圾收集,则它可能为空,也可能不为空


这只是为了澄清可能出现的疑问

我认为这篇链接文章在第一句话中很好地解释了这一点。软引用和软可及对象在这里是同义的

因此,对你的问题的正确答案是,“软可及对象是仅由软引用引用的对象”


关于软引用的性质,这篇文章比我在这里的一些段落中解释得更好。

“软可及对象没有指向它的强引用”。@luk2302是的,我注意到文章中的这句话,但它是什么意思?我想我理解强引用(普通引用)的含义,但之前由强引用指向的对象是否可以“软可达”@dbl您提供的链接中的可达性部分对此进行了解释。非常感谢。如果你把这个作为一个答案,我会接受的。没有必要,祝你学习顺利。这是一个很好的话题,也许有些人会添加一个更广泛的答案,你应该接受……这根本没有回答OPs问题,也没有解释这些参考的性质以及如何(正确地)回答使用它们-而不仅仅是创建它们。@nits.kk感谢您提供了强引用、弱引用和软引用的清晰示例。对象是否只有通过
新的SoftReference(…)
才能“软访问”?@非常客观我已经编辑了我的答案。希望它能帮助我们接受。我只想添加以下两个链接,进一步澄清我的误解:1。2.是的,这里有很多对你有帮助的链接。我第一次遇到这些术语是在我开始使用Android时。有太多与记忆有关的问题,我开始寻找这些术语。如果我的回答对您有帮助,您可以将其标记为已接受。您必须区分软引用(软引用的一个实例
软引用
)及其引用对象(可通过封装引用访问的对象)。后者是软可及的对象。然而,并非每个软可及对象都是
软引用的引用对象。它们可以从另一个软可及对象间接可及。
Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);
Student stRef = new Student();
SoftReference <Student> sfRef = new SoftReference<>(stRef);
stRef = null;
SoftReference <Student> sfRef = new SoftReference<>(new Student());
Student strongReference = new Student(); 

SoftReference<Student> softReference = new SoftReference<>(strongReference);
 strongReference = null; // object in heap is softly reachable now
 Student anotherStrongReference = softReference.get();
 if(anotherStrongReference != null){
      // you have a strong reference again
 }