2010-03-23 19 views
8

"Es importante entender que es el tipo de variable de referencia - no el tipo de objeto que se refiere a -. Que determina qué usuarios pueden acceder"Java - Variables de referencia

¿Qué quiere decir exactamente con esa afirmación? ¿Está restringido al concepto de herencia? ¿Cómo lo maneja JVM?

+3

Dónde está esta cita tomada de –

+0

? lo siento, pero no recuerdo exactamente eso ... Dejar ya sé, si no puedo hacer preguntas basadas en citas publicadas en algunos sitios web. –

+0

Por cierto, la cita no aparece en una búsqueda de Google ... aparte de esta página. ¿O lo escribiste mal o lo obtuviste de algún sitio web que no está indexado por Google? –

Respuesta

26

Significa que suponga que tiene:

Object x = "hello"; 

El tipo de la variable de es Object, pero el tipo de objeto al que se refiere es String. que es el tipo de variable que determina lo que puede hacer, aunque - por lo que no se puede llamar

// Invalid 
String y = x.toUpperCase(); 

El compilador sólo sabe que usted está llamando a un método en Object, que no incluye toUpperCase. Del mismo modo, los métodos sobrecargados solamente se resuelven en contra de los que saben acerca de:

public class Superclass 
{ 
    public void foo(Object x) {} 
} 

public class Subclass extends Superclass 
{ 
    public void foo(String y) {} 
} 
... 
Subclass x = new Subclass(); 
Superclass y = x; 

x.foo("hello"); // Calls Subclass.foo(String) 
y.foo("hello"); // Calls Superclass.foo(Object) 
-1
public class Base 
{ 
    public object BaseMethod() 
    { 
     return new String("From Base"); 
    } 

} 

public class Child extends Base 
{ 
    public object BaseMethod 
    { 
     return new String("From Child.BaseMethod (overridden)"); 
    } 

    public object ChildMethod 
    { 
     return new String("From Child.ChildMethod"); 
    } 
} 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Base base = new ChildMethod(); 
     System.out.println(base.BaseMethod()); //prints "From Child.BaseMethod (overridden)" 

     System.out.println(base.ChildMethod()); //Will not compile as ChildMethod as reference is of type Base, and ChildMethod is not specified. 

     Child child = (Child) base; //But I can cast it. 
     System.out.println(child.ChildMethod()); // This will work. 
    } 
} 
+3

¿Por qué el voto a favor? –

2

En Java una referencia de base tipo de clase puede referirse a un objeto de child clase. Pero utilizando dicha referencia solo podemos acceder a los miembros de la clase base que se heredaron a la clase child y no a los miembros que la clase child pudo haber agregado.

1

Si usted tiene una clase Foo con un campo público foo y una clase Bar extends Foo con un campo público bar ...

  • Foo myRef = new Bar(); solo le permitirá acceder a myRef.foo aunque el objeto sea realmente un Bar.
  • Bar myRef = new Bar(); permite el acceso a ambos myRef.foo y myRef.bar. Porque la referencia se declara como Bar.
5

Por ejemplo:

Bike b = new Bike(); 
Bike b2 = new MountainBke(); 
b.speedUp(); 
b2.speedUp(); 
b2.shiftGearUp(); 

En el ejemplo anterior, supongamos que una bicicleta no tiene el método shiftUp. La línea b2.shiftGearUp() no compilaría porque la JVM solo sabe que b2 es un Bike, no un MountainBike.

Se podría hacer que funcione echándola por un tipo de bicicleta de montaña:

((MountainBike)b2).shiftGearUp(); // This compiles and runs propperly 
0

"Es importante entender que es el tipo de variable de referencia - no el tipo de objeto que se refiere a a - eso determina a qué miembros se puede acceder ."

Lo que esto significa es que el compilador comprueba la clase de la variable de referencia para la presencia de métodos y otros miembros, por ejemplo, decir que usted tiene una subclase Dog que se extiende Animal clase base,

Animal obj=new Dog(); 
obj.makeSound(); 

Aquí el compilador comprueba si el método makeSound() se declara en la clase de animal o no para que se compile.