英文:
How do I access variables from another class in Java?
问题
我有一个名为Customer的类,其中customerName、customerEmail和customerAddress是在名为a的对象中设置的变量。我该如何在另一个名为BookingConfirmation的类中打印变量customerName、customerEmail和customerAddress?我尝试过:
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);
System.out.print("Your name: ");
a.customerName = seekName.nextLine();
Scanner seekEmail = new Scanner(System.in);
System.out.print("Your email: ");
a.customerEmail = seekEmail.nextLine();
Scanner seekAddress = new Scanner(System.in);
System.out.print("Your residential address: ");
a.customerAddress = seekAddress.nextLine();
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;
}
}
英文:
I have a class called Customer with customerName, customerEmail and customerAddress as variables set in an object called a. How do I print the variables customerName, customerEmail and customerAddress in another class called BookingConfirmation? I tried:
System.out.println("Thanks for your booking " + a.getCustomerName());
Here is the code for Customer class:
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
得分: 2
不确定我是否明白您的问题,但似乎您可以执行以下操作:
1)使customerDetails()
方法将a
(创建的Customer对象)作为该方法的结果返回。
2)从BookingConfirmation
中调用Customer.customerDetails()
,并将返回的值保存在一个名为Customer a
的局部变量中。
3)然后您可以在BookingConfirmation
代码内部调用System.out.println("Thanks for your booking " + a.getCustomerName());
。
英文:
I'm not sure I know what you're asking, but it seems that you could do the following:
-
Have the
customerDetails()
method returna
(the created Customer object) as the result of the method. -
Call
Customer.customerDetails()
fromBookingConfirmation
, and save returned value in a local variableCustomer a
. -
Then you can call
System.out.println("Thanks for your booking " + a.getCustomerName());
inside theBookingConfirmation
code.
答案2
得分: 0
如果您只想从类的外部访问属性的值,那么您需要为每个要检索的属性创建getter方法。
如果您想要从类的外部修改这些值,您需要创建一个setter方法。
Getter和Setter只是允许您在类外部访问类的属性的方法。
如果您有一个名为Customer
的类,并且想要从外部访问和修改它的名称,您需要创建2个方法,
//声明属性
private String name;
//getter
public String getName(){
return this.name;
}
//setter
public void setName(String newName){
this.name = newName;
}
//然后您可以在任何其他地方实例化一个Customer对象,并访问这些属性
Customer cust = new Customer();
cust.setName("Mark");
System.out.println("Oh hi " + cust.getName());
//输出 "Oh hi Mark"
阅读更多关于getter和setter
此外,最佳实践提示:实例变量应始终声明为private
以帮助封装。如果在Java中未为实例变量提供访问修饰符,则默认为default
修饰符,这使得该变量对于同一包中的每个类都是可访问的。
编辑:
您的特定错误是在customerDetails
方法内创建了一个新的Customer
对象,但未返回此Customer
对象。因此,一旦方法被执行,您在内部创建的Customer
对象就会被销毁(从内存中清除,垃圾回收),因为没有进一步的引用。
您可以选择:
方法1:将customerDetails
方法的返回类型从void
更改为Customer
,并在结尾处添加return a
语句,然后您只需从预订类中实例化一个Customer对象,像这样:
public Customer customerDetails(){
Customer a = new Customer();
//设置所有属性的逻辑
return a;
}
在您的预订类中
Customer myCust = new Customer();
myCust = myCust.customerDetails();
我不太喜欢这种方法,因为正如您所看到的,您只是创建了一个空对象,然后重新分配给它。或者您可以在public
之后添加static
关键字,这样您就可以在没有实例化类的对象的情况下调用它,如下所示:
预订类
Customer myCust = Customer.customerDetails();
方法2:从customerDetails
中删除Customer a = new Customer()
,并且只需使用this.name = sc.nextLine()
来设置调用此方法的实例的名称。
然后在预订类中,实例化一个新的Customer对象并调用该方法。
Customer myCust = new Customer();
myCust.customerDetails();
英文:
If you simply want to access the value of a property from outside of the class, then you need to create getters for each one of the properties you want to retrieve.
If you want to modify these values from outside of the class, you need to create a setter.
Getters and Setters are simply methods that allow you to access properties of a class outside of it.
If you have the class Customer
and want to access and change it's name from outside, you'd create 2 methods,
//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"
Read more on getters and setters
Also, best practices tip: instance variables should always be declared as private
to help encapsulation. If no access modifier is provided for an instance variable in Java, it defaults to the default
modifier, which makes the variable accessible for every class within the same package.
Edit:
Your specific error is that you are creating a new Customer
object within your customerDetails
method, and you're not returning this Customer
object. Therefore, as soon as the method has been executed, the Customer
object you created inside is destroyed (cleared from memory,Garbage collected), because there is no further reference to it.
You either need to
Method 1: Change the return type of your customerDetails method from void
to Customer
and add a return a
statement at the end, then you would simply need to instantiate a Customer object from your booking class, like so
public Customer customerDetails(){
Customer a = new Customer();
//your logic to set all of the properties
return a;
}
in your booking class
Customer myCust = new Customer();
myCust = myCust.customerDetails();
I would not prefer this method, because as you see, you're just creating an empty object then reassigning to it. You may alternatively add the static
keyword after public
so that you can call it without having instantiated an object of the class, like so
booking class
Customer myCust = Customer.customerDetails();
Method 2: remove the Customer a = new Customer()
from the customerDetails altogether and simply use this.name = sc.nextLine()
to set the name of whatever instance is calling this method.
Then on bookings class, instantiate a new Customer object and call the method.
Customer myCust = new Customer();
myCust.customerDetails();
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论