在java中,继承如何处理抽象类

在java中,继承如何处理抽象类,java,inheritance,abstract,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 e

我正在编写一些小代码,以确保我理解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";
    }
}

它没有编译,因为sport在super类中是私有的,但我认为FootballTeam1会继承它自己的sport副本,因为它扩展了Team1。任何帮助都将不胜感激。谢谢

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

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


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

您基本上回答了自己的问题。FootballTeam1无权访问其母公司的私有字段。这就是“”作用域的用途

然而,儿童足球队1确实有自己的场地副本。它有父类拥有的所有字段的副本,我可以看到这会造成混乱

这种区别的原因是模块化。父类的子类只能访问父类中明确声明它可以访问的部分。这允许开发人员考虑一个类的哪些部分将被暴露,在面向对象的目标中被称为“”;也就是说,类应该为扩展而打开,但为修改而关闭

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

private String sport = new String();
变成

protected String sport = new String();

如果您不想让子类直接访问字段,但想允许它更改字段,那么可以使用受保护的setter方法。例如,您可以将以下内容添加到
Team1

protected void setSport( String newValue ) {
    this.sport = newValue;
}

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

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意味着它不可用于子类(或任何外部的)。如果您希望它对子类可用,则必须对其进行保护。(顺便说一句,足球队1仍然有一个运动场,它只是无法直接访问)这与抽象的类无关。孩子足球队1如何访问自己的运动场副本?@Pounder275参见第一句,
protected
是一个字段或方法关键字,用于显示扩展类但不扩展继承树之外的类的类。我将调整答案以使其更清晰。因此,我需要使用受保护的方法,或者使getSport和setSport方法具体化,并在必要时覆盖它们?是的!如果要在子类(
FootballTeam1
)中实现方法,则必须更改超类(
Team1
)变量(
sport
)的访问修饰符,因为私有成员不会在子类中继承。因此,必须将
private
更改为
protected
,如果不想更改访问修饰符,则必须在抽象类(
Team1
)本身内部实现方法,以访问
sport
变量。
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();
}