2015-12-14 2 views
-1

Existe-t-il une différence de sécurité/d'accès lorsque les méthodes non statiques d'une classe abstraite de niveau d'accès au package sont rendues publiques par opposition à la protection de ces classes? Seules les classes du même package qui étendent la classe abstraite peuvent accéder aux méthodes non statiques de toute façon, n'est-ce pas? Alors, est-ce important que ces méthodes non statiques soient publiques ou protégées puisque la classe abstraite elle-même impose des restrictions sur qui peut l'étendre?Méthode de classe abstraite publique ou protégée

abstract class MyClass { 
    protected void myFunction(){ 
     System.out.println("Only child classes can print this"); 
    } 
} 

abstract class MyClass { 
    public void myFunction(){ 
     System.out.println("Still, only child classes can print this"); 
    } 
} 
+1

Je ne pense pas que ce soit le cas. Je suis à peu près sûr de comprendre la différence entre eux en fonction des définitions trouvées dans les docs Oracle et que ma question concerne un cas spécifique où les niveaux d'accès aux classes rendent les niveaux d'accès aux méthodes sans signification (sauf privé). Je pourrais mal le comprendre cependant. – Region39

Répondre

3

Le public abstract method sera accessible dans l'autre paquet alors que le protected abstract method ne peut pas être consulté. Vérifiez l'exemple ci-dessous.

Une classe abstraite avec les deux méthodes abstraites publiques et protégées

package package1; 

public abstract class MyClass { 
    abstract protected String method1(); 
    abstract public String method2(); 
} 

Un autre paquet qui étend la classe et met en œuvre la classe abstraite.

package package2; 

import package1.MyClass; 

public class MyClassImpl extends MyClass { 
    @Override 
    protected String method1() { 
    return "protected method"; 
    } 

    @Override 
    public String method2() { 
    return "public method"; 
    } 
} 

Classe principale pour accéder à la méthode abstraite.

package package2; 

import package1.MyClass; 

public class MainClass { 
    static MyClass myClass = new MyClassImpl(); 

    public static void main(String[] args) { 
    System.out.println(myClass.method1()); // This is compilation error. 
    System.out.println(myClass.method2()); 
    } 
} 
+0

Il y a une légère différence avec votre exemple. Votre classe abstraite est 'public'. Alors que ma classe abstraite a un niveau d'accès "aucun modificateur". Donc, il ne peut pas être étendu par des classes en dehors de son paquet de toute façon. – Region39

+2

@Kyle Oui, c'est vrai. Il ne sera pas accessible en dehors du package défini. Ensuite, la méthode protégée ou publique n'apparaît même pas dans l'image, car elle ne peut pas être étendue en dehors du package. – YoungHobbit

+0

2 ans plus tard et je relis ma question lol J'ai découvert que, dans cet exemple, le niveau d'accès à la méthode est important. Considérant mon exemple ci-dessus, la méthode publique peut être appelée sur une sous-classe par d'autres classes qui instancient la sous-classe même si ces "autres classes" ne sont pas dans le même paquetage que la sous-classe. D'un autre côté, la méthode protégée ne pourrait jamais être appelée par des classes en dehors du paquet. – Region39