2015-02-09 37 views
0

我是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; 
    } 


} 

在第一类中,我有两个字段,它们的值通过构造发生了变化,并且只能使用干将访问。我还有另一个构造函数,我用它在下一个类中创建对象。

这里是我的其他类:

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; 
    } 



} 

在第二类中,我essentialy想要做的一切同样的事情在第一个,跟我想用出版者的对象名称的区别上课作为第三个领域。在我的新手想法中,我想如解决代码中所示的问题,但我不知道我是否可以以某种方式使用main方法的局部变量作为实例变量。

我有一种感觉,我在某处做初学者的错误,所以任何建议或解决方案都会受到欢迎。

+1

也许您需要将'Publisher'的实例传递给'Book'构造函数,并将其设置为一个实例变量(就像您使用'bookName'和'language'进行操作一样)。 – Thilo 2015-02-09 00:03:31

+0

如果你创建一个'Book'的实例,你可以将你的本地'String'传递给构造函数。 – khelwood 2015-02-09 00:03:39

+0

为什么你有第二个构造函数可以创建一个无名和无状态的'Publisher'? – Thilo 2015-02-09 00:04:34

回答

-1

当你写在你的主要方法Publisher publisher = new Publisher();,你只是创造Publisher的实例,但是,如果你在你的Book类使用Publisher作为一个实例变量(场),你可以用它每次创建时间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和getters访问它们。 (请参阅Publisher的构造函数和getter方法)

+0

通过将字段声明为public并通过在外部类中直接操作字段,可以增加代码耦合并降低内聚性,这是两件坏事。 – 2015-02-09 00:41:13

+0

我知道,但我只是想回答问题的问题,而不是“良好的编程实践”。 – Prudhvi 2015-02-09 00:43:25

+1

但是这里有更好的答案,不会犯同样的错误。 – 2015-02-09 00:45:35

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; 
    } 
} 
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变体,因为我们应该避免可变性(你可以了解它)。

+0

谢谢你的帮助,我现在明白要做什么 – Sarpy 2015-02-09 14:03:12