【问题标题】:how does inheritance work with abstract classes in java继承如何与java中的抽象类一起工作
【发布时间】:2014-11-19 13:16:16
【问题描述】:

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

【问题讨论】:

  • Private 意味着它不适用于子类(或任何外部的东西)。如果您希望它对子类可用,则必须对其进行保护。 (顺便说一下FootBallTeam1还有一个运动场,只是不能直接访问)
  • 这与抽象类无关。

标签: java inheritance abstract


【解决方案1】:

您大部分都回答了自己的问题。 FootballTeam1 无权访问其父级的私有字段。这就是 'protected' 范围的用途。

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

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

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

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

【讨论】:

  • 子 FootballTeam1 将如何访问它自己的字段副本?
  • @ponder275 见第一句,protected 是一个字段或方法关键字,用于为扩展类而不是继承树之外的类提供可见性。我会调整答案以使其更清楚。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    Private 声明为私有的方法、变量和构造函数只能在声明的类本身内访问。

    Protected在超类中声明为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();
    }
    

    【讨论】:

    • 所以我要么需要使用受保护的,要么需要将 getSport 和 setSport 方法具体化并在必要时覆盖它们?
    • 是的!如果您在子类 (FootballTeam1) 中实现您的方法,则必须更改超类 (Team1) 变量 (sport) 的访问修饰符,因为子类中不继承私有成员。因此,您必须将private 更改为protected,如果您不想更改访问修饰符,则必须在抽象类(Team1) 内部实现您的方法才能访问sport 变量。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 2016-07-02
        • 1970-01-01
        相关资源
        最近更新 更多