2010-11-13 5 views
3

Pouvez-vous, s'il vous plaît, me dire 1) pourquoi est-il possible d'affecter un constructeur en tant que public pour une classe package-visible? Par exemple:Java Puzzle: modificateurs

class TestModifiers { 
    public TestModifiers() { 

    } 
} 

Cette classe ne peut pas être instanciée partout mais dans le même package. Donc, cela ne suffit-il pas d'utiliser un modificateur package-visible pour un constructeur? Cela est également vrai pour toute méthode (publique) dans une telle classe (package-visible)

2) disons que dans une classe interne j'ai créé deux variables privées. Pourquoi puis-je les voir de la classe extérieure? N'est-ce pas étrange ?? Par exemple:

class A { 
    A(){} 

    class B { 
    private int b1; 
    private int b2; 
    } 

    public static void main(String[] args) { 
    new B().b1 = 1; 
    new B().b2 = 2; 
    } 
} 
+1

Pour votre deuxième question - Il se sent bizarre et c'est comme ça :) .. son discuté ici avant - http://stackoverflow.com/questions/4075262/access-modifiers-inside-a-private-static- nested-class-in-java –

+0

Merci !!! Je n'ai pas vu ça. – Dmitry

Répondre

5

Il n'y a pas de valeur dans une classe non publique ayant un constructeur public puisque, comme vous dites à juste titre, la classe n'est pas accessible en dehors de cette portée. Il compilera - c'est comme ça - mais de nombreux outils d'analyse de code vont générer un avertissement.

Il est la valeur dans une classe non publiques ayant des méthodes publiques si la classe étend ou implémente une classe publique ou de l'interface, puisque la classe dérivée peut se substituer pour le type de classe de base ou de l'interface:

package mypackage; 

class MyRunnable implements Runnable { 
    private final String message; 

    MyRunnable(String message) { 
     this.message = message; 
    } 

    @Override 
    public void run() { 
     System.out.println(this.message); 
    } 
} 

public class Surprises { 
    public static Runnable getSurprise() { 
     return new MyRunnable("boo!"); 
    } 
} 

code à l'extérieur de mypackage peut alors obtenir une MyRunnable instance (comme Runnable) et appeler la méthode publique:

Runnable r = Surprises.getSurprise(); 
r.run(); 

Je vais ignorer votre deuxième question, car il a été répondu ailleurs dans les commentaires.

+0

C'est ce dont j'avais besoin! Merci beaucoup! – Dmitry

-1

1) pourquoi il est possible d'attribuer un constructeur comme public pour une classe package visible?

C'est beaucoup plus pratique que ça pourrait l'être. Imaginez que vous ayez une classe publique, et alors vous comprenez que vous pouvez le rendre paquet-privé, et après que le compilateur vous dit qu'il y a 45 erreurs (sur chacune de vos méthodes publiques).


Vous ne pouvez pas répondre à votre deuxième question. Je pense aussi que c'est bizarre.

+0

@Downvoter: attention à laisser un commentaire. – Roman

+2

-1 J'ai lu cette réponse 4 fois et cela n'a toujours pas de sens pour moi. – Asaph

+2

Moi aussi. Veuillez donner une réponse plus détaillée. – Dmitry

1

Les modificateurs publics sont autorisés sur les classes non publiques, car les méthodes publiques définies dans ces classes peuvent nécessiter un remplacement dans les sous-classes publiques. Par exemple.

abstract class MyBaseClass { 
    public abstract void method(); 
} 

public class MySubClass extends MyBaseClass { 
    @Override public void method() { ... } 
} 

Plutôt que d'imposer une restriction sur les constructeurs qui ne figurent pas sur les autres membres, les constructeurs publics sont autorisés sur les classes quelle que soit la visibilité des classes contenant.

+5

Mais vous pouvez toujours donner à une méthode surchargée une plus grande visibilité que la méthode correspondante dans la superclasse. Dans votre exemple ci-dessus, vous auriez pu laisser le mot-clé 'public' de' MyBaseClass.method() 'et tout compilerait bien. – Asaph

+0

Ce message soulève à nouveau la question! – Dmitry

1
  1. Il peut être utile pour l'héritage.
  2. class B, B.b1,b2 appartient à la classe A, ils sont à l'intérieur A.
+1

Pourriez-vous, s'il vous plaît, être plus détaillé? – Dmitry

+0

la classe B est à l'intérieur de la classe A. Pourquoi les membres privés de B ne devraient pas être visibles pour la classe A? – khachik

+0

1.) l'accès au paquet ferait également pour l'héritage - si la classe a un accès au paquet, vous devez être dans le même paquet pour l'étendre. –