如何在抽象类中使用getter和setter

时间:2014-03-26 01:40:36

标签: java oop abstract-class

我有一个抽象类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 extendsabstract 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();


TL; DR:

不确定如何从variables objectextending获取abstract class

3 个答案:

答案 0 :(得分:3)

开始前的一些注意事项:

  • 在java中,代码约定变量以小写字母开头。它将帮助包括您在内的人们编写可读性。
  • 没有两个同名的课程,非常令人困惑。您可以将其称为ACustomerAbstractCustomer,另一个CustomerSomethingCustomer

  • 它不是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函数会设置抽象类的变量。

所以你要设置一组变量,但是要读取另一组从未初始化的变量。