Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不能将类定义为受保护的?_Java_Class_Protected - Fatal编程技术网

Java 为什么不能将类定义为受保护的?

Java 为什么不能将类定义为受保护的?,java,class,protected,Java,Class,Protected,为什么我们不能将类定义为受保护的类 我知道我们不能,但为什么?应该有一些具体的原因。因为这毫无意义 受保护的类成员(方法或变量)与包私有(默认可见性)类似,只是它也可以从子类访问。 因为Java中没有“子包”或“包继承”这样的概念,所以声明类保护或包私有是同一回事 但是,您可以将嵌套类和内部类声明为protected或private。正如您所知,默认值用于包级访问,protected用于包级和非包级类,但它扩展了此类(这里需要注意的是,只有在类可见的情况下,您才能扩展该类!)。 public c

为什么我们不能将类定义为受保护的类


我知道我们不能,但为什么?应该有一些具体的原因。

因为这毫无意义

受保护的类成员(方法或变量)与包私有(默认可见性)类似,只是它也可以从子类访问。
因为Java中没有“子包”或“包继承”这样的概念,所以声明类保护或包私有是同一回事


但是,您可以将嵌套类和内部类声明为protected或private。

正如您所知,默认值用于包级访问,protected用于包级和非包级类,但它扩展了此类(这里需要注意的是,只有在类可见的情况下,您才能扩展该类!)。
public class A
{
    protected class B
    {
    }
}
让我们这样说:

  • 受保护的顶级类将对其包中的类可见
  • 现在让它在包(子类)之外可见有点混乱和棘手。应该允许哪些类继承我们的受保护类
  • 如果所有类都被允许子类化,那么它将类似于公共访问说明符
  • 如果没有,则与默认值类似

由于无法将此类限制为仅由少数类构成的子类(我们无法将类限制为仅由包中/包外所有可用类中的少数类继承),因此顶级类不使用受保护的访问说明符。因此它是不允许的。

行为“受保护”=行为“默认”+“在任何包的任何子类中使用它”


不管怎样,我们对类有默认的访问修饰符,我们从受保护的访问修饰符中得到的唯一好处是:-通过子类化在任何包中使用它。但对于子类,父“受保护”类的可见性将是私有的。所以它不能被访问。基本上,如果您有一个受保护的顶级类,那么没有外部类可以通过子类化它来获得访问权。因此,为顶级类提供保护是毫无意义的。

受保护与公共类不同。受保护的同时具有包级访问权限,并且只能通过继承在包外部访问。如果一个类(如包外部的a)从其他包继承了一个类(使用继承的受保护方法),则它可以访问该类B的方法,该类B具有受保护的方法,但子类派生自该类,即。,A无法访问受保护的方法..public的情况正好相反

例如:

package 2;
class B
{
protected void method1()
{
}
}
package 1;
import 2.B;
class A extends B
{
//can access protected method
}
class C extends A
{
//can't access the protected method
}
package a;
class parent{
 protected void p();
}
package b;
import a.p;
class child extends parent{
  //you can access method which is protected in the parent in the child 
}
class another extends child {
 //here you can not access the protected method 
}
有好的观点,但缺乏细节,我不能简单地得到这个想法而不深入思考自己,以下是我的想法,现在我应该完全理解的原因

四个访问修饰符,假设第一级是公共的,第四级是私有的(按顺序)。我们应该知道的第一件事是为什么类不能在顶级中定义为private

那么,如果“私有类foo”(定义的私有成员,即类本身是成员)允许,那么外部(包含该成员)是什么文件范围?不,文件外部没有意义,因为即使是单个文件中的多个类也会编译成单独的类文件因此外部包是。但是第三级默认访问修饰符已经表示“包私有”。因此,将不使用/不允许使用第四级私有访问修饰符

但是嵌套的私有类是允许的,因为直接外部是类,而不是包:

现在,如果“受保护的类foo”允许怎么办?受保护的主要特征是子类,因此外部(包)应该(由于范围不同,但仍然是可选的)提供子类的样式,即子包,或者
包A扩展包B
,但我们不知道这类事情。因此受保护的不能在外层为包的顶层使用全电位(主要作用域为子类范围)(即没有这样的子包东西),但受保护的可以在外层为类的嵌套类中使用全电位(即可以是子类)

class ProtectedNestedMain {
    protected static class Inner {
        public static void main(String[] args) {
            System.out.println("Hello from Inner!");
        }
    }
}
请注意,上面所说的“不能充分利用潜力”,因为它不能达到子类的范围,仅仅因为没有外部子类,这意味着实际保护的可以被允许如果外部子类不能的话,这只是一个选择问题,以避免重复包私有的工作,见下文

我的困惑主要是由以下著名的表格引起的:

如果一级(公共)和三级(包专用)允许,那么二级(受保护)之间究竟如何不允许

公共支持子类如此容易产生误导。阅读此表的正确方法是

如果外部具有子类功能,则公共支持子类

同样的误导也适用于package private,package private不支持子类(Nin cell)并不意味着子类概念适用于outer

这意味着,如果外层空间中没有子类功能,我们应该忽略子类列:

正如我们现在所看到的,受保护和包私有现在都是相同的级别(Y-Y-N),对于为什么不允许在这两个级别之间,没有更多的混淆。总的来说,Java只选择包私有,过度保护,以避免混淆(这只是一个选择问题,但受保护的主要特征是子类,因此包私有是优越的),并且,顶层只允许2个访问修饰符:

在顶级public或package private(无显式修改器)


定义一个受保护的字段可以使该字段在包内以及包外仅通过继承(仅在子类内)进行访问

因此,如果允许我们将一个类设置为受保护的,那么我们就可以非常容易地在包内访问它,但是要在包外访问该类,我们首先需要扩展该类
package a;
class parent{
 protected void p();
}
package b;
import a.p;
class child extends parent{
  //you can access method which is protected in the parent in the child 
}
class another extends child {
 //here you can not access the protected method 
}