0

私のプログラムがステートメントを特定の順序で出力する理由がわかりません。

があり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」を返す方法についても考えています。

ありがとう。

4

2 に答える 2