2013-05-30 5 views
0

Je suis nouveau à Java. La question peut donc sembler naïve ... Mais pourriez-vous m'aider?Comment appeler une méthode publique WITHIN dans un attribut privé?

Disons, par exemple, j'ai une classe comme suit:

public class Human { 

    private float height; 
    private float weight; 
    private float hairLength; 

    private HairState hairTooLong = new HairState() { 

     @Override 
     public void cut(Human paramHuman) {   
      Human.this.decreaseHairLength(); 
     } 

     @Override 
     public void notCut(Human paramHuman) { 
      Human.this.increaseHairLength(); 
     } 
    }; 

    public float increaseHairLength() { 
     hairLength += 10; 
    } 

    public float decreaseHairLength() { 
     hairLength -= 10; 
    } 

    private static abstract interface HairState { 

     public abstract void cut(Human paramHuman); 
     public abstract void notCut(Human paramHuman); 
    }  
} 

Puis j'ai une autre classe comme suit:

public class Demo { 
    public static void main(String[] args) {  
     Human human1 = new Huamn(); 
     Human.HairState.cut(human1); 
    } 
} 

La déclaration

Human.HairState.cut(human1); 

est invalide ..

J'ai l'intention d'appeler la fonction publiquecut(), qui appartient à hairTooLongprivé attribut.

Comment dois-je faire?

+0

Vous ne pouvez pas. Il ne peut être appelé qu'à partir de 'Human' ... – MadProgrammer

Répondre

8

Depuis HairState est privé à Human, rien en dehors de la classe Human peut même savoir à ce sujet.

Vous pouvez créer une méthode dans Human qui relaie l'appel à son mécanisme privé:

public class Human { 
    . . . 

    public float cutHair() { 
     return hairTooLong.cut(this); 
    } 
} 

puis appeler de main():

System.out.println(human1.cutHair()); 
+0

J'ai corrigé la faute de vide. Veuillez vous référer aux codes modifiés. –

+0

@perfectionming - J'ai modifié mon code en conséquence. –

1

Deux autres solutions à commentaire précédent:

  • Vous pouvez implémenter un getter qui retourne le hairTooLo ng attribut.
  • Vous pouvez appeler la méthode cut() via l'API de réflexion (mais vous ne voulez pas y aller si vous êtes débutant).

Suggère soit la solution dans le commentaire précédent, soit la première option présentée ici.

Si vous êtes curieux, vous pouvez consulter à l'API de réflexion et un exemple ici: How do I invoke a Java method when given the method name as a string?

1

En Java il y a quatre niveaux d'accès, par défaut, privé, public et protégé. La visibilité de private n'est limitée qu'à une certaine classe (même la sous-classe ne peut pas accéder). Vous ne pouvez pas appeler des membres privés dans une autre classe. Voici un détail de base des niveaux d'accès Java.

    Access Levels 
Modifier Class Package Subclass World 
public  Y  Y  Y  Y 
protected  Y  Y  Y  N 
no modifier Y  Y  N  N 
private  Y  N  N  N 

Pour plus de détails vérifier Oracle docs

Questions connexes