私のプログラムがステートメントを特定の順序で出力する理由がわかりません。
がありStudent class
、その中にはInner Class of Address
. このプログラムの考え方は、最初に自宅の住所を学生オブジェクトに割り当てますが、次に内部住所クラスを利用して大学/学期の住所も割り当てることです。
コードは次のとおりです。
学生クラス(内アドレスクラスあり)
public class Student {
private String name;
private Address homeAddress, uniAddress;
public Student(String name, int houseNumber, String homeStreet) {
this.name = name;
homeAddress = new Address(houseNumber, homeStreet);
}
public String getName() {
return name;
}
public Address getHomeAddress() {
String s = "n/a";
if (homeAddress != null) {
return homeAddress;
} else {
// System.out.println(s);
return null;
}
}
public void setUniAddress(int num, String add) {
uniAddress = new Address(num, add);
}
public Address getUniAddress() {
String s = "n/aa";
//If uniAddress isn't set,
// then "n/aa" gets printed before anything else i/e toString() method - WHY?
if (uniAddress == null) {
System.out.println(s);
return null;
} else {
return uniAddress;
}
}
@Override
public String toString() {
return "NAME: " + getName() + "\n"
+ "HOME ADDRESS: " + getHomeAddress() + "\n"
+ "TERM TIME ADDRESS: " + getUniAddress();
}
// Inner Class
public class Address {
private int number;
private String street;
public Address(int no, String street) {
number = no;
this.street = street;
}
@Override
public String toString() {
//return name + "\n" + number + " " + street;
return number + " " + street;
}
}
} // more Student methods .. }
TestStudent クラス (main メソッドを使用)
public class TestStudent {
public static void main(String[] args) {
//Home Address
Student s1 = new Student("Cathy", 21, "Smithfield Drive");
//Uni Address
s1.setUniAddress(72, "Nottingham Drive");
Student.Address anotherAddress = s1.new Address(8, "Deerfield Way");
// note the use of new
System.out.println(s1.toString());
}
}
出力は次のとおりです。
n/aa
NAME: Cathy
HOME ADDRESS: 21 Smithfield Drive
TERM TIME ADDRESS: null
(all on new lines)
Student に Uni アドレスを割り当てない場合 (つまり、メソッドを呼び出すメイン メソッドの適切な行をコメント アウトする場合setUniAddress()
)、getUniAddress() メソッドから「n/aa」が返される理由に興味があります。toString()
メソッドの前に印刷されますか?(上記のように)
setUniAddress() メソッドを呼び出すと、出力は次のようになります。
NAME: Cathy
HOME ADDRESS: 21 Smithfield Drive
TERM TIME ADDRESS: 72 Nottingham Drive
(all on new lines)
これは意図したとおりに機能するようです。
また、 TERM TIME ADDRESSに「null」を出力する代わりに、(setUniAddress()
メソッドが呼び出されていない場合)、その場所に「n/aa」を返す方法についても考えています。
ありがとう。