两个类构成相同的实例??JAVA
所以我在大学里参加了这次考试,考试的目的是创建一个有作者、书名、内容和译者的图书班 主要要求是只创建一个类,并在其中创建内部类(作者和翻译人员) 还有一个主要类来测试它 问题是,当我创建author和translator对象并试图更改它们的名称时,它们都会更改名称 这是我的密码: 图书类别:两个类构成相同的实例??JAVA,java,class,object,instance,inner-classes,Java,Class,Object,Instance,Inner Classes,所以我在大学里参加了这次考试,考试的目的是创建一个有作者、书名、内容和译者的图书班 主要要求是只创建一个类,并在其中创建内部类(作者和翻译人员) 还有一个主要类来测试它 问题是,当我创建author和translator对象并试图更改它们的名称时,它们都会更改名称 这是我的密码: 图书类别: public class Book { private Author author; private Translator translator; private String ti
public class Book {
private Author author;
private Translator translator;
private String title;
private String text;
public interface IPerson {
public void setFirstName(String name);
public String getFirstName();
public void setLastName(String name);
public String getLastName();
}
//Author
public class Author implements IPerson{
private String firstName;
private String lastName;
public Author(String f, String l){
firstName = f;
lastName = l;
author = this;
}
public void setFirstName(String name){
this.firstName = name;
}
public String getFirstName(){
return this.firstName;
}
public void setLastName(String name){
this.lastName = name;
}
public String getLastName(){
return this.lastName;
}
}
public Author getAuthor(){
return this.author;
}
//Translator
public class Translator extends Author{
public Translator(String f, String l) {
super(f, l);
translator = this;
}
}
public Translator getTranslator(){
return this.translator;
}
public String getTranslatorFullName(){
return this.getTranslator().getFirstName() + " " + this.getTranslator().getLastName();
}
public String getText() {
return this.text;
}
public void setText(String text) {
this.text = text;
}
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDisplayTitle(){
return getTitle() + " Author: " + this.getAuthor().getFirstName() + " " + this.getAuthor().getLastName();
}
}
主要类别:
public class Main {
public static void main(String[] args){
Book mybook = new Book();
mybook.setTitle("Fight Club");
mybook.setText("First rule of Fight Club, you do not talk about Fight Club");
Book.Author author = mybook.new Author("John","Doe");
Book.Translator translator = mybook.new Translator("Alan","Rickman");
System.out.println(mybook.getDisplayTitle());
System.out.println(mybook.getAuthor().getLastName());
System.out.println(mybook.getAuthor().getFirstName());
System.out.println(mybook.getTranslatorFullName());
System.out.println(mybook.getTranslator().getFirstName());
}
}
它必须通过这些测试,我的问题是什么
不要告诉我让Translator实现IPerson,是我的老师要求扩展的你在调用
Translator的构造函数超级(f,l)
Translator
正在更改Author
字段,因为Translator
的超类是Author
,您正在Translator
的构造函数中进行超级(f,l)
调用Translator
正在更改Author
字段,因为Translator
的超类是Author
,如果Translator
实现IPerson
而不是扩展Author
,如果Translator
实现,则更有意义IPerson
而不是扩展Author
您可以这样修复它:
public Author(String f, String l, boolean authorCheck){
firstName = f;
lastName = l;
if(authorCheck)
{
author = this;
}
}
public Author(String f, String l){
firstName = f;
lastName = l;
author = this;
}
您可以这样修复它:
public Author(String f, String l, boolean authorCheck){
firstName = f;
lastName = l;
if(authorCheck)
{
author = this;
}
}
public Author(String f, String l){
firstName = f;
lastName = l;
author = this;
}
在翻译器构造函数中有super(f,l);在作者的构造函数中有translator=this;,所以在创建翻译器时,在Author中调用super;s构造函数您将替换旧的Author,因此最终您将使用Translator instance的值设置它们。检查super(f,l),将Translator名称传递给super类,该类是作者,因此在您的Translator构造函数中,它们肯定都具有相同的名称,您有super(f,l);在作者的构造函数中有translator=this;,所以在创建翻译器时,在Author中调用super;s构造函数你将替换旧的Author,因此最终你将使用Translator instance的值设置它们检查super(f,l),将Translator名称传递给super类,该类是Author,因此它们肯定都具有相同的名称好的,我已经考虑过了,我不知道如何更改它,顺便说一句,setName也会同时更改它们。并非所有翻译人员都是作者,因此它不应该是继承关系。你可以让翻译人员实现IPersoni同意翻译人员应该实现IPersoni,但请求是生成extendOK。我认为,我不知道如何更改它,顺便说一句,setName也会同时更改这两个值。并非所有翻译人员都是作者,所以不应该是继承关系。你可以让翻译人员实现IPersoni同意翻译人员应该实现IPersoni,但请求是让extendyeah我知道,但请求是让extend而不是implementsyeah我知道,但请求是让extend而不是implementsyeah这是个好主意,但我不能更改主类,那我该怎么办?@nikagar4你不必改变主课。我更新了我的答案。保留旧的构造函数并添加我建议的新构造函数。您可以同时拥有这两者,因为它超载了。只需使用布尔值调用super
就可以了,译者
。@nikagar4这有意义吗?是的,这是个好主意,但我不能更改主类,那么我该怎么办?@nikagar4你不必更改主类。我更新了我的答案。保留旧的构造函数并添加我建议的新构造函数。您可以同时拥有这两者,因为它超载了。只需使用布尔值调用super
,Translator
。@nikagar4这有意义吗?