ingrese la descripción de la imagen aquí ¿Cuál es la diferencia entre super(variable-name); y super.variableName = something; en un constructor, cuando desea inicializar los parámetros y desea asignar uno de ellos a una variable de una clase para padres?

Por ejemplo, quiero implementar el constructor de "Zahnradfraese" y toma el parámetro "int Kennung" y este parámetro debe asignarse al atributo "kennung" de la clase principal "Produktionmittel"

¿Debo usar siempre super cuando quiero llamar a una variable de esta clase principal o simplemente lo uso si tengo otra variable con el mismo nombre en la clase secundaria?

0
Sengo 16 sep. 2018 a las 19:20

5 respuestas

La mejor respuesta

super(variable_name) representa una llamada al constructor y debe ser la primera línea del constructor. Mientras que super.variableName = something; significa que está asignando un valor a la variable de instancia de la clase primaria de la clase secundaria usando super que se usa para referir objetos de clase primaria.

Ahora en su caso: según el diagrama de clase dado la clase Zahnradfraese tiene un constructor que toma el argumento int Kennung. Además, kennung es la clase padre y no tiene constructor y en su lugar tiene el método setKennung(). Entonces puedes hacer super.setKennung(kennung) desde dentro del constructor de la clase Zahnradfraese. También puede declarar un constructor dentro de kennung pero eso significaría desviarse del diagrama de clase que tiene métodos setter y getter y ningún constructor.

public class Zahnradfraese extends Kennung{
  public Zahnradfraese(int kennung){
    super.setKennung(kennung);
  }
}
1
Yug Singh 16 sep. 2018 a las 17:10

¿Cuál es la diferencia entre super(variableName); y super.variableName = something;?

method() (aquí, super(variableName)) es una invocación de método (aquí, invocación del constructor de un padre).

super.variableName = something; es una asignación al campo de un padre.

¿Debo usar siempre super cuando quiero llamar a una variable de esta clase primaria o simplemente la uso si tengo otra variable con el mismo nombre en la clase secundaria?

super(variableName) puede inicializar el estado interno del padre, particularmente super.variableName. Es razonable inicializar un super.variableName antes de acceder a él. Ambas formas que enumeró se pueden utilizar para eso. Solo asegúrese de que no haya duplicación de código.

Quiero implementar el constructor de Zahnradfraese y toma el parámetro int Kennung y este parámetro debe asignarse al atributo kennung de la clase principal Produktionmittel.

Agregue un constructor a Produktionmittel que tome un int

public Produktionmittel(int i) {
    kennung = i;
}

Y llamalo desde la niña:

public Zahnradfraese(int kennung) {
    super(kennung);
}
2
Andrew Tobilko 16 sep. 2018 a las 16:38

super() es una palabra clave que se usa para llamar al constructor en la clase padre y debe llamarse desde dentro del constructor de la clase hija. También debe ser la primera declaración.

Donde como super.s se usa para establecer la variable s (que se declara en la clase principal) de la clase secundaria y no tiene restricciones como las anteriores.

Vea el siguiente ejemplo:

class Test {
    int s;

    Test(int d) {
    }
}

class T extends Test {
    T() {
        super(8);
        int d = 99;
        super.s = 00;
    }

    void ss() {
        super.s = 99;
    }
}
1
Shubhendu Pramanik 16 sep. 2018 a las 16:28

Super (arg) invoca al constructor de la superclase, establecer la variable solo establece la variable. (El constructor puede contener más lógica que solo asignar una variable, que se omite con la segunda forma)

Ejemplo simple:

public class P{
  protected String variable1;
  private boolean variableInitialized = false;

  public P (String s){
     this.variable1 = s;
     this.variableInitialized=true;
  }
}

public class C extends P{

}

Llamar a super("x") dentro de C también establecerá el indicador booleano, ya que la clase principal "podría esperarlo". Llamar a super.variable1="x" no afectará el indicador booleano, y no puede cambiarlo, porque es privado.

Como regla general, diría: si hay un constructor dedicado para una determinada variable, parece que vale la pena usarlo, a menos que desee anular exactamente esa implementación.

1
dognose 16 sep. 2018 a las 16:29

Entonces super(variableName) invoca a su constructor arg clase uno padre, y esa lógica se ejecuta

super.variableName = something; está asignando el valor something a la variable de clase primaria variableName

1
Deadpool 16 sep. 2018 a las 16:28