我有一个抽象类Customer
。这是一个非常简单的类,只设置5个string
变量以及5个static int
变量。更好地表达我的意思:
作为免责声明,我使代码尽可能简单,我的抽象类中涉及的逻辑与该问题无关。
public abstract class Customer {
private String Name, Address, Phone, Email, Company;
public static final int NAME = 0, ADDRESS = 1, PHONE = 2, EMAIL = 3, COMPANY = 4;
public Customer(String Name, String Address, String Phone, String Email, String Company) {
setValues(Name, Address, Phone, Email, Company);
}
private void setValues(String Name, String Address, String Phone, String Email, String Company) {
setName(Name);
setAddress(Address);
setPhone(Phone);
setEmail(Email);
setCompany(Company);
}
//declare public getters and setters methods below
}
我的问题如下:
我有class
extends
此abstract class
名为Customer
(不同的套餐)。如果我在此constructor
中设置class
:
public class Customer extends Main.Customer {
private String Name, Address, Phone, Email, Company;
public Customer(String Name, String Address, String Phone, String Email, String Company) {
super(Name, Address, Phone, Email, Company);
}
}
这是否将我的String
变量设置为通过构造函数的任何变量?就像我instantiate
这个class
作为object
一样,我怎样才能从中获取变量?
例如:(假设String1 -String5
是某种类型的strings
public class Random {
private Customer customer = new Customer(String1, String2, String3, String4, String5);
}
如何在类中稍后调用该对象以返回string
(任何单个变量)。如果我的abstract class
不是abstract
,而是class
我用instantiate
作为object
,那么我会得到这样的变量:String name = customer.getName();
不确定如何从variables
object
和extending
获取abstract class
。
答案 0 :(得分:3)
开始前的一些注意事项:
没有两个同名的课程,非常令人困惑。您可以将其称为ACustomer
或AbstractCustomer
,另一个Customer
或SomethingCustomer
它不是Object class
Concrete Class
一个类,你可以拥有它的实例。
由于客户继承了客户,您不必再次定义ACustomer
字段,客户已经拥有它们。如果您这样做,则隐藏来自父级的内容。
public class Customer extends ACustomer {
public Customer(String name, String address, String phone, String email, String company) {
super(name, address, phone, email, company);
}
}
setXXX
被覆盖,那么你可能会有一个NullPointerException
。getters
。public abstract class ACostumer{
private String name;
public String getName() {
return name;
}
}
然后在客户端代码中:
ACustomer customer = new Customer(...);
customer.getName();
答案 1 :(得分:2)
从子类中删除变量,这样他们就不会在父类中隐藏具有相同名称的变量。
//sub class
public class Customer extends Main.Customer {
//DROP THESE private String Name, Address, Phone, Email, Company;
public Customer(String Name, String Address, String Phone, String Email, String Company) {
super(Name, Address, Phone, Email, Company);
}
}
将getter添加到您的父类:
//parent class
public abstract class Customer {
private String Name, Address, Phone, Email, Company;
public static final int NAME = 0, ADDRESS = 1, PHONE = 2, EMAIL = 3, COMPANY = 4;
public Customer(String Name, String Address, String Phone, String Email, String Company) {
setValues(Name, Address, Phone, Email, Company);
}
private void setValues(String Name, String Address, String Phone, String Email, String Company) {
setName(Name);
setAddress(Address);
setPhone(Phone);
setEmail(Email);
setCompany(Company);
}
public String getName() {
return Name;
}
public String getAddress() {
return Address;
}
//etc....
}
另外,我真的建议为父类和子类使用不同的名称以避免混淆。
答案 2 :(得分:0)
您的子类掩盖了抽象类的私有属性。
public abstract class Customer {
private String Name, Address, Phone, Email, Company;
public class Customer extends Main.Customer {
private String Name, Address, Phone, Email, Company;
所以你的抽象类中的任何get方法都是
public String getName() {
return Name;
}
将返回子类中从未初始化的变量名称。然而,当你调用super(...)
时,set函数会设置抽象类的变量。
所以你要设置一组变量,但是要读取另一组从未初始化的变量。