我知道这是一个愚蠢的问题,但我仍然有一个疑问需要解决。

我的问题是,为什么不能将一个类定义为protected?

我知道我们做不到,但是为什么呢? 应该有一些特定的原因。

如果声明一个受保护的类怎么办?

我认为这是您正在寻找的东西:stackoverflow.com/questions/2534733/java-protected-classes:D

让我们只说为什么不能保护外部阶级? 内部类可以受到保护。

因为这没有意义。

受保护的类成员(方法或变量)就像package-private(默认可见性)一样,除了它也可以从子类访问。

由于在Java中没有"子包"或"包继承"这样的概念,因此声明受保护的类或包私有的将是同一回事。

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

>由于Java中没有子包或包继承这样的概念,因此声明受保护的类或包私有的将是同一回事。为什么受保护的类具有与package-private相同的可见性?它和公众一样吗?谢谢。

@Nikita Ryback你能解释一下什么是subPackage或包继承吗?我仍不清楚为什么在顶级类中使用了protected。

当您声明类成员为受保护成员时,其可见性是同一包(称为包访问权)和Subclassess上的类。如果尝试从其他程序包的外部类访问,则此受保护的方法成员不可见。

@kelgwiin我相信您不应该混合使用类和成员的访问修饰符。因为两者是不同的。虽然类允许将自己修改为public或default,但成员可以修改为public,private,protected和default。

@AppKart保护了A类中的字段,可以通过扩展A的Bs类方法来访问它,从而减少了如果要由C访问受保护的A类,则Cs父实体(此处为Nikita称为包)必须扩展为父实体。因为没有尼基塔这样的概念

"因为没有意义"-那是一个相当大胆的声明。它没有用Java定义,但是确实存在类似的东西。例如Kotlin中的open允许在当前包之外进行子类化(可以想象Java中的protected阻止了此操作,默认情况相反)。

如您所知,默认值是针对程序包级别的访问,而受保护的则是针对程序包级别以及非程序包的类,但这扩展了该类(这里要指出的是,只有在可见的情况下,您才可以扩展该类!)。

让我们这样说:

受保护的顶级类对其包中的类是可见的。

现在使它在包(子类)之外可见,这有点令人困惑和棘手。应该允许哪些类继承我们的受保护类?

如果所有类都允许子类化,那么它将类似于公共访问说明符。

如果没有,则类似于默认值。

由于没有办法限制仅由少数几个类继承该类(我们不能限制仅在一个包/一个包中的所有可用类中,只有少数几个类继承该类),因此不使用受保护的访问说明符对于顶级课程。因此,这是不允许的。

"现在使受保护的类在包(子类)之外可见是一个令人困惑和棘手的问题。应该允许哪些类继承我们的受保护的类?如果允许所有的类作为子类,那么它将类似于公共访问说明符。"真正帮助我理解了为什么受保护的类没有意义的问题:)

public class A

{

protected class B

{

}

}

定义受保护的字段将使该字段只能通过继承在包内部和包外部(仅在子类内部)访问。

因此,如果允许我们创建一个受保护的类,那么我们可以很容易地在包中访问它,但是要在包外部访问该类,我们首先需要扩展定义该类的实体(包)。

而且由于不能扩展包(可以导入),所以定义一个受保护的类将再次使其变为包私有的,这类似于将其定义为我们已经可以做的默认设置。

因此,定义一个私有类没有好处,只会使事情变得模棱两可。

有关更多信息,请阅读为什么外部Java类不能私有或受保护的原因

请披露任何隶属关系,请勿将网站用作通过发布来宣传您的网站的方式。请参阅如何写一个好的答案?。

@Nikita Rybak的回答很不错,但是没有细节,我不能不去深入思考就想出主意,以下是我的想法,现在我应该完全理解原因了。

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

因此,如果" private class foo"(定义的私有成员,即class本身是成员)允许,那么外部(包含该成员)是什么?文件范围?不,文件外部是没有意义的,因为即使单个文件中的多个类也将被编译成单独的类文件。所以外在就是包装。但是3级默认访问修饰符已经表示" package-private"。因此,将不会使用/不允许使用4级私人访问修饰符。

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

class PrivateNestedMain {

private static class Inner {

public static void main(String[] args) {

System.out.println("Hello from Inner!");

}

}

}

现在,如果"受保护的foo类"允许怎么办?受保护的主要特征是子类,因此external(package)应该(由于作用域而定,但仍是可选的)提供子类的样式,即sub-package或package A extends package B,但我们不知道这件事。因此,受保护的不能在外部是包的顶层使用全部潜力(主要作用域是子类范围的)(即没有此类子包的东西),但是受保护的可以在外部是类的嵌套类中使用全部潜力(即可以是子类):

class ProtectedNestedMain {

protected static class Inner {

public static void main(String[] args) {

System.out.println("Hello from Inner!");

}

}

}

请注意,上述"不能充分利用潜力"是因为它不能达到子类范围,这仅仅是因为没有外部子类,这意味着可以允许实际上受保护,这是选择的事情,以避免重复包装工作-private(如果外部不能子类化),请参见下文。

我的困惑主要是由https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html上的著名表引起的:

如果允许第一级(公共)和第三级(打包-私有),那么到底如何不允许第二级(受保护)之间?

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

public support subclass if the outer has subclass feature.

同样的误解适用于package-private,package-private不支持子类(单元格中为N)并不意味着子类概念适用于外部。

这意味着如果外部没有子类功能,我们应该忽略"子类"列:

正如我们现在所看到的,保护级别和程序包私有级别现在都处于同一级别(Y-Y-N),对于为什么不允许在中间级别之间的混淆,不再有任何困惑。总体而言,Java只选择package-private而不是protected以避免混淆(这只是选择的问题,但是受保护的主要特征是子类,因此package-private更好),结果,顶层仅允许使用2个访问修饰符:

At the top level—public, or package-private (no explicit modifier).

受保护与众不同。受保护的对象具有包级别的访问权限,而且只能通过继承在包外部访问。如果一个类在包外部声明A,则从其他包中继承一个类(通过使用INHERITANCE使用受保护的方法),则可以访问此类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

}

protected表示成员可以被同一包中的任何类访问

和子类,即使它们在另一个包中也是如此。

例:

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

}

对这个问题有意义的是,JVM是用C(Sun JVM)和C ++(oracle JVM)编写的,因此在编译过程中,我们将从Java文件中创建.class文件,如果我们使用Protected关键字声明了一个类, JVM将无法访问它。

为何JVM无法访问受保护的类的答案是,因为受保护的字段只能在同一个包内访问,或者只能通过继承来访问不同的包,而JVM的编写方式却使其无法继承will类。

希望这能满足这个问题:)

同样,顶级类也不能是私有的。解释如下:

那么,如果我们将定义一个私有类,该类将只能在定义它的实体(在我们的情况下是它的包)内访问,该怎么办?

因此,定义对类的私有访问将使它可以在默认关键字已为我们使用的同一个程序包中进行访问,因此,将类定义为私有不会带来任何好处,只会使事情变得模棱两可。

@ Akash5288的答案对我来说毫无意义:

If all the classes are allowed to subclass then it will be similar to public access specifier.

Since there is no way to restrict this class being subclassed by only few classes (we cannot restrict class being inherited by only few classes out of all the available classes in a package/outside of a package), there is no use of protected access specifiers for top level classes. Hence it is not allowed.

然后,您可以将相同的逻辑应用于受保护的方法和变量,然后它们也"类似于public"。包之外的所有类都可以扩展我们的公共类并使用其受保护的方法。为什么将方法和变量限制在扩展类上可以,但对整个类进行限制却不能呢?"类似于公众"不等于"与公众相同"。我的解释是,允许受保护的类是完全可以的,因为允许受保护的方法是可以的。

答案"您不能扩展您无法访问/查看的类"更合乎逻辑。

受保护:仅对包装级别*可见。

类被定义为保护--->不能从外部包扩展(不可见)。

而且,如果无法扩展它,那么将其保留为受保护是没有意义的,因为这样它将成为默认的允许访问权限。

同样适用于私有定义的类。

注意:嵌套类或内部类可以定义为protected或private。

*:探索受保护的关键字,为此答案,我使其简洁。

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

无论如何,我们为类提供了默认的访问修饰符,从受保护的访问修饰符中获得的唯一好处是:-通过子类在任何包中使用它。但是对于子类,父级"受保护"类的可见性将是私有的。因此无法访问。基本上,如果您有受保护的顶级类,则没有任何外部类可以通过对它进行子类化来获得访问权限。因此,为顶级类提供保护是没有意义的。

java 定义类私有类_关于java:为什么不能将一个类定义为protected?相关推荐

  1. JAVA创建一个私有域_使用java基础反射访问私有域、方法和构造函数

    1.类 public class ConfigData { private Map configs = null; private final String fileName = "conf ...

  2. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

  3. java string改变的影响_为什么Java的string类要设成immutable(不可变的)

    最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...

  4. java类的讲解_【java 基础】java类的权限讲解

    java类权限有四种,分别是public,protected,private和默认的权限.其中前三个权限是有明确定义的修饰符的,而默认的权限没有明确的修饰符(我们可以称之为default),在定义类, ...

  5. java请编写公共类继承抽象类_(Java相关)怎么理解抽象类,继承和接口?

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:海子 来源:博客园 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的 ...

  6. 学java要背的单词_学习JAVA必背的8类常用单词

    Java常用的词还是挺多的,初学者有空多看看,对快速入门Java编程还是有益的.本文沈阳达内IT培训为大家介绍学习JAVA必背的8类常用单词. 1.保留关键字(2个) const --常量,常数:用于 ...

  7. java 类文件分析_分析Java .class文件

    这章的一个例子虽然简单,但是我觉的很有一定代表性.例子如下: 1:class Act { 2:   public static void doMathForever(int m) { 3:      ...

  8. java有理数类的封装_【Java 教程(原创)】025.参数传值——有理数的类封装

    马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 本帖最后由 零度非安全 于 2017-4-7 11:09 编辑 点击图片穿越到 索引帖,听说有惊喜! ...

  9. 用java有理数类包含加减乘除_用java具体代码实现分数(即有理数)四则运算

    用java具体代码实现分数(即有理数)四则运算 1,背景 Java老师布置了一个关于有理数运算的题目,因为参考书上有基本代码,所以自己主要是对书上代码做了一点优化,使其用户交互性更加友好以及代码封装性 ...

  10. java有理数类的封装_【Java笔记】有理数的类封装

    分数是有理数(Rational),我们经常做分数的四则运算得到的是小数,如果我们运行分数的四则运算想要得到分数,要怎样做呢? 用类实现对有理数的封装可以做到. 有理数有两个重要的成员,即分子(nume ...

最新文章

  1. Linux下安装Foxit Reader
  2. View页面间的跳转
  3. mysql:java.lang.ClassCastException: java.base/java.math.BigInteger出现类型转换错误
  4. OpenGL延迟着色之二
  5. 图解10大机器学习算法
  6. Jdbc连接mysql的五种连接方式
  7. OllyDBG 入门系列(二)-字串参考
  8. 程序员合同日期不到想辞职_辞职报告怎么写最简单?写清楚理由和时间,签上姓名就OK了...
  9. 如何将div与页面的中间(水平/宽度)对齐[重复]
  10. 指纹、面部、语音识别技术,破解真的很简单!| 知乎
  11. 为什么构造函数不能声明为虚函数?
  12. 开机黑屏显示html,开机黑屏显示“This Product is covered by”解决方法
  13. 产品经理听完《等你下课》心态崩了?选择汇新云重振旗鼓
  14. jsp+ssm计算机毕业设计学校缴费系统【附源码】
  15. Unity中location和rotation赋值和更改
  16. 图机器学习——2.3 整图嵌入
  17. 各种滤镜算法C语言,Photoshop入门学习之PS 滤镜算法原理——染色玻璃
  18. 跟我学在高德地图——标注我的位置
  19. android 装苹果系统,安卓机子安装苹果IOS系统?
  20. 【友盟+】国庆假期旅游类APP使用报告(中)

热门文章

  1. 【JAVA自学笔记 DAY01】Java基础入门
  2. 狂神Springboot笔记
  3. Internet Explorer 无法打开 Internet 站点
  4. stm32f4有重映射么_stm32f4引脚重映射
  5. 计算机创造奇迹的英语作文,创造奇迹英语作文Creating Miracle
  6. 【Tom原创】我是这样手写Spring的,麻雀虽小五脏俱全
  7. 计算机无法识别苹果6手机,电脑无法识别iphone6怎么处理
  8. Ansible(十四)-- ansible 中的变量(三) set_fact 模块 注册变量实现跨play调用变量
  9. mongodb磁盘碎片整理
  10. authorization BASIC