【问题标题】:Two classes making same instance?? java两个类制作相同的实例?爪哇
【发布时间】:2016-01-20 18:13:40
【问题描述】:

所以我在大学里参加了这个考试,目的是创建包含作者、标题、内容和译者的书籍类。

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

还有一个 Main 类来测试它。

问题是当我创建作者和翻译对象并尝试更改它们的名称时,它们都会更改名称。

这是我的代码:

图书课:

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 构造函数中你有 super(f, l);在Author的构造函数中你有translator = this;,所以当在Author的构造函数中调用super时创建Translator时,你将替换旧的Author,所以最后你将把它们都设置为Translator实例的值
  • 检查 super(f,l),你将翻译者的名字传递给作为作者的超类,所以他们肯定都得到相同的名字

标签: java class object instance inner-classes


【解决方案1】:

你可以这样修复它:

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 Translator(String f, String l) {
    super(f, l, false);
    translator = this;
}

【讨论】:

  • 是的,这是个好主意,但我无法更改 Main 类,那我该怎么办?
  • @nikagar4 您不必更改主类。我更新了我的答案。留下旧的构造函数并添加我建议的新构造函数。您可以同时拥有两者,因为它已超载。只需调用superboolean 即可获得Translator...
  • @nikagar4 这有意义吗?
【解决方案2】:

如果Translator 实现IPerson 而不是扩展Author 会更有意义。

【讨论】:

  • 是的,我知道,但请求是扩展而不是实现
【解决方案3】:

您正在Translator 的构造函数中调用super(f,l)Translator 正在更改 Author 字段,因为 Translator 的超类是 Author

【讨论】:

  • 好的,我考虑过,我不知道如何改变它,顺便说一下 setName 也会改变它们
  • 不是所有Translators都是Author,所以不应该是继承关系。你可以让Translator实现IPerson
  • 我同意翻译器应该实现 iperson 但请求是扩展
猜你喜欢
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
相关资源
最近更新 更多