Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在抽象类中使用getter和setter_Java_Oop_Abstract Class - Fatal编程技术网

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

Java 如何在抽象类中使用getter和setter,java,oop,abstract-class,Java,Oop,Abstract Class,我有一个抽象类Customer。这是一个非常简单的类,只设置了5个string变量以及5个static int变量。最好说明我的意思: 作为免责声明,我使代码尽可能简单,我的抽象类中包含了更多与问题无关的逻辑 抽象类 我的问题如下: 我有一个类,它扩展了这个抽象类,名为客户(不同的包)。如果我在此类中设置构造函数,如下所示: 对象类 这是否将我的字符串变量设置为我通过构造函数传递的内容?当我将这个类实例化为对象时,如何从中“获取”变量? 例如:(假设String1-String5是某种类型

我有一个抽象类
Customer
。这是一个非常简单的类,只设置了5个
string
变量以及5个
static int
变量。最好说明我的意思:

作为免责声明,我使代码尽可能简单,我的抽象类中包含了更多与问题无关的逻辑


抽象类 我的问题如下:

我有一个
,它扩展了
这个
抽象类
,名为
客户
(不同的包)。如果我在此
类中设置
构造函数
,如下所示:


对象类
这是否将我的
字符串
变量设置为我通过构造函数传递的内容?当我
这个
实例化为
对象
时,如何从中“获取”变量?
例如:(假设
String1-String5
是某种类型的
strings

然后,我将如何在类中稍后调用该对象以返回(任何单个变量的)字符串。如果我的
抽象类
不是
抽象类
,而是我用来
实例化
对象的主
,我会得到如下变量:
字符串名称=customer.getName()


TL;博士:
只是不确定如何从
对象
扩展
抽象类
中获取
变量

从子类中删除变量,这样它们就不会在父类中隐藏同名变量

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

public abstract class Customer {
    private String Name, Address, Phone, Email, Company;

public class Customer extends Main.Customer {
    private String Name, Address, Phone, Email, Company;

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

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

  • 在java中,按代码约定变量以小写开头。它将帮助包括您在内的人提高代码的可读性
  • 没有两个同名的类,这很容易混淆。例如,您可以将其称为
    ACustomer
    AbstractCustomer
    ,另一个称为
    Customer
    SomethingCustomer

  • 它不是
    对象类
    ,而是
    具体类
    一个可以拥有其实例的类

  • 由于客户继承了ACustomer,您不必再次定义
    ACustomer
    字段,客户已经拥有了这些字段。如果你这样做了,你就对父母隐瞒了


  • 您正在构造函数内调用一个可重写的方法,请注意这一点,因为如果
    setXXX
    被重写,那么您可能会有一个
    NullPointerException
  • 对于如何获取成员的问题,您可以定义
    getter

然后在客户端代码中:

ACustomer customer = new Customer(...);
customer.getName(); 

在抽象类中仅仅是一个简单的吸气剂就不起作用了。BTW——如果你想在构建一个类时设置很多变量,你可以考虑使用Fluent接口或Builder模式。@首先,我要问的是,当抽象类的子类被实例化为对象时,如何“调用”抽象类的getter/setter。这与使用方法调用对象相同吗?我的子类中没有getter/setter。其次是我个人编写代码的方式,我可以更容易地遵循这种风格。首先声明变量,然后是构造函数,然后是getter/setter,然后是任何其他方法。我个人喜欢show come
String name=customer.getName()不起作用?您指出抽象类中的get函数是公共的:
//下面声明公共getter和setter方法
。你的子类将自动获得这些公共方法。谢谢你我一直在寻找的。我已经公开声明了getter/setter,只是为了节省空间而没有发布它们。很高兴提供帮助。如果你认为这个答案是最好的,那么请点击复选标记接受它。
public String getName() {
    return Name;
}
public class Customer extends ACustomer {

         public Customer(String name, String address, String phone, String email, String company) {
             super(name, address, phone, email, company);
         }    
    }
public abstract class ACostumer{
      private String name;


     public String getName() {
       return name;
     }

 }
ACustomer customer = new Customer(...);
customer.getName();