2012-03-31 13 views
11

En java, ¿una variable de instancia y un método tienen el mismo nombre sin inestabilidad o conflicto?variable de instancia java y método con el mismo nombre

Quiero asegurarme de que si puedo salirse con la compilación, que no causará ningún error en el camino.

+11

¿Por qué no lo intentaste solo? :) –

+1

Esto no está permitido en C#. –

Respuesta

14

Sí, está bien, principalmente porque, sintácticamente, se usan de manera diferente.

+1

Aunque tiene razón, es posible, no creo que la razón "syntaticall diferente" sea correcta. Mi C++ está oxidado, pero creo que en C++ también se usan de forma diferente, pero causará problemas. por ejemplo: http://ideone.com/SQWav – amit

+0

@amit - Buen punto, déjame estudiar este tema y luego voy a enmendar la respuesta. Muchas gracias – Coffee

+2

@amit Pero C++! = Java, ¿verdad? – arshajii

3

El único conflicto que podía pensar es

int sameName = 5; 

public int sameName() { 
    //method body 
    return 100; 
} 

Si se escribe "this.sameName" cuando se supone escribir "this.sameName()" y viceversa en algún lugar del programa, la aniquilación del código acaba de comenzar.

+2

Pero eso sería solo un error. Aún es legal : D – zEro

+0

@vikingsteve: P –

+4

+1 para menos negrita: O – vikingsteve

5

Está completamente bien porque los métodos y las variables se llaman de manera diferente.

Código:

String name = "myVariable"; 

public String name() { 
    return "myMethod"; 
} 

System.out.println(name()); // Brackets for method call 
System.out.println(name); // No brackets for variable call 

Salida:

myMethod

myVariable

2

De hecho, me he encontré con un problema, que es muy específico. Simplemente se manifiesta en Java 8 (usando Nashorn), pero no en Java 6 (usando Rhino). Si intenta acceder a una variable de instancia de un objeto Java a través de Javascript, el operador [] devuelve la instancia del método.

Supongamos que estoy ejecutando la siguiente declaración de Java:

class MyClass { 
    private boolean isSet=false; 
    public boolean isSet() { return isSet; } 
} 

Si manipular un objeto de dicha clase en Javascript, y luego tratar de acceder a ella con [] operador, me sale la referencia al método.

var obj = new MyClass(); 
var myfields = (myclass.getClass()).getDeclaredFields(); 
var myfieldname = myfields[0].name; 

// The following prints the method declaration, not the boolean value: 
// [jdk.internal.dynalink.beans.SimpleDynamicMethod boolean MyClass.isSet()] 
println(obj[myfieldname]); 

UPDATE: Aparentemente Nashorn's method overloading resolution mechanism ("implícitamente" o no intencionalmente) da mayor prioridad a los métodos sin argumentos más campos de instancia con el mismo nombre.

Cuestiones relacionadas