#java
#java
Вопрос:
У меня есть класс с именем Customername, CustomerEmail и CustomerAddress в качестве переменных, установленных в объекте с именем a. Как мне напечатать переменные CustomerName, CustomerEmail и CustomerAddress в другом классе с именем BookingConfirmation? Я пытался:
System.out.println("Thanks for your booking " a.getCustomerName());
Вот код для класса Customer:
public class Customer {
String customerName;
String customerEmail;
String customerAddress;
public static void customerDetails() throws IOException {
Customer a = new Customer();
Scanner seekName = new Scanner(System.in); // Create a Scanner object
System.out.print("Your name: ");
a.customerName = seekName.nextLine(); // Read user input
Scanner seekEmail = new Scanner(System.in); // Create a Scanner object
System.out.print("Your email: ");
a.customerEmail = seekEmail.nextLine(); // Read user input
Scanner seekAddress = new Scanner(System.in); // Create a Scanner object
System.out.print("Your residential address: ");
a.customerAddress = seekAddress.nextLine(); // Read user input
System.out.println("Thanks for your booking " a.getCustomerName());
System.out.println("Eemail: " a.getCustomerEmail());
System.out.println("Address: " a.getCustomerAddress());
System.out.println();
}
public String getCustomerName() {
return customerName;
}
public String getCustomerEmail() {
return customerEmail;
}
public String getCustomerAddress() {
return customerAddress;
}
}
Комментарии:
1. Теоретически вы не можете получить доступ к локальной переменной (в данном случае
a
) из-за пределов ее области видимости. В вашем примере объектa
имеет область действия метода и не будет доступен извне функции customerDetails().2. Вы должны вернуть тот
Customer
объект, который вы создали в своем статическом методе, и тогда у вас будет действительный шаблон factory. Кроме того, инкапсулируйте свои поля (создайте ихprivate
, найдите геттеры и сеттеры).3. Что вы можете сделать, это изменить возвращаемый тип
customerDetails()
наCustomer
вместоvoid
и вернуть объектa
. И попробуйте получить к нему доступ из своегоBookingConfirmation
класса.4. как мне вернуть объект a и получить к нему доступ из класса BookingConfirmation?
Ответ №1:
Я не уверен, что понимаю, о чем вы спрашиваете, но, похоже, вы могли бы сделать следующее:
-
Пусть
customerDetails()
метод возвращаетa
(созданный объект Customer) в качестве результата метода. -
Вызовите
Customer.customerDetails()
изBookingConfirmation
и сохраните возвращаемое значение в локальной переменнойCustomer a
. -
Затем вы можете вызвать
System.out.println("Thanks for your booking " a.getCustomerName());
внутриBookingConfirmation
кода.
Комментарии:
1. Я просто хочу скопировать 3 переменные из класса Customer и распечатать их в предложениях (используя system.out.println() все сделано в терминале) в классе BookingConfirmation. Сканер получает имя в классе Customer. Класс BookingConformation печатает. «Мы получили ваше бронирование отеля (имя из класса Customer — переменная CustomerName).
Ответ №2:
Если вы просто хотите получить доступ к значению свойства извне класса, то вам нужно создать геттеры для каждого из свойств, которые вы хотите получить.
Если вы хотите изменить эти значения извне класса, вам необходимо создать установщик.
Получатели и установщики — это просто методы, которые позволяют вам получить доступ к свойствам класса за его пределами.
Если у вас есть класс Customer
и вы хотите получить доступ и изменить его имя извне, вы должны создать 2 метода,
//declare the property
private String name;
//getter
public String getName(){
return this.name;
}
//setter
public void setName(String newName){
this.name = newName;
}
//You can then instantiate a Customer object anywhere else and have access to those //properties
Customer cust = new Customer();
cust.setName("Mark")
System.out.println("Oh hi " cust.getName());
//output "Oh hi Mark"
Подробнее о получателях и установщиках
Кроме того, совет по рекомендациям: переменные экземпляра всегда должны быть объявлены как private
, чтобы облегчить инкапсуляцию. Если для переменной экземпляра в Java не предусмотрен модификатор доступа, по умолчанию используется default
модификатор, который делает переменную доступной для каждого класса в одном пакете.
Редактировать:
Ваша конкретная ошибка заключается в том, что вы создаете новый Customer
объект в своем customerDetails
методе и не возвращаете этот Customer
объект. Поэтому, как только метод был выполнен, Customer
созданный вами внутри объект уничтожается (удаляется из памяти, собирается мусор), потому что на него больше нет ссылок.
Вам либо нужно
Метод 1. Измените возвращаемый тип вашего метода customerDetails с void
на Customer
и добавьте return a
оператор в конце, тогда вам просто нужно будет создать экземпляр объекта Customer из вашего класса booking, вот так
public Customer customerDetails(){
Customer a = new Customer();
//your logic to set all of the properties
return a;
}
в вашем классе бронирования
Customer myCust = new Customer();
myCust = myCust.customerDetails();
Я бы не предпочел этот метод, потому что, как вы видите, вы просто создаете пустой объект, а затем переназначаете его. В качестве альтернативы вы можете добавить static
ключевое слово после public
, чтобы вы могли вызывать его, не создавая экземпляр объекта класса, например
класс бронирования
Customer myCust = Customer.customerDetails();
Метод 2: полностью удалите Customer a = new Customer()
из customerDetails и просто используйте this.name = sc.nextLine()
для установки имени любого экземпляра, вызывающего этот метод.
Затем в классе bookings создайте экземпляр нового объекта Customer и вызовите метод.
Customer myCust = new Customer();
myCust.customerDetails();
Комментарии:
1. Я думал, что создал геттеры для всех 3? Нужно ли мне создавать получатели в классе BookingConfirmation?
2. Вы создали геттеры. Мой ответ просто рассматривает оба, чтобы он был более информативным для широкой публики. Теперь, что печатает ваш оператор печати?
3.
System.out.println("Thanks for your booking " a.getCustomerName());
Код находится в BookingConfirmation, но для получения имени пользователя от Customer я должен использоватьCustomer.getCustomerName()
вместо этого? Не могли бы вы ввести код, который мне нужно будет использовать в классе BookingConfirmation, чтобы получить доступ к получателю из класса Customer для CustomerName?4. Если вы используете
Customer.getCustomerName()
, это статический метод. У вас нет статического метода. Статический метод — это тот, который вызывается из самого класса, а не из созданного объекта класса. Я вижу, в чем ваша ошибка. Вы создаете новыйcustomer
объект в своемcustomerDetails
методе, и этот метод ничего не возвращает. Создаваемый вами объект customer уничтожается сразу после завершения этого метода, потому что у вас нет на него никаких ссылок. Вам нужно изменить этот метод, чтобы вернутьCustomer
5. Я также хотел бы спросить: вы изучаете программирование самостоятельно или в рамках университетского курса? Если это последнее, я бы серьезно подумал о том, чтобы взять ваш учебник и пересмотреть первые главы. Я говорю это не для того, чтобы отговорить вас, а скорее, чтобы помешать вам совершать ошибки, которые я совершил, когда учился. Ваши знания на данный момент — это кусок швейцарского сыра. Может показаться, что он надежный, но в нем полно дыр. Методы / функции и классы лежат в основе объектно-ориентированного программирования. Вы должны доминировать над этим, прежде чем идти дальше, иначе у вас появятся плохие практики.