Java 将实例类型更改为已创建的类类型

Posted

技术标签:

【中文标题】Java 将实例类型更改为已创建的类类型【英文标题】:Java changing instance type to already created class type 【发布时间】: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。) 【参考方案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;
    

【讨论】:

以上是关于Java 将实例类型更改为已创建的类类型的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 字段的类型已从 STRING 更改为 TIMESTAMP

在 nextjs 中,对象类型从服务器更改为客户端

在 Java 中,是不是可以创建一个类型安全的类映射到其类的实例?

java 将Map值更改为其他类型。 Java Stream作为地图收集。

创建后将 POSIX 套接字的类型从 UDP 更改为 TCP

将数据绑定 DataGridView 上的单元格类型更改为自定义 DataGridViewCell 类型