我正在编写一小段代码以确保我理解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";
}
}
它没有编译,因为运动在超级类中是私有的,但我认为FootballTeam1将继承它自己的运动副本,因为它正在扩展Team1。任何帮助,将不胜感激。谢谢!
答案 0 :(得分:5)
你大多回答了自己的问题。 FootballTeam1无权访问其父级的私有字段。这就是' protected'范围用于。
但是,孩子FootballTeam1确实拥有自己的字段副本。它有父类所有字段的副本,我可以看到它会引起混淆。
这种区别的原因是模块化。父类的子类只能访问父类的部分,这些部分已明确声明它可以访问。这允许开发人员在面向对象的目标(称为' Open/Closed Principle&#39 ;;也就是说,类应该是开放的扩展,但是关闭以进行修改。
最快的解决方法'到该类是改变字段的范围,例如
private String sport = new String();
变为
protected String sport = new String();
或
public String sport = new String();
如果您不想让子类直接访问该字段,但确实希望允许它更改字段,则可以使用受保护的setter方法。例如,您可以将以下内容添加到Team1
。
protected void setSport( String newValue ) {
this.sport = newValue;
}
答案 1 :(得分:2)
由于类变量sport
是私有的,因此对于声明它的类是私有的。扩展类不能以您尝试的方式访问此变量。
如果要以这种方式继续访问protected
变量,请尝试创建变量sport
(允许扩展类以使变量具有可见性),否则在抽象类中使用getter和setter以及扩展/实现类来调用它们。
答案 2 :(得分:2)
Private
声明为private的方法,变量和构造函数只能在声明的类本身内访问。
Protected
在超类中声明受保护的变量,方法和构造函数只能由其他包中的子类或受保护成员类的包中的任何类访问。
修改后的代码:
package com.org.abstractc;
public abstract class Team1{
// you have to change this private to protected then it will be inherited
// in child class.
protected String sport = new String();
public abstract String getSport();
public abstract void setSport();
}
答案 3 :(得分:0)
只需将private
更改为protected
即可。 private
表示您的子类无法访问变量或方法,而protected
允许此访问。
答案 4 :(得分:0)
私人字段只能在同一个类中访问。此外,继承主要用于在具有单独功能逻辑的派生类中定义相同的名称方法。