Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

A menudo me encuentro con los métodos que se parecen a lo siguiente:

public void foo(final String a, final int[] b, final Object1 c){
}

¿Qué pasa si este método es llamado sin pasarlo parámetros finales. es decir, un Object1 que se cambia más tarde (por lo que no está declarada como final) se puede pasar a este método bien

¿Fue útil?

Solución

Java siempre se hace una copia de los parámetros antes de enviarlos a los métodos. Esto significa que la final no significa ninguna diferencia para el código de llamada. Esto sólo significa que en el interior del método de las variables no pueden ser reasignados. (Tenga en cuenta que si usted tiene un objeto final, siempre será posible modificar los atributos del objeto).

Otros consejos

Hay una circunstancia en la que estás requerida para declarar que --otherwise definitiva que dará lugar a la compilación error--, es decir, pasar a través de anónimos en clases. Ejemplo básico:

public FileFilter createFileExtensionFilter(final String extension) {
    FileFilter fileFilter = new FileFilter() {
        public boolean accept(File pathname) {
            return pathname.getName().endsWith(extension);
        }
    };

    // What would happen when it's allowed to change extension here?
    // extension = "foo";

    return fileFilter;
}

Extracción del modificador final daría lugar a error de compilación, porque ya no garantiza que el valor es una constante de tiempo de ejecución. El cambio del valor de fuera de la clase anónima sería saber hacer que la instancia de clase anónima comportarse diferente después del momento de la creación.

Java es sólo pasan por valor. (O mejor - pass-reference-por-valor)

Así que el argumento pasado y el argumento en el método son dos diferentes manipuladores que apuntan al mismo objeto (valor).

Por lo tanto, si cambia Estado del objeto, que se refleja a todas las demás variables que se hace referencia a ella. Pero si se vuelve a asignar un nuevo objeto (valor) al argumento, a continuación, otras variables que apunta a este objeto (valor) No se deje re-asignado.

La palabra clave final en un parámetro del método significa absolutamente nada a la persona que llama. También significa absolutamente nada para el programa en ejecución, ya que su presencia o ausencia no cambia el código de bytes. Sólo se asegura que el compilador se quejará si la variable de parámetro es reasignado dentro del método. Eso es todo. Pero eso es suficiente.

Algunos programadores (como yo) creo que es una cosa muy buena y el uso final en casi todos los parámetros. Esto hace que sea más fácil de entender un método a largo o complejo (aunque se podría argumentar que los métodos largos y complejos deben refactorizan.) También arroja luz sobre los parámetros del método que no son marcado con final.

Considere esta implementación de foo ():

public void foo(final String a) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            System.out.print(a);
        }
    }); 
}

Debido a la instancia Runnable sobreviviría el método, esto no compila sin la palabra clave final - final le dice al compilador que es seguro tomar una copia de la referencia (para referirse a él más adelante). Por lo tanto, es el referencia eso se considera definitivo, no el valor . En otras palabras: Como una persona que llama, no se puede estropear nada ...

final significa que no puede cambiar el valor de esa variable una vez que se le asignó.

Mientras tanto, el uso de final para los argumentos en los medios Métodos no va a permitir que el programador para cambiar su valor durante la ejecución del método . Esto sólo significa que dentro del método los final variables no pueden ser reasignados.

Si se declara cualquier parámetro como definitiva, no se puede cambiar el valor de la misma.

class Bike11 {  
    int cube(final int n) {  
        n=n+2;//can't be changed as n is final  
        n*n*n;  
     }  
    public static void main(String args[]) {  
        Bike11 b=new Bike11();  
        b.cube(5);  
    }  
}   

Salida: Tiempo de Compilación de error

Para más detalles, por favor visite mi blog: http://javabyroopam.blogspot.com

Las cadenas son inmutables, por lo actully no se puede cambiar la cadena después (sólo se puede hacer que la variable que llevó a cabo el punto objeto String a un objeto String diferente).

Sin embargo, esa no es la razón por la cual se puede enlazar cualquier variable a un parámetro final. Todos los controles del compilador es que el parámetro no se reasigna en el método. Esto es bueno para fines de documentación, sin duda un buen estilo, e incluso puede ayudar a optimizar el código de bytes para la velocidad (aunque esto no parece hacer mucho en la práctica).

Pero incluso si lo hace volver a asignar un parámetro dentro de un método, la persona que llama no se da cuenta de que, a causa de Java hace todo paso de parámetros por valor. Después de la secuencia

  a = someObject();
  process(a);

los campos de una pueden haber cambiado, pero sigue siendo el mismo objeto que era antes. En lenguajes pase por referencia esto puede no ser cierto.

@stuXnet, podría hacer que el argumento exactamente lo contrario. Si se pasa un objeto a una función, y cambia las propiedades del objeto pasado entonces la persona que llama de la función verá el valor cambiado en su variable. Esto implica un pase por el sistema de referencia, no pasa por valor.

Lo que es confuso es la definición de pasar por valor o pasar por referencia en un sistema en el que el uso de punteros está completamente oculto para el usuario final.

Java está definitivamente no pasan por valor, como ser por ejemplo, significaría que uno podría mutar el objeto pasado y el original no se vería afectada.

Tenga en cuenta que no se puede mutar primitivas que sólo les puede asignar a las variables. Así que probar una Pasar por referencia o por valor mediante el uso de las primitivas no es una prueba.

Lo que no se puede hacer en Java que se puede hacer en otros idiomas es volver a asignar las variables de la persona que llama a un nuevo valor, porque no hay punteros en Java, por lo que este hace que sea confuso.

No es necesario palabra clave final en el parámetro de entrada método. Java crea una copia de la referencia al objeto, por lo que poner final sobre que no hace que el objeto final, pero sólo la referencia, lo que no tiene sentido

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top