2017-03-08 3 views
0

Ich erforsche einige Beispielcode, und ich fand den folgenden Code:Java statischen Zugriff auf Super

A LoginService Schnittstelle:

public interface LoginService extends Serializable { 

     default boolean isLoggedIn (final HttpServletRequest req) { 

      return null != PortalUtil.getUserId(req); 
     } 
} 

A LoginServiceFactory, die eine verschachtelte LoginServiceImpl Klasse enthält, die LoginService implementiert

public class LoginServiceFactory implements Serializable { 

    private volatile LoginService loginService = null; 

    private final class LoginServiceImpl implements LoginService { 

      @Override 
      public boolean isLoggedIn(final HttpServletRequest req) { 

       /** this is the part I don't understand */ 
       return LoginService.super.isLoggedIn(req); 
      } 
    } 
} 

Ich verstehe nicht, welche Methode in LoginService.super.isLoggedIn(req) aufgerufen wird. Von meinem Verständnis ruft es isLoggedIn(req) der Super-Schnittstelle der Schnittstelle LoginService. Aber ich denke, das ist nicht richtig, da die Superschnittstelle Serializable ist. Kann mir jemand helfen?

BEARBEITEN Ich habe meine Frage mit einem vollständigen Beispiel bearbeitet. Ich denke nicht, dass es wirklich doppelt ist, weil dieses Beispiel ein bisschen komplexer ist als die, die ich auf dieser Seite gefunden habe.

+0

es ist keine statische Referenz, so viel wie es eher eine „voll qualifiziert“ Referenz ist. – Rogue

+0

Es ist kein statischer Zugriff, es ist nur ein Qualifier, der explizit angibt, auf welche Klasse Sie zugreifen möchten. Es ist nützlich, wenn Sie versuchen, die äußere Klasse innerhalb einer inneren Klasse zu referenzieren. – 4castle

+0

Wenn Sie sich den Kontext ansehen, in dem dieser Anruf stattfindet, würde es Ihnen (und uns) helfen, die Erklärung zu finden. –

Antwort

0

, wenn Sie in einer inneren Klasse sind dabei

super.foo(); Foo() Methode der Superklasse der inneren Klasse

Aufruf

Outer.super.foo(), rufen; wird die foo() - Methode der Superklasse der äußeren Klasse namens Outer aufrufen.

wie in

class Outer extends OuterSuper { 
    class Inner { 
     public void someMethod() { 
      Outer.super.foo(); 
     } 
    } 
}