Java 什么是';这';应用程序子类中onCreate方法的平均值

Java 什么是';这';应用程序子类中onCreate方法的平均值,java,android,Java,Android,在下面的示例中,“this”用于初始化sinstance public class MyApplication extends Application { public static MyApplication sinstance; @Override public void onCreate() { super.onCreate(); sinstance=this; } 据我所知,“this”指的是对对象当前实例的

在下面的示例中,“this”用于初始化
sinstance

public class MyApplication extends Application
{
    public static MyApplication sinstance;

    @Override
    public void onCreate()
    {
        super.onCreate();
        sinstance=this;  
    }
据我所知,“this”指的是对对象当前实例的引用。如果我错了,请纠正我。现在考虑下面的程序

public static MyApplication sinstance;

@Override
public void onCreate()
{
    super.onCreate();
    sinstance=new MyApplication();
}
newmyapplication
用于实例化
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)

第二个例子是创建一个永无止境的循环。每次实例化一个新的MyApplication时,都会运行其onCreate方法,并递归创建另一个版本


第一个类中的
this
是MyApplication类的实例化版本,您不需要创建新的。

正如Jahnold所回答的,当您尝试在
onCreate()
中新建实例时,新实例也将尝试调用其
onCreate()
,因此,循环永远不会结束


但在第一种情况下,当您将
this
赋予成员变量时,“this”只是一个引用,因此不会调用构造方法,也不会调用像
onCreate()
这样的生命周期方法,所以它工作得很好。

您将静态实例设置为当前实例,在当前实例上调用onCreate方法,因为您正在递归地创建
MyApplication
的新实例。每次调用
newmyapplication()
都会导致
sinstance=newmyapplication(),它将一直持续到您退出memeory。当您调用
sinstance=this
时,您没有明确地创建一个新对象,因此您的代码不会陷入无限的任务中。