Java继承

Java继承,java,inheritance,Java,Inheritance,我有一个关于Java继承的问题。如果我有这个基类 class Parent { private String lastName; public Parent() { lastName = "Unassigned"; } public String getLastName( ) { return lastName; } public void setLastName(String name) {

我有一个关于Java继承的问题。如果我有这个基类

class Parent {

    private String lastName;

    public Parent() {
        lastName = "Unassigned";
    }

    public String getLastName( ) {
        return lastName;
    }

    public void setLastName(String name) {
        lastName = name;
    }
}
这个子类呢

class Child extend Parent {

        private String surName;

        public Child(String name) {
            surName = name;
        }

        public void setFullName(String first, String last) {
            surName = first;
            ..... = last;
        }

}
我现在想在子类中创建一个方法,它可以更改方法中的姓氏和姓氏。因此,我想知道如何才能在基类中找到私有成员lastname。我应该使用继承的setLastName()方法,还是可以不通过这种方式访问变量


对于是否要重写基类中的setLastName()方法,我还有疑问。如何访问基类中的私有成员lastname?

您不能从继承的类访问私有成员。您可以使它们受到保护,也可以使用setter(在我看来,后者更可取)


您可以在继承的类中重写setLastName(),并通过“super”关键字(super.setLastName(“something”))使用基类的setter更改私有成员。

您应该调用setLastName方法

 public void setFullName(String first, String last) {
    surName = first;
    setLastName(last);
 }
或者可以使父类中的lastName受到保护。在这种情况下,您可以在子类中这样使用它:

public void setFullName(String first, String last) {
    surName = first;
    lastName = last;
 }

不能从子类访问父类的私有成员。

根据经验规则:始终将类成员声明为私有,并始终通过方法(最简单的方法是getter/setter)访问它们。到目前为止,我偏离这条规则的唯一原因是:懒惰

对于您的附加问题:像这样覆盖setLastName:

@Override
public void setLastName(String lastName) {
  doSomethingSpecial(lastName);      
  super.setLastName(lastName);
  doSomethingElse();      
}
(如果不必在setter中执行特定于子级的操作,则不必实现
在您的情况下,父类实现对于子类是可见的)

具有带有公共访问器的私有字段称为封装

如果封装字段,则所有其他类(包括子类)都必须使用访问器访问该字段。这被认为是良好的实践,因为它允许您更改内部实现,而无需更改使用类的代码。想象一下,当其他人的代码(您甚至可能不知道)使用您的代码,并且在您更改内部表示后仍然可以使用您的代码时,这是多么有用

我们在编写代码时所做的大多数事情都是为了减少软件开发的痛苦

所以在你的情况下,你会写

class Child extends Parent {
  private String surName;
  public Child(String name) {
    surName = name;
  }
  public void setFullName(String first, String last) {
    surName = first;
    this.setLastName(last);
  }
  @Override
  public void setLastName(String last) {
    // ...
    super.setLastName(last);
    // ...
  }
}

我认为您不需要姓氏属性,因为姓氏是您的姓氏。

如果您在继承层次结构中遇到语义或命名方面的冲突,您应该重新评估您的设计。在大多数情况下,不需要直接的子类化,这会导致耦合过紧。如果名字冲突,很可能你违反了所谓的利斯科夫替换原则(LSP)。另请参见

如果要覆盖该方法,该怎么办?如何访问lastname?然后,将成员更改为protected?请参阅我回答该问题的第二段。您应该问问自己,如果您使用的是同一个成员,为什么要覆盖该方法。@Fortega,这只是一个示例,以便我可以问我的问题。但是谢谢你的建议:)这是
类Child用
s
扩展父类。你应该重新考虑你的类名。继承意味着“是一种”关系。孩子总是父母吗?对我来说不是这样。