继承如何在java中使用抽象类

pon*_*275 3 java inheritance abstract

我正在编写一小段代码以确保我理解Java基础知识,并且我有以下内容.

package teams1;

public abstract class Team1{
    private String sport = new String();

    public abstract String getSport();

    public abstract void setSport();
}

import teams1.*;
abstract class FootballTeam1 extends Team1{

    public String getSport(){
        return "Football";
    }

    public void setSport(){
        this.sport="Football";
    }
}
Run Code Online (Sandbox Code Playgroud)

它没有编译,因为运动在超级类中是私有的,但我认为FootballTeam1将继承它自己的运动副本,因为它正在扩展Team1.任何帮助,将不胜感激.谢谢!

Chr*_*s K 5

你大多回答了自己的问题.FootballTeam1无权访问其父级的私有字段.这就是" 受保护 "范围的用途.

但是,子FootballTeam1确实有自己的字段副本.它有父类所有字段的副本,我可以看到它会引起混淆.

这种区别的原因是模块化.父类的子类只能访问父类的部分,这些部分已明确声明它可以访问.这允许开发人员在面向对象的目标(称为" 开放/封闭原则 ")下考虑要暴露的类的哪些部分; 也就是说,类应该是开放的扩展,但是关闭以进行修改.

例如,对类的最快"修复"是改变字段的范围

private String sport = new String();
Run Code Online (Sandbox Code Playgroud)

protected String sport = new String();
Run Code Online (Sandbox Code Playgroud)

要么

public String sport = new String();
Run Code Online (Sandbox Code Playgroud)

如果您不想让子类直接访问该字段,但确实希望允许它更改字段,则可以使用受保护的setter方法.例如,您可以添加以下内容Team1.

protected void setSport( String newValue ) {
    this.sport = newValue;
}
Run Code Online (Sandbox Code Playgroud)