Ma question concerne l ' Code: Classe InterfaceProfile interface
. Je crée une interface et définit quatre méthodes: la première méthode est une méthode privée
; la seconde est une méthode default
; la troisième est une méthode statique
; et la quatrième est une méthode abstraite
.
Après avoir compilé cette interface et vérifié son profil: la méthode default
est convertie en une méthode publique
, et à la fois le static
et le abstract ont un modificateur
public
ajouté. Pourquoi? D:\Linux\IDE\Workspace\OCA-Wrokspace\Ocaexam\src>javap mods\com\doubt\session\InterfaceProfile.class
Compiled from "InterfaceProfile.java"
interface com.doubt.session.InterfaceProfile {
public void defaultM();
public static void staticM();
public abstract void doStuff();
}
interface InterfaceProfile {
private void privateM() { //this method is hidden
System.out.println("private Method");
}
default void defaultM() {
System.out.println("Default Method");
}
static void staticM() {
System.out.println("Static Method");
}
void doStuff(); //by default adds the public modifier
}
4 Réponses :
Le fait qu'il s'agisse d'une méthode default
ne fait aucune différence. La portée implicite est public
.
Voici ce que le tutoriel dit: p >
Toutes les méthodes abstraites, par défaut et statiques d'une interface sont implicitement publiques, vous pouvez donc omettre le modificateur public.
@GhostCat Bon point :-) Je crois cependant que le JLS est parfois écrasant pour certains niveaux de questions (le niveau de réponses de qualité acceptable serait trop sévère si toutes les réponses devaient être mesurées comme ça). Cela dit, vous avez un point très valable - en supposant des implémentations sans bogue de la spécification du langage ;-)
Le modificateur par défaut est public, car c'est ainsi que la déclaration d'interface est définie: https://docs.oracle.com/javase/tutorial/java/ IandI / interfaceDef.html
Si vous demandez le raisonnement derrière cela, je dirais que le but de la définition d'une interface est d'assurer l'interface - bien - de toutes les classes d'implémentation, ce qui signifie que toutes les classes d'implémentation ont des contrats clairs sur lesquels les méthodes accessibles besoin de fournir.
L'ajout de méthodes privées à une interface ne sert pas cet objectif principal et semble être davantage un indice d'implémentation. Les méthodes privées et abstraites ont été des ajouts tardifs aux interfaces.
En relation: Les méthodes d'une interface Java doivent-elles être déclarées avec ou sans modificateur d'accès public?
" Les méthodes privées et abstraites étaient des ajouts tardifs aux interfaces. " Vous ne vouliez sûrement pas dire abstract
ici, comme avant Java 8, les interfaces n'avaient que des abstract
méthodes.
@Holger: Vous avez raison. Ce que je voulais dire, c'est que les interfaces peuvent désormais également déclarer des méthodes implémentées similaires aux classes abstraites.
Simple: par défaut, toutes les méthodes d'une interface sont publiques . Vous pouvez restreindre cela en appliquant private
, mais chaque fois que vous ne le faites pas, cette valeur par défaut entre en jeu. Ainsi: il n'y a aucune conversion en cours du tout.
Citant la Spécification du langage Java :
Une méthode dans le corps d'une interface peut être déclarée publique ou privée (§6.6). Si aucun modificateur d'accès n'est donné, la méthode est implicitement publique. Il est permis, mais déconseillé par souci de style, de spécifier de manière redondante le modificateur public pour une déclaration de méthode dans une interface.
(la possibilité d'avoir des méthodes privées dans les interfaces a été introduite avec Java 9, car les gens ont découvert que les méthodes par défaut de Java 8 créaient souvent le besoin d'avoir, eh bien, des méthodes privées que ces méthodes par défaut pourraient utiliser, sans faire de ces méthodes visibles publiquement)
https://docs.oracle.com/javase/tutorial /java/IandI/interfaceDef.html
Toutes les méthodes abstraites, par défaut et statiques d'une interface sont implicitement publiques, vous pouvez donc omettre le modificateur public.
En effet, une classe qui implémente une interface expose toutes les méthodes d'interface (autres que private) à tout autre code ayant une visibilité de la classe.
Ce serait très déroutant si une classe avait une interface mais que les méthodes de l'interface seraient visibles pour certains codes et pas pour d'autres. Si vous souhaitez exposer sélectivement des méthodes, vous devriez probablement utiliser plusieurs interfaces.
public interface Profile { generalMethod() ... } public interface SecretProfile extends Profile { secretMethod() ... }
Les classes peuvent choisir d'implémenter l'une des interfaces (ou même les deux). Le code tiers peut vérifier la présence de l'interface et savoir que la méthode est disponible ou non.
AFAIK, Java 9 a introduit des méthodes d'interface privée.
en fait j'utilise openjdk 12