Суперкласс переопределяет подкласс со значениями по умолчанию из конструктора в Java

У меня есть задание, и значения по умолчанию моего суперкласса всегда переопределяют значения, которые я передаю в основном методе Test. В отладчике я вижу передачу productNumber(1234) и productTitle(Daughter), но затем они переопределяются значениями по умолчанию. Любые мысли, я продолжаю вносить небольшие изменения, проверяя изменения, все те же результаты.

Надкласс продукта

public abstract class Product {
    private int productNumber;
    private String productTitle;
   
//Two constructors required
    public Product(){
        productNumber = 0;
        productTitle = "";
    }
    
    public Product(int productNumber, String productTitle) {
        this.productNumber = productNumber;
        this.productTitle = productTitle;
    }
  

    public void setProductNumber(int productNumber) {
        this.productNumber = productNumber;
    }

    public int getProductNumber() {
        return productNumber;
    }

    public void setProductTitle(String productTitle) {
        this.productTitle = productTitle;
    }
        
    public String getProductTitle() {
        return productTitle;
    }

    //Override toString() required
    @Override
    public String toString() {
        return productNumber + " " + productTitle;
    }
    
    // Required Product class declares abstract method with this signature: public String getDisplayText()
    public abstract String getDisplayText();
    
    //Override equals() required
    @Override
    public boolean equals(Object object) {
        if (object instanceof Product)  {
            Product product2 = (Product) object;
            if (productNumber == (product2.getProductNumber()) &&
                productTitle.equals(product2.getProductTitle())){
                    return true;
            }
        }
        return false;
    }  
}

Подкласс музыки расширяет суперкласс продукта

public class Music extends Product {
    private String artist;
    private String style;
    private String medium;

    public Music() {
        super();
        artist = "";
        style = "";
        medium = "";
    }

    public Music(int productNumber, String productTitle, String artist, String style, String medium) {
        super();
        this.artist = artist;
        this.style = style;
        this.medium = medium;
    }


    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }
    public String getStyle() {
        return style;
    }

    public void setStyle(String style) {
        this.style = style;
    }

    public String getMedium() {
        return medium;
    }

    public void setMedium(String medium) {
        this.medium = medium;
    }

    @Override
    public String getDisplayText() {
        return super.toString() + " by " + artist + " " + style + " " + medium;
    }
 
    @Override
    public boolean equals(Object object){
        if (object instanceof Music){
            Music m = (Music) object;
            if (artist.equals(m.getArtist()) &&
                style.equals(m.getStyle()) &&
                medium.equals(m.getMedium())){
                    return true;
            }
        }
        return false;
    }
}

Печать строки

public class Test {

    public static void main(String[] args) {
        // Expected result: 1234 Daughter by Pearljam Alternative online
        Music music1 = new Music(1234,"Daughter", "Pearljam","Alternative","online");
        System.out.println(music1.getDisplayText());
    }
    
}

person JWest    schedule 14.02.2021    source источник
comment
Боковое примечание: есть определенные сеттеры, но имеет ли смысл изменять название/номер продукта после создания объекта? См. также: неизменяемый класс/объект   -  person Andrew S    schedule 15.02.2021


Ответы (3)


вы не передаете значения из подкласса в родительский класс

вместо super() вам нужно сделать ниже -

super(productNumber,productTitle);

обновление необходимо в вашем коде: -

public Music(int productNumber, String productTitle, String artist, String style, String medium) {
        super(productNumber,productTitle);
        this.artist = artist;
        this.style = style;
        this.medium = medium;
    }
person Rahul Sawant    schedule 14.02.2021

Вам нужно передать productNumber и productTitle в вызове super(..., ...) внутри конструктора Music до родительского класса.

person DudeGuy    schedule 14.02.2021
comment
Спасибо, это работает. - person JWest; 14.02.2021

Вам нужно вызвать

super(productNumber, productTitle)

внутри конструктора Music, чтобы передать параметры его родителю.

person g-alkilani    schedule 14.02.2021