【问题标题】:error in set and get methodsset 和 get 方法中的错误
【发布时间】:2015-02-14 04:50:51
【问题描述】:

我是一名 IT 一年级学生,正在学习 OOP...

我有这个抽象的父类...

public abstract class Person{
private String Name;

protected Person(){
    setName("xxxxxxxx");
}

public abstract String getName();
public abstract void setName(String name);

}

这是它的子类...

public class PetOwner extends Person{
private boolean hasKids;
private boolean hasAllergies;

public PetOwner(){
       setName("xxxx");
       setAllergies(true);
       setKids(true);
}

public PetOwner(String name, boolean a, boolean k){
    setName(name);
    setKids(k);
    setAllergies(a);
}

public String getName(){return Name;}
public void setName(String n){ Name = n;}

public boolean getAllergies(){return hasAllergies;}
public void setAllergies(boolean a){hasAllergies = a;}

public boolean getKids(){return hasKids;}
public boolean setKids(boolean k){hasKids = k;}

}

当我编译子类时,会出现“名称”是 Person 的私有变量的错误。

我的问题是如何通过不将其更改为 public 或 protected 来访问子类中父类的私有变量??

【问题讨论】:

  • 应该是Internal或者Public,不能访问私有成员

标签: java class abstract


【解决方案1】:
  1. 如果您不想将“字符串名称”访问修饰符更改为公共或受保护,请不要将名称设置器和获取器定义为抽象的。这样做:
public String getName(){return Name;} public void setName(String name){Name = name;}
  1. 在您的孩子班级;这样做:
public String getName(){return super.getName();} public void setName(String n){ super.setName(n);}

另一个注意事项:您没有在超类构造函数中为 Name 赋值。改写 Name = xxxx 因为你调用的是抽象的 setter!

【讨论】:

  • 还是编译不出来吗?
  • 我告诉你的解决方案肯定行,如果你告诉我更多我可以解决。
  • 当我从抽象类的方法中删除抽象时,它会显示“缺少函数体或抽象”
  • 嘿@KevinBigay,当您从父类中删除抽象关键字时,您需要提供默认实现。我在第一点中提到了这一点。
【解决方案2】:

private 成员对于定义它们的实体是私有的。protected 对于定义它们的实体及其子类是私有的。 public 表示无保护/无处不在。

粗略地说,如果您在给定实体中定义一个属性,那么几乎所有对它的管理都应该在同一个地方定义。这意味着如果Person 有一个name,那么setNamegetName 方法应该定义在Person 中。它们可以在子类中重新定义,但至少应该在Person 中定义。

想一想:为什么您希望(在常见情况下)每个PetOwnerClergyMan 都定义setName?他们可能都会做同样的事情。所以考虑Person中的定义是正确的方法。

【讨论】:

  • 我应该创建一个接口而不是抽象类吗??
  • 不,person 是部分定义的,所以它不是接口。
猜你喜欢
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多