繁体   English   中英

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

[英]how does inheritance work with abstract classes in java

我正在编写一小段代码以确保我理解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。 任何帮助,将不胜感激。 谢谢!

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

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

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

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

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;
}

由于类变量sport是私有的,因此对于声明它的类是私有的。扩展类不能以您尝试的方式访问此变量。

如果要以这种方式继续访问sport变量,请尝试使变量protected (允许扩展类对变量具有可见性),否则在抽象类和扩展/实现类中使用getter和setter来调用它们。

声明为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();
}

只需将private更改为protected private表示您的子类无权访问变量或方法,而protected允许此访问。

私有字段只能在同一个类中访问。 此外,继承主要用于在具有单独功能逻辑的派生类中定义相同的名称方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM