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
而不是 String
和 double
。
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
在 Java 中,是不是可以创建一个类型安全的类映射到其类的实例?
java 将Map值更改为其他类型。 Java Stream作为地图收集。