Estoy pidiendo una muy simple pregunta, pero soy poco confundido en esto.

Supongamos que tengo una clase Parent:

public class Parent {

    int name;
}

Y tener otra clase de Child.java:

public class Child extends Parent{

    int salary;
}

Y por último, mi Main.java clase

public class Main {

    public static void main(String[] args)
    {
        Parent parent = new Child();
        parent.name= "abcd";
    }
}

Si puedo hacer que un niño sea objeto como

Child child = new Child():

Luego child objeto puede tener acceso tanto a name and salary variables.

Mi pregunta es:

Parent parent = new Child();

da el acceso de los name variable de la clase Padre.
Entonces, ¿cuál es el uso exacto de esta línea??

 Parent parent = new Child();

Y también cuando se está utilizando dinámica de polimorfismo entonces ¿por qué la variable de los niños de la clase no es accesible después de hacer esto

Parent parent = new Child();
  • Tienen una lectura de que el animal este ejemplo: en.wikipedia.org/wiki/…
  • En su ejemplo, que realmente no ayuda. Pero creo que tener un método que hace algo con un Padre de referencia. En algún lugar en la clase Principal, por ejemplo. Toma un objeto primario de referencia y hace cosas con él. Tendría sentido a aceptar también el sub-clases de Padres, como un objeto secundario, a pesar de que solo hace de padre-cosas a ella. Por otra parte, buscar en enlace dinámico para más cosas interesantes.
  • Es este el name tipo correcto?
InformationsquelleAutor Narendra Pal | 2012-08-28

8 Comentarios

  1. 41

    Primero, una aclaración de la terminología: estamos asignando un Child objeto a una variable de tipo Parent. Parent es una referencia a un objeto que pasa a ser un subtipo de Parent, un Child.

    Que sólo es útil en un ejemplo más complejo. Imagine que usted agregue getEmployeeDetails a la clase Padre:

    public String getEmployeeDetails() {
        return "Name: " + name;
    }

    Podríamos reemplazar este método en Child a dar más detalles:

    @Override
    public String getEmployeeDetails() {
        return "Name: " + name + " Salary: " + salary;
    }

    Ahora usted puede escribir una línea de código que se lo que los detalles están disponibles, si el objeto es un Parent o Child:

    parent.getEmployeeDetails();

    El siguiente código:

    Parent parent = new Parent();
    parent.name = 1;
    Child child = new Child();
    child.name = 2;
    child.salary = 2000;
    Parent[] employees = new Parent[] { parent, child };
    for (Parent employee : employees) {
        employee.getEmployeeDetails();
    }

    Será el resultado en la salida:

    Name: 1
    Name: 2 Salary: 2000

    Se utilizó un Child como un Parent. Se había especializado comportamiento único para el Child clase, pero cuando nos llama getEmployeeDetails() podríamos ignorar la diferencia y se centran en cómo Parent y Child son similares. Esto se llama subtipo de polimorfismo.

    Actualizado su pregunta ¿por qué Child.salary no es accesible cuando el Childobjeto se almacena en un Parent de referencia. La respuesta es la intersección de «polimorfismo» y «estático». Debido a que Java es de tipo estático en tiempo de compilación usted obtener ciertas garantías de que el compilador pero que se ven obligados a seguir las reglas de exchange o el código no compilará. Aquí, la garantía es que cada instancia de un subtipo (por ejemplo,Child) puede ser utilizado como una instancia de su supertipo (por ejemplo,Parent). Por ejemplo, se garantiza que cuando el acceso employee.getEmployeeDetails o employee.name el método o campo está definido en no-null objeto que podría ser asignado a una variable employee de tipo Parent. Para hacer esta garantía, el compilador considera que sólo de tipo estático (básicamente, el tipo de la variable de referencia, Parent) a la hora de decidir lo que usted puede acceder. Así que usted no puede tener acceso a cualquiera de los miembros que se encuentran definidos en el tipo en tiempo de ejecución del objeto, Child.

    Cuando usted realmente desea utilizar un Child como un Parent esto es fácil de restricción a vivir con el y su código será utilizable para Parent y todos sus subtipos. Cuando eso no es aceptable, hacer el tipo de la referencia Child.

  2. 10

    Le permite acceder a todas las subclases a través de un padre común de la interfaz. Esto es beneficioso para la ejecución de las operaciones más comunes disponibles en todas las subclases. Un mejor ejemplo de lo que se necesita:

    public class Shape
    {
      private int x, y;
      public void draw();
    }
    
    public class Rectangle extends Shape
    { 
      public void draw();
      public void doRectangleAction();
    }

    Ahora, si usted tiene:

    List<Shape> myShapes = new ArrayList<Shape>();

    Puede hacer referencia a cada elemento en la lista como una Forma, usted no tiene que preocuparse de si se trata de un Rectángulo o de algún otro tipo, como vamos a decir Círculo. Usted puede tratar de la misma, se puede dibujar todos ellos. Usted no puede llamar a doRectangleAction, porque no sé si la Forma es en realidad un rectángulo.

    Este es un comercial de entre el tratamiento de los objetos de una manera genérica y el tratamiento de la específicamente.

    Realmente creo que usted necesita para leer más acerca de la programación orientada a objetos. Un buen libro debe ayudar a: http://www.amazon.com/Design-Patterns-Explained-Perspective-Object-Oriented/dp/0201715945

    • En el ejemplo citado, que están utilizando «clase abstracta» o «interfaz»? Ya que una simple clase no pueden tener métodos sin implementar.
    • bien visto, parece que quiere explicar más en el polimorfismo en el contexto de la pregunta, pero seguramente esto tiene enmienda.
  3. 7

    Si asigna tipo primario a una subclase significa que usted está de acuerdo con el uso de las características comunes de la clase padre.

    Que te da la libertad para abstraer a partir de diferentes subclase de las implementaciones. Como resultado de los límites con el padre de características.

    Sin embargo, este tipo de asignación se llama upcasting.

    Parent parent = new Child();  

    El contrario es downcasting.

    Child child = (Child)parent;

    Por lo tanto, si usted cree instancia de Child y abatido a Parent puede utilizar ese tipo de atributo name. Si usted cree instancia de Parent puede hacer lo mismo que con el caso anterior pero no se puede usar salary porque no hay tal atributo en el Parent. Retorno al caso anterior que puede utilizar salary pero sólo si downcasting a Child.


    No hay más explicación detallada

    • Así que para que yo pueda hacer de los Padres de los padres = new Matriz(). ¿Por qué hacer eso? Plz que me ayude.
    • Cierto, pero todavía no explica por qué se quiere.
    • Por qué hacer depende de lo que tu quieres hacer.
    • Si asigna Parent puede utilizar Parent si usted asignar (si se puede) Child puede utilizar Child.
    • Yo no entiendo el concepto aquí. Si hacemos que el niño objeto, a continuación, podemos acceder a el niño de las variables de la clase junto con los padres. y si queremos acceder a la clase principal de la variable, a continuación, podemos hacerlo con la realización del objeto principal. Entonces, ¿por qué este acceso está ahí. Si usted me puede explicar con un ejemplo, entonces yo realmente disfrutar usted
    • Objetos secundarios tiene siempre acceso a las características de accesibilidad de las clases para los padres, porque los padres las características pertenecen a los niños y accesible si tienen accesible descriptores de acceso.
    • Vea el ejemplo de abajo.
    • El niño = (Niño)de los padres; esto resultará en ClassCastException. Usted no puede abatido un objeto padre a un hijo variable de referencia.

  4. 7

    Cuando se compila el programa de la variable de referencia de la clase base, se obtiene de la memoria y el compilador comprueba que todos los métodos de esa clase. Así se comprueba que todos los de la base de los métodos de la clase, pero no el hijo métodos de la clase. Ahora en tiempo de ejecución cuando se crea el objeto, sólo se comprueban los métodos se pueden ejecutar.
    En caso de que un método se reemplaza en el niño de la clase de función que se ejecuta. Niño de clase otras funciones no se ejecutan debido a que el compilador no ha reconocido en el momento de la compilación.

  5. 6

    Es muy sencillo.

    Parent parent = new Child();

    En este caso el tipo de objeto es Parent. Ant Parent sólo tiene una propiedades. Es name.

    Child child = new Child();

    Y en este caso el tipo de objeto es Child. Ant Child tiene dos propiedades. Son name y salary.

    El hecho es que no hay necesidad de inicializar el no-final de campo inmediatamente en la declaración. Normalmente esto se hace en tiempo de ejecución debido a que a menudo no se puede saber exactamente qué es exactamente aplicación que usted necesita. Por ejemplo, imagine que tiene una jerarquía de clases con clase Transport en la cabeza. Y tres subclases: Car, Helicopter y Boat. Y hay otra clase Tour que tiene campo Transport. Que es:

    class Tour {
       Transport transport;
    }  

    La medida en que un usuario no ha reservado un viaje y no se ha elegido un tipo particular de transporte no se puede inicializar este campo. Es la primera.

    Segundo, asumir que todas estas clases deben tener un método go() pero con una aplicación diferente. Puede definir una implementación básica por defecto en la superclase Transport y únicas propias implementaciones en cada subclase. Con esta inicialización Transport tran; tran = new Car(); puede llamar al método tran.go() y obtiene un mejor resultado sin tener que preocuparse acerca de la implementación específica. Se va a llamar overrided método de la subclase.

    Además puede utilizar la instancia de la subclase en todas partes donde instancia de la superclase se utiliza. Por ejemplo, usted desea proporcionar la oportunidad de alquilar su transporte. Si no hace uso de polimorfismo, tienes que escribir un montón de métodos para cada caso: rentCar(Car car), rentBoat(Boat boat) y así sucesivamente. Al mismo tiempo, el polimorfismo permite que usted para crear un método universal rent(Transport transport). Usted puede pasar es objeto de cualquier subclase de Transport. Además, si a lo largo del tiempo su lógica aumentará y tendrás que crear otra clase en la jerarquía? Cuando el uso de polimorfismo usted no necesita cambiar nada. Sólo extender la clase Transport y pasar a la nueva clase en el método:

    public class Airplane extends Transport {
        //implementation
    }

    y rent(new Airplane()). Y new Airplane().go() en el segundo caso.

    • que yo sepa, pero mi pregunta es ¿por qué hacerlo? Si podemos hacer los Padres p = new Matriz() para obtener la matriz de referencia.
    • Esta de la polimorfismo. Es muy útil. El polimorfismo hace que su programa sea más flexible y extensible. Exactamente cómo puede ser esto útil? Ver mis ejemplos en la respuesta actualizada.
    • Gran ejemplo con el transporte… fácil de entender. Gracias!
  6. 2

    Esta situación sucede cuando usted tiene varias implementaciones.
    Me explico.
    Supppose tiene varias algoritmo de ordenación y desea elegir en tiempo de ejecución el uno a implementar, o quieres dar a alguien la capacidad de agregar su implementación.
    Para resolver este problema generalmente se crea una clase abstracta (Padre) y tienen diferentes implementación (Niño).
    Si usted escribe:

    Child c = new Child();

    enlazar su aplicación para Niño de la clase y no se puede cambiar más. De lo contrario si usted usa:

    Parent p = new Child();

    siempre como Hijo extends Padre de familia, usted puede cambiar en el futuro sin necesidad de modificar el código.

    La misma cosa se puede hacer uso de interfaces: los Padres no son ya una clase sino una Interfaz java.

    En general, puede utilizar esta aproximación en el patrón DAO donde usted desea tener varios DB dependiente de la implementación.
    Puedes dar un vistazo a FactoryPatter o AbstractFactory Patrón.
    Espero que esto te puede ayudar.

  7. 1

    Digamos que te gustaría tener un conjunto de instancias de la clase Padre, y un conjunto de clases hijas Niño1, Secundario2, Child3 la ampliación de los Padres. Hay situaciones cuando usted está interesado sólo con la clase principal de la aplicación, que es más general, y no se preocupan más específica cosas introducido por el niño de las clases.

  8. -4

    De declarar de los padres como de los Padres, por lo que java se proporcionan sólo los métodos y atributos de la clase Padre.

    Child child = new Child();

    debería funcionar. O

    Parent child = new Child();
    ((Child)child).salary = 1;
    • Por supuesto, esto funciona. OP estaba pidiendo un contexto, donde Parent parent = new Child(); es útil o significativo.
    • La misma explicación como en las otras respuestas, así que ¿por qué downvote esto? Yo no digo que no me funciona, me dicen que si te dicen Niño c = new Padres() que tiene una instancia de los Padres y no de Niño, ando así que usted no tiene ningún atributo salario. Si desea que el Atributo salario que usted necesita para crear una instancia de Niño de fundición o de Padre a Hijo….

Dejar respuesta

Please enter your comment!
Please enter your name here