【问题标题】:Java changing instance type to already created class typeJava 将实例类型更改为已创建的类类型
【发布时间】:2018-02-27 19:46:24
【问题描述】:

我是 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 类型,如下所示:

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 类才能使其工作?

【问题讨论】:

  • 你的Book类的构造函数叫做Raamat,我猜这个问题有编辑错误?
  • 什么是拉马特?
  • (旁注:哈利波特书籍的作者名叫 Rowling [在她的情况下发音为“rolling”],而不是 Rouling。)

标签: java constructor


【解决方案1】:

您必须先初始化 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");

【讨论】:

  • @Pshemo 完全错过了。我应该去喝我的早间咖啡! :)
【解决方案2】:

解决方案 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 类中再添加一个构造函数,并在将字符串author 传递给Book 时实例化一个新的Person

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;
    }
}

【讨论】:

    【解决方案3】:

    所以基本上它应该从 Person 的构造函数中获取作者的名字?

    不一定。您可以通过直接在 Book 构造函数中创建 Person 来保持客户端代码的简单。

    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 而不是 Stringdouble

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

    您甚至可以通过重载构造函数来提议两者。
    事实上,你应该使用的方式是对类客户端最实用的方式。

    【讨论】:

      【解决方案4】:

      author 应该是一个新的Person,其名称取自Book 的构造函数的name 字段。

      【讨论】:

        【解决方案5】:

        有两种方法可以解决这个问题:

        • 通过将构造函数上的参数类型更改为 Person:

          public class Book {
          
              private Person author;
              private String title;
          
              public Raamat(Person author, String title) {
                  this.author = author;
                  this.title = title;
              }
          }
          
          • 通过在构造函数上初始化作者:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多