Both AppClassLoader and SystemClassLoader same.
Look at the hierarchy.
ClassLoader follows three principles.
Delegation principle

Bootstrap ClassLoader is responsible for loading the standard JDK class files from rt.jar and is the parent of all class loaders in Java. The bootloader of the Bootstrap class has no parents.
Extension ClassLoader delegates the class loading request to its parent element, Bootstrap, and if it fails, loads the jre / lib / ext class directory or any other directory specified by the java.ext.dirs system property
System or Application class loader , and it is responsible for loading specific application classes from the CLASSPATH, -classpath or -cp command line environment variable, the Class-Path attribute of the manifest file inside the JAR.
The application class loader is a child of the Extension ClassLoader and is implemented by the sun.misc.Launcher$AppClassLoader .
Except Bootstrap class loader , which is implemented in the native language, mainly in C, all Java class loaders implemented using java.lang.ClassLoader .
Take a look at the blog for a better understanding of these three class loaders.
Visibility principle
In accordance with the principle of visibility, Child ClassLoader can see the class loaded by Parent ClassLoader but vice-versa is not true .
If the Abc class is loaded using the Application class loader , than trying to load the ABC class explicitly using the Extension ClassLoader , it will throw java.lang.ClassNotFoundException
Principle of uniqueness
In accordance with this principle, the class loaded by the parent should not be loaded again by Child ClassLoader