Как мне получить доступ к переменным из другого класса в Java?

#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:

Я не уверен, что понимаю, о чем вы спрашиваете, но, похоже, вы могли бы сделать следующее:

  1. Пусть customerDetails() метод возвращает a (созданный объект Customer) в качестве результата метода.

  2. Вызовите Customer.customerDetails() из BookingConfirmation и сохраните возвращаемое значение в локальной переменной Customer a .

  3. Затем вы можете вызвать 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. Я также хотел бы спросить: вы изучаете программирование самостоятельно или в рамках университетского курса? Если это последнее, я бы серьезно подумал о том, чтобы взять ваш учебник и пересмотреть первые главы. Я говорю это не для того, чтобы отговорить вас, а скорее, чтобы помешать вам совершать ошибки, которые я совершил, когда учился. Ваши знания на данный момент — это кусок швейцарского сыра. Может показаться, что он надежный, но в нем полно дыр. Методы / функции и классы лежат в основе объектно-ориентированного программирования. Вы должны доминировать над этим, прежде чем идти дальше, иначе у вас появятся плохие практики.