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.任何帮助,将不胜感激.谢谢!
你大多回答了自己的问题.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)