将局部变量的值传递给字段

时间:2015-02-09 00:00:15

标签: java class object

我是Java的新手,我正在为一所学校做任务,但我似乎陷入了基本面。

我的第一堂课如下:

public class Publisher {

    private String name;
    private String state;

    public Publisher(){}

    public Publisher(String name, String state) {
        super();
        this.name = name;
        this.state = state;
    }

    public String getName() {
        return name;
    }

    public String getState() {
        return state;
    }


}

在第一个类中,我有两个字段,其值通过构造函数更改,并且只能使用getter访问。我还有另一个构造函数,我用它来创建下一个类中的对象。

这是我的另一堂课:

public class Book {

    private String bookName;
    private String language;

    public static void main(String[] args) {

        Publisher publisher = new Publisher();
        String publisherName=publisher.getName();

    }



    public Book(String bookName, String language) {
        super();
        this.bookName = bookName;
        this.language = language;
    }



    public String getBookName() {
        return bookName;
    }

    public String getLanguage() {
        return language;
    }



}

在第二节课中,我基本上想要做与第一节相同的事情,不同之处在于我想将Publisher类的对象名称用作第三个字段。在我的新手思考中,我想到了解决问题,如代码所示,但我不知道我是否可以某种方式使用main方法的局部变量作为实例变量。

我感觉我在某处犯了初学者的错误,所以欢迎任何建议或解决方案。

3 个答案:

答案 0 :(得分:3)

如果你想要第三场,你应该先成功。然后你应该在你创建的每个对象中执行赋值(例如在构造函数中),否则它将是null

public class Book {
    private final String bookName;
    private final String language;
    private final Publisher publisher; //third field

    public Book(String bookName, String language, Publisher publisher) {
        super();
        this.bookName = bookName;
        this.language = language;
        this.publisher = publisher; //assignment of new field
    }

    public String getBookName() {
        return bookName;
    }

    public String getLanguage() {
        return language;
    }

    public String getPublisher() { //new getter
        return publisher;
    }
}

实际上,在您的代码中,您所做的就是创建在main方法结束后停止存在的局部变量。您应该使用main来测试您的课程,但对于分配这样的内容,它不会产生任何影响。我也在这里用final修饰符,因为我们应该避免可变性(你可以了解它)。

答案 1 :(得分:1)

您可以轻松地向Book添加另一个字段,该字段存储对发布商的引用 - 与bookNamelanguage完全相同。

另外,我建议您将main方法移到一个没有其他内容的新类中,以使其更简单。

public class Book {

    private String bookName;
    private String language;
    private Publisher publisher; // <--- NEW

    public Book(String bookName, String language, Publisher publisher) { // <--- NEW PARAMETER
        super();
        this.bookName = bookName;
        this.language = language;
        this.publisher = publisher; // <--- NEW
    }

    // main removed (add it to another class)

    public String getBookName() {
        return bookName;
    }

    public String getLanguage() {
        return language;
    }

    // NEW METHOD
    public Publisher getPublisher() {
        return publisher;
    }
}

答案 2 :(得分:-1)

当您在main方法中编写Publisher publisher = new Publisher();时,您只是创建Publisher的实例,但是如果您在Publisher中使用Book作为实例变量(字段) {1}}类,您可以在每次创建Book实例时使用它。

例如,如果您的Book类是这样的

public class Book {

    private String bookName;
    private String language;
    private Publisher publisher;

    public Book(String bookName, String language, Publisher publisher) {
        super();
        this.bookName = bookName;
        this.language = language;
        this.publisher = publisher;
    }

    public String getBookName() {
        return bookName;
    }

    public String getLanguage() {
        return language;
    }

    public Publisher getPublisher() {
        return publisher;
    }
}

您可以在任意位置创建Book课程,并使用其中的“发布商”字段来引用Publisher对象,如图所示。

Book b = new Book();
b.publisher = new Publisher(); // or any method that returns 'Publisher' type object.

更新:尽管您可以通过上述方式访问publisher引用,但这不是一个好习惯。您必须封装字段并使用setter和getter访问它们。 (请参阅Publisher的构造函数和getter方法)