Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
两个类构成相同的实例??JAVA_Java_Class_Object_Instance_Inner Classes - Fatal编程技术网

两个类构成相同的实例??JAVA

两个类构成相同的实例??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

所以我在大学里参加了这次考试,考试的目的是创建一个有作者、书名、内容和译者的图书班

主要要求是只创建一个类,并在其中创建内部类(作者和翻译人员)

还有一个主要类来测试它

问题是,当我创建author和translator对象并试图更改它们的名称时,它们都会更改名称

这是我的密码:

图书类别:

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这有意义吗?