2015-02-09 2 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 хочу сделать все то же самое, что и в первом, с разницей, что я хочу использовать имя объекта издателя класса в качестве третьего поля. В моем мышлении новичков я думал о решении вопроса, как показано в коде, но я не знаю, могу ли я как-то использовать локальную переменную основного метода в качестве переменной экземпляра.

У меня такое чувство, что я что-то делаю с новичком, поэтому любые советы или решения будут приветствоваться.

+1

Возможно, вам нужно передать экземпляр 'Publisher' в конструктор' Book' и установить его в переменную экземпляра (как и с 'bookName' и' language'). – Thilo

+0

Если вы создадите экземпляр 'Book', вы можете передать локальную' String' в конструктор. – khelwood

+0

Почему у вас есть этот второй конструктор, который позволяет создать неназванный и безстоящий «Издатель»? – Thilo

ответ

-1

Когда вы пишете Publisher publisher = new Publisher(); в вашем основном методе, вы просто создать экземпляр Publisher, но если вы используете 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. 

Update: Даже если вы можете получить доступ к publisher ссылки в приведенном выше смысле, это не очень хорошая практика. Вы должны инкапсулировать свои поля и получать к ним доступ с помощью сеттеров и геттеров. (См. Конструктор и метод getter для издателя)

+0

Объявляя публичное поле и манипулируя полем непосредственно внутри внешних классов, вы увеличиваете сцепление кода и уменьшаете сцепление, две плохие вещи. –

+0

Я знаю, но я только пытаюсь ответить на вопрос, а не «хорошие методы программирования». – Prudhvi

+1

Но здесь есть лучшие ответы, которые не допускают такой же ошибки. –

1

Вы можете легко добавить еще одно поле в Book, в котором хранится ссылка на издателя - точно так же, как у вас есть bookName и language.

Кроме того, я бы рекомендовал переместить ваш метод 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

Смежные вопросы