Почему я могу инициализировать только таким образом? - PullRequest
0 голосов
/ 26 января 2020

я задаюсь вопросом, почему только можно установить данные в конструкторе, если я определю таким образом:

    public Auto(int ps, String kennzeichen) {
       super(ps,kennzeichen);
       this.ps = ps;
       this.kennzeichen = kennzeichen;
    }

Если я оставлю this.ps и this.kennzeichen, он будет инициализирован нулем. Я думал, что 'super' определяет наследование данных от моего конструктора класса Vehikel.

Main:

public class Main {

public static void main(String[] args) {

    ArrayList vehikel = new ArrayList();
    Scanner scinner = new Scanner(System.in);
    boolean eingabeFortf = true;

    Auto auto = new Auto(12, "HE-ML 123");

    System.out.println(auto.getKW());
    System.out.println(auto.getKennzeichen());
    System.out.println(auto.getPS());

Vehikel:

public abstract class Vehikel {

private int ps;
private String kennzeichen;
public final double uFaktor = 0.735;



public Vehikel(int ps, String kennzeichen) {
    this.ps = ps;
    this.kennzeichen = kennzeichen;
}

Auto:

public class Auto extends Vehikel {

private String kennzeichen;
private int ps;
private double kW;
private boolean mayDriveOnH;
private double steuer = 0;

public Auto(int ps, String kennzeichen) {
    super(ps,kennzeichen);
    this.ps = ps;
    this.kennzeichen = kennzeichen;
}

Спасибо.

1 Ответ

0 голосов
/ 27 января 2020

Я не знаком с Java, но что-то подобное должно поставить на правильный путь. Надеюсь, некоторые java люди исправят любые ошибки в следующем.

Код:

public abstract class Vehikel {

protected int ps; // change to protected
protected String kennzeichen; // change to protected
public final double uFaktor = 0.735;       

public Vehikel(int ps, String kennzeichen) {
    this.ps = ps;
    this.kennzeichen = kennzeichen;
}

public class Auto extends Vehikel {

// private String kennzeichen; // we have the protected field in the super class
// private int ps;  // we have the protected field in the super class
private double kW;
private boolean mayDriveOnH;
private double steuer = 0;

public Auto(int ps, String kennzeichen) {
    super(ps,kennzeichen);
    // this.ps = ps;   // You don't need this anymore because you can access the protected variable in the super class directly
    // this.kennzeichen = kennzeichen; // You don't need this anymore because you can access the protected variable in the super class directly
}

Объяснение:

Как сказал Энди Тернер выше, когда вы имеют ту же переменную в абстрактном классе, а также конкретный класс Auto, переменные в одной hide переменные в супер / абстрактном классе.

По сути, это разные переменные с одинаковыми именами

Я не могу сказать это лучше, чем это.

Используйте защищенное ключевое слово, так что вы можете получить доступ к переменным, определенным в суперклассе в автоклассе Auto.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...