2012-05-23 24 views
31

Estoy estudiando la función de miembro de JAVA y pensé en experimentar con las variables de miembro primordiales.Anulando las variables de miembro en Java

Por lo tanto, he definido clases

public class A{ 
    public int intVal = 1; 
    public void identifyClass() 
    { 
     System.out.println("I am class A"); 
    } 
} 

public class B extends A 
{ 
    public int intVal = 2; 
    public void identifyClass() 
    { 
     System.out.println("I am class B"); 
    } 
} 

public class mainClass 
{ 
    public static void main(String [] args) 
    { 
     A a = new A(); 
     B b = new B(); 
     A aRef; 
     aRef = a; 
     System.out.println(aRef.intVal); 
     aRef.identifyClass(); 
     aRef = b; 
     System.out.println(aRef.intVal); 
     aRef.identifyClass(); 
    } 
} 

la salida es:

1 
I am class A 
1 
I am class B 

no soy capaz de entender por qué cuando Aref está ajustado en b intval sigue siendo de la clase A?

+0

posible duplicado de [Ligera confusión con respecto a la anulación donde las variables se refieren] (http://stackoverflow.com/questions/12589274/slight-confusion-regarding-overriding-where-variables-are-concerned) –

+0

Creo esta no es la misma pregunta, ya que la otra mezcla varias características del lenguaje, mientras que esta es puramente sobre variables que no son polimórficas –

+0

@Vic Seedoubleyew Pero me parece como un duplicado de [esta pregunta] (http: // stackoverflow.com/q/7794621/1303323) –

Respuesta

41

Las variables no son polimórficas en Java; no se anulan entre sí.

+1

Entonces, como una variable no se reemplaza, no se realiza una resolución de tiempo de ejecución, por lo tanto, en la cadena de herencia se usa el valor de la variable de la clase de referencia cuando se accede en lugar del tipo de objeto . Lo verifiqué ampliando las clases más y usando un tipo de referencia intermedio. Gracias por la respuesta. –

45

Cuando crea una variable del mismo nombre en una subclase, se llama que oculta. La subclase resultante ahora tendrá realmente ambas propiedades. Puede acceder al de la superclase con super.var o ((SuperClass)this).var. Las variables ni siquiera tienen que ser del mismo tipo; son solo dos variables que comparten un nombre, al igual que dos métodos sobrecargados.

+0

Gracias por la respuesta. –

+0

Entonces, hacer tal cosa no es polimorfismo de todos modos. ¿Ilustra el concepto de OOP "ocultamiento de datos"? –

+0

@RahulRastogi No, no tiene nada que ver con ese concepto. "Ocultación de datos" es encapsulación. –

8

Las variables se resuelven en tiempo de compilación, métodos en tiempo de ejecución. El aRef es de tipo A, por lo tanto, un ValorRef.Intvalue se resuelve en tiempo de compilación en 1.

+0

Gracias por la respuesta –

0

Según las especificaciones de Java, las variables de instancia no se anulan desde una superclase por una subclase cuando se amplía.

Por lo tanto, la variable en la subclase solo se puede ver como una que comparte el mismo nombre.

También cuando se llama al constructor de A durante la creación de la instancia de B, se inicializa la variable (intVal) y, por lo tanto, la salida.

+0

No obtuve el primer punto. Siempre podemos acceder a cualquier variable de miembro no privada de una superclase en una subclase. –

0

Bueno, espero que haya obtenido la respuesta. De lo contrario, puede intentar ver en el modo de depuración. la subclase B tiene acceso a ambos intVal. No son polimórficos, por lo tanto, no son anulados.

Si utiliza la referencia de B obtendrá B's intVal. Si usas la referencia de A, obtendrás A intVal. Es así de simple.

+0

En el modo de depuración veo que tanto b como aRef tienen ambos intVal s mientras que según su comentario, esperaba que solo el objeto b tenga ambos valores. ¿Es porque el depurador se comporta de una manera diferente que la JVM? –

+0

Supongo que hubo un malentendido. Hasta el momento en que no asignó b a aRef, solo tenía una intVal.Cuando asignó b a aRef, ahora apunta a un objeto de tipo B, por lo tanto, dos intVals. – dharam

+0

Gracias por la respuesta –

-1

Java tiene una pluma de encapsulamiento que significa que une fuertemente la propiedad y el comportamiento de un objeto. entonces solo a través de una referencia de clase podemos llamar su comportamiento para cambiar su propiedad.

y en método de herencia solo anula para que solo afecte a su propiedad.

2

De JLS Java SE 7 Edición §15.11.1:

Esta falta de dinámicas de búsqueda para el campo de accesos permite que los programas se ejecuten de manera eficiente con las implementaciones sencillas. El poder de la vinculación y anulación tardía está disponible, pero solo cuando se utilizan métodos de instancia.

Respuestas de Oliver Charlesworth y Marko Topolnik son correctas, me gustaría elaborar un poco más en el qué parte de la pregunta:

En Java class members se accede según el tipo de la referencia y no el tipo del objeto real.Por la misma razón, si tenía un someOtherMethodInB() en la clase B, no podría acceder al aRef después de ejecutar aRef = b. Los identificadores (es decir, nombres de clases, variables, etc.) se resuelven en tiempo de compilación y, por lo tanto, el compilador se basa en el tipo de referencia para hacer esto.

Ahora en su ejemplo, cuando ejecuta System.out.println(aRef.intVal);, imprime el valor de intVal definido en A porque este es el tipo de la referencia que utiliza para acceder a él. El compilador ve que aRef es del tipo A y que es el intVal al que accederá. No olvide que tiene ambos campos en las instancias de B. JLS también tiene un ejemplo similar al suyo, "15.11.1-1. Enlace estático para acceso de campo" si desea verlo.

¿Pero por qué los métodos se comportan de manera diferente? La respuesta es que para los métodos, Java usa enlace tardío. Eso significa que en tiempo de compilación, encuentra el método más adecuado para buscar durante el tiempo de ejecución. La búsqueda implica el caso de que el método sea anulado en alguna clase.

3

No hay polimorfismo para los campos en Java.

Variables decisión ocurre en un tiempo de compilación por lo que siempre Las variables de clase Base (variables heredadas no del niño) se ha accedido.

Así que cuando upcasting sucede siempre recordar

1) se tendrá acceso a las variables de clase base.

2) Se invocarán los métodos de clase secundaria (métodos reemplazados si sucedieron los métodos más heredados heredados de su progenitor).

0
OverRiding Concept in Java 
Functions will override depends on object type and variables will accessed on reference type. 

1. Override Function: In this case suppose a parent and child class both have same name of function with own definition. But which function will execute it depends on object type not on reference type on run time. 

For e.g.: 
Parent parent=new Child(); 
parent.behaviour(); 
//in that case parent is a reference of Parent class but holds the object of Child Class so thats why Parent class function will call in that case. 

Child child=new Child(); 
child.behaviour(); 
//in that case child holds the object of Child Class so thats why Child class function will call in that case. 

Parent parent=new Parent(); 
parent.behaviour(); 
//in that case parent holds the object of Parent Class so thats why Parent class function will call in that case. 

2. Override Variable: Java supports overloaded variables. But actually these are two different variables with same name. One in parent class ad second in child class. And both variable can be either of same datatype or different. 

When you trying to access the variable, it depends on reference type object not depends on object type. 

For e.g.: 
Parent parent=new Child(); 
System.out.println(parent.state); 

//in that case reference type is Parent so Parent class variable is accessed not Child class variable. 

Child child=new Child(); 
System.out.println(child.state); 

//in that case reference type is Child so Child class variable is accessed not Parent class variable. 

Parent parent=new Parent(); 
System.out.println(parent.state); 

//in that case reference type is Parent so Parent class variable is accessed not Child class variable. 

Espero que esta solución lo ayude. Gracias

Cuestiones relacionadas