为什么你不能在Java中拥有受保护的抽象类?

时间:2011-11-16 23:06:19

标签: java blackberry java-me abstract protected

我有一个抽象类,看起来像:

abstract class AbstractFoo implements Bar {
  //Code goes here
}

然而,当我尝试使AbstractFoo受到保护时,我得到一个错误编译时错误,抱怨它是一个非法修饰符。

protected abstract class AbstractFoo implements Bar {
  //Code goes here
}

为什么你不能在Java中拥有受保护的抽象类?

编辑:我应该提一下,这不是vanilla Java,实际上是Blackberry / J2ME。

6 个答案:

答案 0 :(得分:24)

正如其他许多人所指出的那样,这里的限制与你的类是抽象的,而不是你选择使用的可见性修饰符这一事实无关。请记住每个可见性修饰符的含义:

对于您使用关键字的课程<...

  • private:仅对此课程可见

  • (默认/包私有):仅对此类及其包中的类可见

  • protected:此类可见,包中的类以及此类的子类

  • 公开:任何班级都可以看到

无法将顶级课程声明为私有,因为之后什么都无法访问它们。

但是你的问题源于他们为什么不被宣布为受保护。很明显,受保护的顶级类(它能够存在)本身是可见的(每个类本身都是可见的)。很明显,受保护的顶级类对于其包中的类是可见的。但是,使其子类可见是很棘手的。应该允许哪些类继承我们的受保护类?

如果是全部,那么我们的课程也可能是 public ,因为我们说任何课程都有权访问我们的受保护类。如果它们都不是,那么我们的类也可能是 package-private ,因为只有其他两个条件(对它们本身和它的包中的东西可见)得到满足。它不可能是“其中的一部分”,因为我们需要一种方法来定义哪些类可以访问它,这首先是可见性修饰符的用途。

因此,出于这些原因,顶级类不能 私有受保护;他们必须 包私有公开

答案 1 :(得分:6)

顶级类只能是公共类或包私有(默认)。

public class PublicClass { 

    protected class InnerClass { } //protected makes sense here

}

class PackagePrivateClass { }

由于:PublicClassPackagePrivateClass都是顶级类,因此无法使用其他访问修饰符privateprotected

顶级类只允许公开和默认的访问修饰符。 但是对于内部成员类,也允许使用其他修饰符。

这个摘要最有可能没有做到这一点。

答案 2 :(得分:4)

你可以;以下代码compiles fine

public class Main {

    interface Bar {}

    protected abstract class AbstractFoo implements Bar {}

    public static void main(String[] args) {}
}

答案 3 :(得分:0)

我不相信这个问题的前提。我成功编译了以下代码:

class prot
{
    public abstract class pubab
    {
    }

    protected abstract class protab
    {
    }

    abstract class packprivab
    {
    }

    private abstract class privab
    {
    }
}

这告诉我你可以在java中拥有一个受保护的抽象类。就此而言,您可以拥有一个私人抽象类。

您是否尝试过受保护的顶级课程(不允许)?

答案 4 :(得分:0)

IMO,它看起来像是非法的修饰符,因为受保护意味着它应该在派生类的包+中可见。但是为了声明某个类扩展了这个受保护的类,你首先需要能够从那里看到它,这是不可能发生的,因为它只能从派生类中看到(假设超类和子类不在同一个类中)封装)。

如果您只希望能够在同一个包中看到其他类的类,则默认(包 - 私有)修饰符将起作用,没有理由让受保护的修饰符起作用 - 它只会增加完全不逻辑和无用的能力从派生类中查看类,

a)如果此类及其派生类不在同一个包中,则不会发生。

b)可能发生,因为这个类及其派生类在同一个包中 - 无论如何这都适用于默认(包 - 私有)修饰符。

答案 5 :(得分:0)

顶级课程不能有protected范围,只有publicpackage。这是一个nice reference,解释了类的范围修饰符的允许用途。