繁体   English   中英

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

[英]How to use getters and setters in an 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
}

我的问题如下:

我有一个classextends这个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变量设置为我通过构造函数传递的变量? 就像当我将该class instantiate化为object ,如何从中“获取”变量?
例如:(假设String1 -String5是某种strings

public class Random {
private Customer customer = new Customer(String1, String2, String3, String4, String5);

}

之后,我将如何在类中调用该对象以返回(任何单个变量的) string 正如如果我的abstract class是不是abstract ,但主要的class我使用,以instantiateobject ,我得到的变量,像这样: String name = customer.getName();


TL; DR:

只是不确定如何从extending abstract classobject获取variables

开始之前的一些注意事项:

  • 在Java中,按代码约定的变量以小写字母开头。 这将帮助包括您在内的人提高代码的可读性。
  • 没有两个具有相同名称的类,这非常令人困惑。 您可以调用它,例如ACustomerAbstractCustomer以及另一个CustomerSomethingCustomer

  • 不是Object class而是Concrete Class类,您可以拥有它的实例的类。

  • 当客户继承ACustomer时,您不必再次定义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(); 

从子类中删除变量,以使它们不会在父类中隐藏具有相同名称的变量。

//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....

}

另外,我真的建议为您的父类和子类使用不同的名称,以避免混淆。

您的子类使抽象类的私有属性黯然失色。

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函数将设置抽象类的变量。

因此,您要设置一组变量,但要读取另一组从未初始化的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM