簡體   English   中英

Java中擴展類的構造函數

[英]Constructors from extended class in Java

我在執行任務時遇到了一些麻煩。 在一項任務中,我們必須創建一個Person類。 我的是:

public class Person
{
    String firstName;
    String lastName;
    String telephone;
    String email;

    public Person()
    {
       firstName = "";
       lastName = "";
       telephone = "";
       email = "";
    }

    public Person(String firstName)
    {
        this.firstName = firstName;
    }

    public Person(String firstName, String lastName, String telephone, String email) 
    {
        this.firstName = firstName;
        this.lastName = lastName;
        this.telephone = telephone;
        this.email = email;
    }

    public String getFirstName()
    {
        return firstName;
    }

    public void setFirstName(String firstName)
    {
        this.firstName = firstName;
    }

    public String getLastName()
    {
        return lastName;
    }

    public void setLastName(String lastName)
    {
        this.lastName = lastName;
    }

    public String getTelephone()
    {
        return telephone;
    }

    public void setTelephone(String telephone)
    {
        this.telephone = telephone;
    }

    public String getEmail()
    {
        return email;
    }

    public void setEmail(String email)
    {
        this.email = email;
    }

    public boolean equals(Object otherObject)
    {
        // a quick test to see if the objects are identical
        if (this == otherObject) {
            return true;
        }

        // must return false if the explicit parameter is null
        if (otherObject == null) {
            return false;
        }

        if (!(otherObject instanceof Person)) {
            return false;
        }

        Person other = (Person) otherObject;
        return firstName.equals(other.firstName) && lastName.equals(other.lastName) &&
            telephone.equals(other.telephone) && email.equals(other.email);
    }

    public int hashCode() 
    {
        return 7 * firstName.hashCode() +
            11 * lastName.hashCode() + 
            13 * telephone.hashCode() + 
            15 * email.hashCode();
    }

    public String toString()
    {
        return getClass().getName() + "[firstName = " + firstName + '\n'
                                    + "lastName = " + lastName + '\n'
                                    + "telephone = " + telephone + '\n'
                                    + "email = " + email + "]";
    }
}

現在我們必須創建一個使用Person作為屬性的Loan類,然后擴展該Loan類。 我的貸款類是:

public abstract class Loan
{
    public void setLoanId(int nextId)
    {
        loanId = nextId;
        nextId++;
    }

    public int getLoanId()
    {
        return loanId;
    }

    public void setInterestRate(double interestRate)
    {
        this.interestRate = interestRate;
    }

    public double getInterestRate()
    {
        return interestRate;
    }

    public void setLoanLength(int loanLength)
    {
        this.loanLength = loanLength;
    }

    public int getLoanLength()
    {
        return loanLength;
    }

    public void setLoanAmount(double loanAmount)
    {
        this.loanAmount = loanAmount;
    }

    public double getLoanAmount(double loanAmount)
    {
        return loanAmount;
    }

    public void printPayments()
    {
        double monthlyInterest;
        double monthlyPrincipalPaid;
        double newPrincipal;
        int paymentNumber = 1;
        double monthlyInterestRate = interestRate / 1200;
        double monthlyPayment = loanAmount * (monthlyInterestRate) / 
                                (1 - Math.pow((1 + monthlyInterestRate),( -1 * loanLength)));

        // amortization table
        while (loanAmount != 0) {
            monthlyInterest = loanAmount * monthlyInterestRate;
            monthlyPrincipalPaid = monthlyPayment - monthlyInterest;
            newPrincipal = loanAmount - monthlyPrincipalPaid;
            loanAmount = newPrincipal;

            System.out.println("Payment Number | Interest | Principal | Loan Balance");
            System.out.printf("%d, %.2f, %f, %f", paymentNumber++, monthlyInterest, newPrincipal, loanAmount);
        }
    }
    /*
    //method to print first payment
    public double getFirstPayment()
    {
    }

    method to print last payment
    public double getLastPayment()
    {
    }*/

    private Person client;
    private int loanId;
    private double interestRate;
    private int loanLength;
    private double loanAmount;
    private static int nextId = 1;

}

然后用CarLoan類擴展了Loan類,有一個函數原型:

public CarLoan(Person client, double vehiclePrice, double downPayment, double salesTax,
                    double interestRate, CAR_LOAN_TERMS length)

我對如何使用超類中的Person構造函數感到困惑。 我不一定能這樣做

super(client);

在我的構造函數中,這是本書在他們的例子中用一些原始類型做的。 不確定要做的正確的事情是......有什么想法嗎? 謝謝!

CarLoan不應該延伸Person。 這是沒有意義的,因為CarLoan不能成為一個人。

但Person可以是CarLoan類中的類變量。

public class CarLoan {

  private Person client;
  private double vehiclePrice;

  public CarLoan(Person client, double vehiclePrice, double downPayment, double salesTax, double interestRate, CAR_LOAN_TERMS length) {

    this.client = client;
    this.vehiclePrice = vehiclePrice;
    ..
  }
}

看起來你想要使用組合而不是繼承。

簡單來說,CarLoan 有一個客戶(Person類型)。 CarLoan本身不是Person(繼承會建議)。

所以你應該做Espen所建議的(組合),而不是CarLoan extends Person (繼承)。

可能合法使用的繼承是:

class Waiter extends Person {
    String employeeId;

    // A waiter is a person with some extra information
    public Waiter(String firstName, String lastName, String telephone, 
                  String email, String employeeId) {
      super(firstName, lastName, telephone, email); // must be first
      this.employeeId = employeeId;
    }

}

如果CarLoan要擴展Person ,那么Person將成為CarLoan的超類。

CarLoan的構造函數中,您必須始終通過super關鍵字調用其中一個Person構造函數,然后才能進行任何其他處理。

但是,在我看來,你必須感到困惑,因為你的原型方法將Person的實例傳遞給CarLoan 此外,我不明白為什么一個名為CarLoan會擴展一個人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM