Я новичок в Java и в настоящее время изучаю конструктор. Итак, у меня есть Person класс

class Person {

    private String name;
    private double height;

    Person(String name, double height) {
        this.name = name;
        this.height = height;
    }
}

И Book класс

public class Book {

    private String author;
    private String title;

    public Raamat(String author, String title) {
        this.author = author;
        this.title = title;
    }
}

И Test класс

public class TestBook {
    public static void main(String[] args) {
        Book harryp = new Book("Rouling", "Harry Potter");
    }
}

Моя задача состоит в том, чтобы изменить класс Book, чтобы в качестве автора указывался тип Person вместо String-type, например так:

private String author  -->  private Person author

Так что класс Book будет выглядеть так:

public class Book {

    private Person author;
    private String title;

    public Book(String author, String title) {
        this.author = author;
        this.title = title;
    }
}

Таким образом, в основном он должен получить имя автора из конструктора Person's? Или как это работает? И как мне изменить класс Test, чтобы он работал?

2
shindeiru 27 Фев 2018 в 22:46

5 ответов

Лучший ответ

Решение 1:

public class Book {
    private Person author;
    private String title;

    public Book(String author, String title) {
        this.author = new Person(author);
        this.title = title;
    }
}

class Person {

    private String name;
    private double height;
    public static final double DEFAULT_HEIGHT = 0.0;

    Person(String name, double height) {
        this.name = name;
        this.height = height;
    }

    Person(String name) {
        this(name, DEFAULT_HEIGHT);
    }
}

Вы должны добавить еще один конструктор в свой класс Person и создать новый Person при передаче строки author в Book

Book b = new Book("Mike", "Book Title");

В качестве альтернативы, передайте person экземпляр в Book и получите доступ к имени по getName():

public class Book {
    private Person author;
    private String title;

    public Book(Person author, String title) {
        this.author = author.getName();
        this.title = title;
    }
}
1
Haifeng Zhang 27 Фев 2018 в 19:57

Сначала вам нужно инициализировать объект Person.

Person author = new Person("foo", 100d);

Затем вы можете изменить класс Book следующим образом:

public class Book {

    private Person author;
    private String title;

    public Book(Person author, final String title) {
        this.author = author;
        this.title = title;
    }
}

И, наконец, инициализируйте объект Book следующим образом:

Person author = new Person("foo", 100d);
Book b = new Book(author, "My Title");
2
user2004685 27 Фев 2018 в 19:52

Таким образом, в основном это должно получить имя автора от конструктора Person?

Не обязательно. Вы можете сохранить код клиента простым, создав Person непосредственно в конструкторе Book.

public class Book {

    private Person author;
    private String title;

    public Book(String authorName, double height, String title) {
        this.author = new Person(authorName, height);
        this.title = title;
    }
}

Вы бы назвали это:

Book book = new Book("author", 170, "book title");

Yon также может принять Person в качестве параметра в конструкторе:

public Book(Person author, String title) {
    this.author = author;
    this.title = title;
}

И в этом случае клиентский код должен передавать Person, а не String и double.

Person author = new Person("author", 170)
Book book = new Book(author, "book title");

Вы даже можете предложить оба варианта, перегружая конструктор.
Фактически, способ, который вы должны использовать, является наиболее практичным для клиентов класса.

1
davidxxx 27 Фев 2018 в 19:59

author должен быть новым Person, имя которого берется из поля name конструктора Book.

0
Jim Kiley 27 Фев 2018 в 19:49

Есть два способа решить эту проблему:

  • Изменяя тип параметра вашего конструктора на Person:

    public class Book {
    
        private Person author;
        private String title;
    
        public Raamat(Person author, String title) {
            this.author = author;
            this.title = title;
        }
    }
    
    • Инициализируя автора в конструкторе:

        открытый класс Book { частное лицо автор; частное название строки; public Raamat (автор строки, название строки) { this.author = new Person (автор); this.title = title; } }  
0
Thomas Fritsch 27 Фев 2018 в 20:19