Autor Tema: ¿Por qué no se heredan los constructores en Java? Ejemplo con JFrame  (Leído 8053 veces)

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Estoy empezando en el mundo de la POO y tengo una pequeña duda.

La idea es simplemente crear una subclase(ProbarComponentes) de una clase que simplemente sea un marco(PrimerFrame), y que en esta subclase pueda crear 2 botones en el marco, además de poner otro titulo en la barra del marco

Mi intención es que ProbarComponentes que es subclase de PrimerFrame tenga en el titulo de la barra la palabra “barra” y no “Título de barra” que lo coge de la clase PrimerFrame(a su vez subclase de JFrame). Como en la clase PrimerFrame si puede poner el titulo de la barra de marco al ser subclase de JFrame, pensaba que tambien ProbarComponentes podría modificar el titulo de la barra al ser subclase de PrimerFrame. No sé si estoy cerca de la solución o como lo estoy haciendo no tiene sentido y hay que hacerlo de otra forma. Gracias de antemano por la ayuda, mi intensión no es saber la solución, sino poder entenderla para poder aprender.

Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class PrimerFrame extends JFrame{

public PrimerFrame(String tittle){
super("Titulo de la barra");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);


}
}


Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class ProbarComponentes extends PrimerFrame{

public ProbarComponentes(String tit){
super("barra");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

setLayout(new FlowLayout());
JButton play=new JButton("play");
JButton stop=new JButton("stop");
add(play);
add(stop);


}
public static void main(String[]args){
ProbarComponentes d=new ProbarComponentes("er");
}
}

« Última modificación: 16 de Abril 2015, 10:04 por Alex Rodríguez »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola caludo en el constructor public PrimerFrame(String tittle) estás recibiendo un parámetro que no usas.

Si este parámetro lo usas puedes resolver que cada frame tenga su propio título:

Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class PrimerFrame extends JFrame{

    public PrimerFrame(String title){
        super(title);
        setSize(300,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class ProbarComponentes extends PrimerFrame{

    public ProbarComponentes(String tit){
        super(tit);
        setSize(300,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setLayout(new FlowLayout());
        JButton play=new JButton("play");
        JButton stop=new JButton("stop");
        add(play);
        add(stop);
    }
    public static void main(String[]args){
        ProbarComponentes d=new ProbarComponentes("er");
    }
}

Código: [Seleccionar]
public class test
{
    public static void main (String[] args){
        PrimerFrame pf = new PrimerFrame("Titulo de la barra");
        ProbarComponentes pc = new ProbarComponentes("barra");
    }
}

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Muchas gracias por la respuesta. Me ha servido de gran ayuda.

Ahora sé como se debe hacer, pero tengo unas pequeñas dudas. En este otro ejemplo que inserto, con el constructor public PrimerFrame() no estoy pasandole ningún argumento, pero con Super le estoy pasando "titulo de barra" que sería un argumento de tipo String.Entonces mis dudas son:
-En este caso estoy llamado al constructor de la clase JFrame "public JFrame()"-->sin parametros?...o "public JFrame(String variable)"?


Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class PrimerFrame extends JFrame{

public PrimerFrame(){
super("titulo de la barra");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

}

public static void main(String[]args){
PrimerFrame pf=new PrimerFrame();

}

}


- Y la otra duda, en los ejemplos anteriores(el que me has respondido).¿Por qué en la clase ProbarComponentes  no puede hacer lo mismo que en la clase PrimerFrame?O sea, no pasarle parametros al constructor y despues con super poner el mensaje que quiero poner como titulo?O sea:
Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class PrimerFrame extends JFrame{

public PrimerFrame(){
super("titulo");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

}

public static void main(String[]args){
PrimerFrame pf=new PrimerFrame();

}

}


Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class ProbarComponentes extends PrimerFrame{

public ProbarComponentes(){
super("Titulo Barra");

setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


setLayout(new FlowLayout());
JButton play=new JButton("play");
JButton stop=new JButton("stop");


JLabel jl=new JLabel("Etiqueta",JLabel.RIGHT);
JTextField jt=new JTextField("Escribe",10);
add(play);
add(stop);
add(jl);
add(jt);
setVisible(true);
jt.setText("Pepe");

}
public static void main(String[]args){
ProbarComponentes d=new ProbarComponentes();
}
}


Muchisimas gracias por todo!

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola si miras la documentación del api Java verás que JFrame tiene varios constructores:

Constructor and Description

JFrame() Constructs a new frame that is initially invisible.

JFrame(GraphicsConfiguration gc) Creates a Frame in the specified GraphicsConfiguration of a screen device and a blank title.

JFrame(String title) Creates a new, initially invisible Frame with the specified title.

JFrame(String title, GraphicsConfiguration gc) Creates a JFrame with the specified title and the specified GraphicsConfiguration of a screen device.



En el constructor

public PrimerFrame(){
super("titulo de la barra");

Estás pasando un String al constructor de la superclase (JFrame) a través de la línea super("titulo de la barra");

El super lo que hace es invocar al constructor de JFrame y pasarle un String. Por tanto indirectamente estás llamando al constructor public JFrame(String variable)


Citar
- Y la otra duda, en los ejemplos anteriores(el que me has respondido).¿Por qué en la clase ProbarComponentes  no puede hacer lo mismo que en la clase PrimerFrame?O sea, no pasarle parametros al constructor y despues con super poner el mensaje que quiero poner como titulo?

Sí, también puedes hacerlo así si quieres. Depende de cómo prefieras hacerlo, si prefieres que el título le venga como parámetro le pones un parámetro, si prefieres que el título sea siempre el mismo no le pones parámetro y le pasas siempre el mismo título.

Saludos!
Responsable de departamento de producción aprenderaprogramar.com

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Muchisimas gracias por todo, hasta ahora he entendido todo lo que me has explicado, pero, en esta parte no logro que el codigo funcione..
Citar
Sí, también puedes hacerlo así si quieres. Depende de cómo prefieras hacerlo, si prefieres que el título le venga como parámetro le pones un parámetro, si prefieres que el título sea siempre el mismo no le pones parámetro y le pasas siempre el mismo título.
...dejando la clase PrimerFrame tal cual está y haciendo la subclase de esta(ComporbarComponentes) justo con la misma idea que he hecho la clase PrimerFrame
Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class ProbarComponentes extends PrimerFrame{

public ProbarComponentes(){
super("titulo definitivo");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


setLayout(new FlowLayout());
JButton play=new JButton("play");
JButton stop=new JButton("stop");


JLabel jl=new JLabel("Etiqueta",JLabel.RIGHT);
JTextField jt=new JTextField("Escribe",10);
add(play);
add(stop);
add(jl);
add(jt);
setVisible(true);
jt.setText("Pepe");

}
public static void main(String[]args){
ProbarComponentes d=new ProbarComponentes();
}
}

Siento ser tan pesado, y agradezco muchisimo la ayuda, lo cierto es que entiendo todo lo que me has explicado , pero este "detalle"( de por qué con la subclase PrimerFrame puedo hacer el constructor sin pasarle argumentos, y pasarle un String con el super...en cambio al hacer una subclase de PrimerFrame haciendo lo mismo no me sale el programa) es el que no logro comprender

Una vez mas muchas gracias por todo!!

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola caludo, en la clase puedes tener un constructor sin parámetros, un constructor con parámetro, o ambos constructores si quieres. Al crear el objeto usas un constructor u otro según prefieras:

Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class ProbarComponentes extends PrimerFrame{

    public ProbarComponentes(){
        super("Ejemplo");
        setSize(300,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setLayout(new FlowLayout());
        JButton play=new JButton("play");
        JButton stop=new JButton("stop");
        add(play);
        add(stop);
    }
   
    public ProbarComponentes(String tit){
        super(tit);
        setSize(300,200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setLayout(new FlowLayout());
        JButton play=new JButton("play");
        JButton stop=new JButton("stop");
        add(play);
        add(stop);
    }
    public static void main(String[]args){
        ProbarComponentes d=new ProbarComponentes("er");
    }
}

Saludos

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Antes que nada gracias por las respuestas!Quizas me exprese incorrectamente, aunque cada mensaje recibido me ha servido de mucha ayuda
Basicamente mi duda es teniendo la clase PrimerFrame
 con su constructor vacio( pero basandole un String con super para así poner el titulo de la barra):
Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class PrimerFrame extends JFrame{

public PrimerFrame(){
super("Titulo de la barra");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

}

}

...y teniendo una subclase de esta
...
Código: [Seleccionar]
import java.awt.*;
import javax.swing.*;
public class ProbarComponentes extends PrimerFrame{

public ProbarComponentes(){
super("titulo definitivo");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


setLayout(new FlowLayout());
JButton play=new JButton("play");
JButton stop=new JButton("stop");


JLabel jl=new JLabel("Etiqueta",JLabel.RIGHT);
JTextField jt=new JTextField("Escribe",10);
add(play);
add(stop);
add(jl);
add(jt);
setVisible(true);
jt.setText("Pepe");

}
public static void main(String[]args){
ProbarComponentes d=new ProbarComponentes();
}
}
¿Por qué tal cual tengo el codigo de la clase ProbarComponentes al ejecutarla NO me cambia el titulo de la barra?Sé la solución(me la ha dado Cesar anteriormente), pero quisiera saber si la manera en la que lo intento hacer NO tiene sentido y solo hay UNA manera de hacerlo o No..o sea "mi lógica" es que si la clase PrimerFrame es subClase de JFrame, creando un constructor vacio, pero pasandole un String con Super, esto hace que la barra tenga un titulo, así que (aquí es donde viene "mi logica") si creo una subclase(ProbarComponentes) de PrimerFrame y hago lo mismo(o sea, creo un constructor vacio y le paso un String con Super...o creando un constructor pasandole un String también podría ser) para así poner otro titulo en la barra podría funcionar, pero veo que NO me cambia el titulo de la barra.
Una vez más muchas gracias
« Última modificación: 16 de Abril 2015, 01:06 por caludo »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola el código que has pegado marca un error al intentar compilar la clase ProbarComponentes porque estás invocando super("titulo definitivo"); pero en la superclase, PrimerFrame, no existe un constructor que permita pasar un String, únicamente tienes el constructor sin parámetros.

La duda que entiendo tienes es si la superclase hereda de JFrame, ¿por que no tiene disponible ese constructor?

La respuesta es que los constructores en Java no se heredan, por tanto no se puede hacer lo que intentas hacer.

En la herencia tenemos:

- Cada clase tiene un nombre de constructor distinto (el nombre de la propia clase) y los constructores no se heredan

- Los métodos de las superclases (public) sí se heredan en las subclases, con el mismo nombre que tuvieran en la superclase.

- Los atributos depende de si se declaran private, protected ó public se heredarán o serán accesibles desde la subclase o no.

Saludos

caludo

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 33
    • Ver Perfil
Re:¿Por qué no se heredan los constructores en Java? Ejemplo con JFrame
« Respuesta #8 en: 17 de Abril 2015, 00:20 »
Muchas Gracias Alex y Cesar!
Alex esa era mi duda, y mi fallo, como dices, en mi planteamiento "heredaba" el constructor y por eso no entendía por qué no me salía como quería. Muchisimas Gracias por la aclaración!
Saludos!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".