poo - static en java
Anulando las variables miembro en Java (10)
De JLS Java SE 7 Edition §15.11.1:
Esta falta de búsqueda dinámica para los accesos de campo permite que los programas se ejecuten de manera eficiente con implementaciones sencillas. El poder de la vinculación y anulación tardía está disponible, pero solo cuando se utilizan métodos de instancia.
Las respuestas de Oliver Charlesworth y Marko Topolnik son correctas, me gustaría detallar un poco más sobre por qué parte de la pregunta:
En la clase Java , los miembros se acceden según el tipo de referencia y no según el tipo del objeto real. Por el mismo motivo, si tuviera alguna someOtherMethodInB()
en la clase B
, no podría acceder a ella desde aRef
después de 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 referencia que usa para acceder a él. El compilador ve que aRef
es de tipo A
y esa es la intVal
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 el 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.
Estoy estudiando las funciones principales de los miembros en JAVA y pensé en experimentar con las variables principales de los miembros.
Entonces, definí las 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();
}
}
El resultado es:
1
I am class A
1
I am class B
No puedo entender por qué cuando aRef está configurado en b intVal todavía es de clase A?
Bueno, espero que tengas 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 usas la referencia de B obtendrás B intVal. Si usas la referencia de A, obtendrás A intVal. Es así de simple.
Cuando crea una variable del mismo nombre en una subclase, eso se llama ocultación . 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.
El concepto OverRiding en las funciones de Java anulará depende del tipo de objeto y se accederá a las variables en el tipo de referencia.
- Función de anulación: en este caso, supongamos que una clase principal y secundaria tienen el mismo nombre de función con definición propia. Pero qué función ejecutará depende del tipo de objeto no del tipo de referencia en tiempo de ejecución.
Por ejemplo:
Parent parent=new Child();
parent.behaviour();
Aquí parent
es una referencia de la clase Parent, pero contiene un objeto de Child Class, por eso se llamará a la función Child class en ese caso.
Child child=new Child();
child.behaviour();
Aquí el child
tiene un objeto de clase infantil, por lo que se llamará a la función de clase child
.
Parent parent=new Parent();
parent.behaviour();
Aquí el parent
tiene el objeto de clase principal, por lo que se llamará a la función clase parent
.
- Variable de anulación: Java admite variables sobrecargadas. Pero en realidad estas son dos variables diferentes con el mismo nombre, una en la clase principal y otra en la clase hija. Y ambas variables pueden ser del mismo tipo de datos o diferentes.
Cuando intenta acceder a la variable, depende del objeto de tipo de referencia, no del tipo de objeto.
Por ejemplo:
Parent parent=new Child();
System.out.println(parent.state);
El tipo de referencia es Parent, por lo que se accede a la variable de clase Parent, no a la variable de la clase Child.
Child child=new Child();
System.out.println(child.state);
Aquí el tipo de referencia es Child, por lo que se accede a la variable de clase Child, no a la variable de clase Parent.
Parent parent=new Parent();
System.out.println(parent.state);
Aquí el tipo de referencia es Parent, por lo que se accede a la variable Parent class.
Espero que esto pueda ayudar
public class B extends A {
// public int intVal = 2;
public B() {
super();
super.intVal = 2;
}
public void identifyClass() {
System.out.println("I am class B");
}
}
Java tiene una pluma de encapsulamiento 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 la herencia, solo el método anula para que solo pueda afectar su propiedad.
Las variables no son polimórficas en Java; no se anulan entre sí.
Las variables se resuelven en tiempo de compilación, métodos en tiempo de ejecución. El aRef es del tipo A, por lo tanto aRef.Intvalue se resuelve en tiempo de compilación en 1.
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 puede verse como una que comparte el mismo nombre.
Además, cuando se llama al constructor de A durante la creación de la instancia de B, la variable (intVal) se inicializa y, por lo tanto, la salida.
No hay polimorfismo para los campos en Java.
Variables
decisión de las Variables
ocurre en un momento de compilación, de modo que siempre se accederá a las variables de la Base Class (no a las variables heredadas de los niños).
Entonces, siempre que ocurra la transmisión ascendente, recuerde siempre
1) Se accederá a las variables de la clase base.
2) Se invocarán los métodos de la subclase (métodos reemplazados si se aplicaron los demás métodos heredados de su padre).