2012-02-17 13 views
15

¿Hay alguna razón para cambiar el modificador de acceso de un método reemplazado? Por ejemplo,¿Cambiar el modificador de acceso de un método reemplazado en Java?

abstract class Foo{ 
    void start(){...} 
} 

y después cambiar el modificador de acceso paquete privado a public,

final class Bar extends Foo{ 
    @Override 
    public void start(){...} 
} 

Sólo estoy haciendo esta pregunta por curiosidad.

+1

posible duplicado de [modificadores de acceso de Java y los métodos primordiales] (http://stackoverflow.com/questions/6851612/java-access-modifiers-and-overriding-methods) –

Respuesta

17

Java no le permite hacer que el modificador de acceso sea más restrictivo, porque eso violaría la regla de que una instancia de subclase debería ser utilizable en lugar de una instancia de superclase. Pero cuando se trata de hacer el acceso menos restrictivo ... bueno, tal vez la superclase fue escrita por una persona diferente, y no anticiparon la forma en que desea usar su clase.

Los programas de la gente escribe y las situaciones que surgen en la programación son tan variados, que es mejor para los diseñadores del lenguaje no "adivinar" lo que los programadores podrían querer que ver con su lengua. Si no hay una buena razón para que un programador debe no ser capaz de hacer especificadores de acceso menos restrictivo en una subclase (por ejemplo), entonces es mejor dejar que la decisión para el programador. Ellos conocen los detalles de su situación individual, pero el diseñador del lenguaje no. Así que creo que esta fue una buena llamada de los diseñadores de Java.

6

Sólo hay una, es posible que desee la anulación sea visible por más clases, ya que no hay modificador por defecto, que amplía pública.

+0

Sí, ese era el único beneficio que podía ver ... No sabía si había algo más que eso. – mre

1

Editar: OK, he cambiado mi respuesta para solucionar el problema.

Si eso no se pudiera hacer, entonces habría algunos casos en los que una clase no podría implementar una interfaz y extender una clase porque tienen el mismo método con diferentes modificadores de acceso.

public Interface A { 
    public void method(); 
} 

public abstract classs B { 
    protected void method(); 
} 

public class AB extends B implements A { 
    /* 
    * This would't be possible if the access modifier coulnd't be changed 
    * to less restrictive 
    */ 
    public void method(); 
} 
+1

Todos los métodos definidos en una interfaz son implícitamente públicos. – GriffeyDog

+1

Todos los métodos de interfaces deben ser públicos. – Puce

+0

No se puede tener una declaración de método no público en una interfaz pública o protegida (Dios solo sabe lo que significa una interfaz protegida). http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html Consulte la sección 9.1.4 – Dunes

6

Extender una clase significa que la subclase debe al menos ofrecer la misma funcionalidad a las otras clases.

Si él extiende esa, entonces no es un problema.

La extensión podría ser ser la adición de nuevos métodos o bien ofreciendo métodos existentes para más clases como la fabricación de un método público de acceso a paquete.

2

La explicación es la siguiente: -

Es un principio fundamental de la programación orientada a objetos: la clase de niño es un ejemplo de pleno derecho de la clase padre>, y debe, por tanto, presente al menos la misma interfaz que el padre clase. > Hacer las cosas protegidas/públicas menos visibles violaría esta idea; podría hacer inútiles las clases child> como instancias de la clase padre.

class Person{ 
public void display(){ 
    //some operation 
} 
} 

class Employee extends Person{ 
private void display(){ 
    //some operation 
} 


Person p=new Employee(); 

Aquí P es la referencia de objeto con el tipo Person (superclase), cuando estamos llamando> p.display() como el modificador de acceso es más restrictiva del objeto referencia p no puede acceder a objeto hijo del tipo empleado

Cuestiones relacionadas