我目前正在開發一個程式,在我的子類中,我需要一個無引數建構式來用空字串初始化物件。
我嘗試過使用 super,我有 setter 和 getter 方法,但我不斷收到“欄位 Person.name 不可見”。我也得到了地址和電話號碼。
如何使其可見,并且可以在不提供建構式引數的情況下初始化物件?如果我做錯了什么并需要解決某些問題,請告訴我(:
// Create a class named Person
public class Person {
// Fields: name, address, and phone number. (2 points)
private String name;
private String address;
private String phoneNumber;
// No argument constructor that initializes the object with empty strings for name, address, and phone. (2 points)
public Person () {
super();
this.name = "";
this.address = "";
this.phoneNumber = "";
}
// 3 argument constructor that initializes the object with a name, address, and a phone number. (2 points)
public Person2 (String name, String address, String phoneNumber) {
this.name = name;
this.address = address;
this.phoneNumber = phoneNumber;
}
// Getter/setter methods for each of the fields. (3 points)
// set/get name
public void setName (String name) {
this.name = name;
}
public String getName () {
return this.name;
}
// set/get address
public void setAddress (String address) {
this.address = address;
}
public String getAddress () {
return this.address;
}
// set/get phone number
public void setPhoneNumber (String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getPhoneNumber () {
return this.phoneNumber;
}
// toString method that returns a string for the name, address, and phone number (2 points)
// (you can override the toString method as part of a class which is pretty swag)
public String toString() {
return "Name: " name "\n" "Address: " address "\n" "Phone: " phoneNumber;
}
}
// Create a subclass of Person named Customer
class Customer extends Person {
// A field for a customer number. (1 point)
private String customerNumber;
public Customer () {
// A no argument constructor that initializes the object with an empty string for the name, address, phone, and customer number. (2 points)
super(name, address, phoneNumber);
}
// A 4 argument constructor that initializes the object with a name, address, a phone number, and a customer number. (2 points)
public Customer2 (String name, String address, String phoneNumber, String customerNumber) {
this.name = name;
this.address = address;
this.phoneNumber = phoneNumber;
this.customerNumber = customerNumber;
}
// Getter/setter method for the customer number field. (1 point)
public void setCustomerNumber (String customerNumber) {
this.customerNumber = customerNumber;
}
// toString method that prints the information from the Person toString as well as the customer number (2 points)
public String toString() {
return "Name: " name "\n" "Address: " address "\n" "Phone: " phoneNumber "\n" "Customer Number: " customerNumber;
}
}
uj5u.com熱心網友回復:
如果一個欄位被標記為私有訪問,那么它只能從該類或它的實體內部訪問。您應該使用 get 方法。或者,您可以獲得結果toString并以此為基礎。
此外,所有建構式都應與類同名(不添加“2”)。
public class Person {
private String name;
private String address;
private String phoneNumber;
public Person() {
this("", "", "");
}
public Person(String name, String address, String phoneNumber) {
this.name = name;
this.address = address;
this.phoneNumber = phoneNumber;
}
public void setName (String name) {
this.name = name;
}
public String getName () {
return this.name;
}
public void setAddress (String address) {
this.address = address;
}
public String getAddress () {
return this.address;
}
public void setPhoneNumber (String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getPhoneNumber () {
return this.phoneNumber;
}
@Override
public String toString() {
return "Name: " name "\n" "Address: " address "\n" "Phone: " phoneNumber;
}
}
// Create a subclass of Person named Customer
class Customer extends Person {
private String customerNumber;
public Customer () {
this("", "", "", "");
}
public Customer (String name, String address, String phoneNumber, String customerNumber) {
super(name, address, phoneNumber);
this.customerNumber = customerNumber;
}
public String getCustomerNumber() {
return customerNumber;
}
public void setCustomerNumber (String customerNumber) {
this.customerNumber = customerNumber;
}
@Override
public String toString() {
return super.toString() "\n" "Customer Number: " customerNumber;
}
}
uj5u.com熱心網友回復:
private除了宣告它的類之外,您不能訪問或分配給任何其他類中的欄位。您不能使用類名稱以外的任何名稱宣告建構式。因此
Person2andCustomer2既不是有效的建構式也不是有效的方法。(方法需要回傳型別!)建構式必須顯式(通過
super呼叫)或在其超類中隱式鏈接無引數建構式。
基本上,您在超類中初始化私有欄位的選擇是使用super(...)呼叫來鏈接傳遞值的超類建構式,或者在子類建構式中呼叫超類 setter 方法。
例如,4 arg 建構式Customer可以是:
public Customer (String name, String address,
String phoneNumber, String customerNumber) {
super(name, address, phoneNumber);
this.customerNumber = customerNumber;
}
或者
public Customer (String name, String address,
String phoneNumber, String customerNumber) {
super();
setName(name);
setAddress(address);
setPhoneNumber(phoneNumber);
this.customerNumber = customerNumber;
}
IMO,前者更好。它更簡潔,更具可讀性。
中的toString()方法Customer不能直接參考Person. 它可以使用欄位的吸氣劑。
uj5u.com熱心網友回復:
我認為沒有任何實際需要在 person 類中呼叫超級建構式。但是,在客戶類的建構式中,您應該只呼叫不帶引數的超級建構式。
編輯:或者您可以在宣告時直接啟動值,就像我上面的那個人說的那樣。
PS。有點不相關,但是,你可以有一個建構式,但給引數默認值。因此,您可以使用和不使用引數來呼叫它,而無需覆寫它。
uj5u.com熱心網友回復:
您提供的代碼段中存在一些問題:
無需為同一類的建構式定義不同的名稱。他們的簽名(即輸入引數集)不同的事實就足夠了。
關于您的問題,錯誤是您試圖直接訪問客戶建構式中的 Person 私有欄位。有兩種方法可以解決此問題:
- 將 Person 欄位的范圍從 private 更改為protected。這將允許任何繼承 Person 類的類直接訪問上述欄位。
- 在 Customer 類中,使用 getter/setter 方法訪問私有欄位。
uj5u.com熱心網友回復:
如果我正確理解你的問題,這樣的事情會起作用:
私有字串名稱 = "";
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/467955.html
上一篇:使用JavaStreamAPI對List<Object>進行排序
下一篇:Nattable內部剪貼板的優勢
