Consulta sobre el alcance de las variables en Java

public class Knowing {

    static final long tooth = 343L;

    static long doIT(long tooth) {
        System.out.print(++tooth + " ");
        return ++tooth;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        System.out.print(tooth + " ");
        final long tooth = 340L;

        new Knowing().doIT(tooth);
        System.out.println(tooth);
    }
}

Bien, aquí está mi pregunta:

  • Si tenemos una variable global declarada static final long tooth = 343L; ¿Cómo podemos tener declarada otra variable en el método principal? final long tooth = 340L; Solo quiero saber por qué esto está permitido porque lo ejecuté y no hubo ningún error.

  • Y tampoco debería ser el acceso del diente de la variable estática global mediante el uso className.variableName y no creando una nueva Instancia variable nombre ¿cómo es que eso está permitido con solo una advertencia?

preguntado el 12 de junio de 12 a las 19:06

5 Respuestas

¿Cómo podemos tener otra variable en el método principal declarado diente largo final = 340L;

Porque la especificación del lenguaje dice que puedes. Desde sección 6.4.1 de la JLS, Sobre sombreado:

Una declaración d de una variable local o parámetro de excepción denominado n sombras, en todo el ámbito de d, (a) las declaraciones de cualquier otro campo denominado n que estén en el ámbito en el punto donde aparece d, y (b) las declaraciones de cualquier otras variables llamadas n que están dentro del alcance en el punto donde ocurre d pero no están declaradas en la clase más interna en la que se declara d.

En caso de que do ¿esta? Casi nunca. Por otro lado, rara vez lo he visto como un problema.

Para su segunda pregunta:

Y tampoco debería ser el acceso de la variable estática global mediante el uso de className.variableName y no mediante la creación de una nueva instancia.nombre de variable ¿cómo es que se permite con solo una advertencia?

Esta es una falla de diseño en Java, IMO. Incluso la advertencia no forma parte de la especificación del idioma. Debería siempre evite hacer esto, ya que hace que el código haga algo diferente de lo que parece que está haciendo. El ejemplo que suelo dar es:

Thread backgroundThread = new Thread(someRunnable);
backgroundThread.start();
backgroundThread.sleep(1000);

Eso hace que el ejecución subproceso de suspensión, no el nuevo subproceso.

Respondido el 12 de junio de 12 a las 19:06

La variable local eclipsa a la global. Pero aún puede llegar a lo global usando classname.variable.

Respondido el 12 de junio de 12 a las 19:06

La tooth variable en main es una variable local y tiene prioridad sobre las variables globales. Si desea acceder al global, debe hacer referencia a él de la siguiente manera this.tooth.

Si desea leer más sobre variables y alcances, le sugiero leer el Documentos de Oracle.

Respondido el 12 de junio de 12 a las 19:06

La ocultación de parámetros/variables es una característica común en el diseño de lenguajes. Por ejemplo, no hay forma de que el cliente de un método en una biblioteca de terceros controle los nombres que esa biblioteca usó para los parámetros formales. Otra práctica común en el diseño de lenguajes es la consistencia. Aquí, eso significa que en cualquier lugar donde pueda declarar una variable, puede ocultar una con el mismo nombre de un ámbito externo. Tenga en cuenta que si intenta declarar una variable local con el mismo nombre que una variable en el mismo scope, obtendrá un error del compilador.

El acceso no estático de variables estáticas es una característica conveniente cuando se usa el patrón Builder. Sin embargo, es engañoso (como lo ha demostrado gráficamente otra respuesta), por lo que el compilador lo marca como una advertencia.

Respondido el 12 de junio de 12 a las 19:06

Ante todo className.variableName is a legal way of accessing a static member, but its possible to create an instance of the class which has the static member , para acceder a ese miembro estático. considere esto como un error o falla. Se vuelve imposible en clases como Math, donde el constructor es privado y, además, no hay variables de instancia en esa clase, por lo que es inútil crear un objeto. y para lo del alcance, por favor mire este enlace http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.4.1

Respondido el 12 de junio de 12 a las 19:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.