以下示例'这个'用于初始化sinstance
。
public class MyApplication extends Application
{
public static MyApplication sinstance;
@Override
public void onCreate()
{
super.onCreate();
sinstance=this;
}
据我所知'这个'指的是对象的当前实例的引用。如果我错了,请纠正我。现在考虑以下程序
public static MyApplication sinstance;
@Override
public void onCreate()
{
super.onCreate();
sinstance=new MyApplication();
}
new MyApplication
用于实例化sinstance
。那么为什么第二个程序在运行时崩溃,而第一个程序不会产生任何错误。它给出了以下错误:
12-16 17:56:09.559 2156-2156/compdom.sad E/art: Throwing OutOfMemoryError "Failed to allocate a 10439248 byte allocation with 5527284 free bytes and 5MB until OOM"
12-16 17:56:09.559 2156-2156/compdom.sad E/AndroidRuntime: Error reporting crash
java.lang.OutOfMemoryError: Failed to allocate a 10439248 byte allocation with 5527284 free bytes and 5MB until OOM
at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:125)
at java.lang.StringBuffer.append(StringBuffer.java:278)
at java.io.StringWriter.write(StringWriter.java:123)
at com.android.internal.util.FastPrintWriter.flushLocked(FastPrintWriter.java:358)
at com.android.internal.util.FastPrintWriter.appendLocked(FastPrintWriter.java:303)
at com.android.internal.util.FastPrintWriter.write(FastPrintWriter.java:625)
at com.android.internal.util.FastPrintWriter.append(FastPrintWriter.java:658)
at java.io.PrintWriter.append(PrintWriter.java:691)
at java.io.PrintWriter.append(PrintWriter.java:31)
at java.lang.Throwable.printStackTrace(Throwable.java:324)
at java.lang.Throwable.printStackTrace(Throwable.java:300)
at android.util.Log.getStackTraceString(Log.java:335)
at com.android.internal.os.RuntimeInit.Clog_e(RuntimeInit.java:59)
at com.android.internal.os.RuntimeInit.access$200(RuntimeInit.java:43)
at com.android.internal.os.RuntimeInit$UncaughtHandler.uncaughtException(RuntimeInit.java:85)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
答案 0 :(得分:5)
第二个例子是创建一个永无止境的循环。每次实例化一个新的MyApplication时,都会运行onCreate方法,并以递归方式创建另一个版本。
第一个中的this
是MyApplication类的实例化版本,您无需创建新版本。
答案 1 :(得分:2)
正如Jahnold回答的那样,当您尝试在onCreate()
中新建一个实例时,新实例也会尝试调用其onCreate()
,因此,循环将永远不会结束。
但是在第一种情况下,当你将this
赋予成员变量时,'this'只是一个引用,因此不会调用任何构造方法,也不会调用像onCreate()
这样的生命周期方法,所以它工作正常。