同包类 和 其他类 java_关于继承:为什么Java中的“protected”修饰符允许访问同一个包中的其他类?...

在Java中,具有"受保护"修饰符的成员不仅可以由同一个类和子类访问,还可以由同一个包中的每个人访问?

我想知道语言设计的原因,而不是实际的应用程序(例如,测试)

+1坦率地说我也想知道为什么。 它总是让我感到震惊,因为它是Java中最愚蠢的设计决策之一。

@cletus:我想的时间越长,我就得出结论"包私"是一个没有深思熟虑的想法。 对于"封装私有"到实际工作并提供任何类型的实际保护,需要在单个编译单元内编译包。 人们不应该在以后加强它们。

修饰符在http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html中有详细描述。从那里我们看到这个数字。

Modifier        Class     Package Subclass  World

public          Y         Y         Y         Y

protected       Y         Y         Y         N

no modifier     Y         Y         N         N

private         Y         N         N         N

由此可见设计决策的原因很明显:它有一个很好的对称矩阵。

无论如何它会是对称的......

谢谢你这张桌子。

@迈克尔·迈尔斯:嗯,不,不管怎样它都不会对称。它的对称性是有原因的。

如果在protected - >包交叉处放置N而不是Y,则它仍然是对称的。只是不那么漂亮。

@MichaelMyers:我不认为Matrix是对称的。但目前的情况是:所有Y在对角线之上(和之上)以及所有N在下方。

这种设计基于这样的想法:包装是适当的单元,由一个内部一致的团队维护和发布;继承关系与谁维护和释放什么时候关系不大。

感谢您的回答。当然实际上并没有起作用,因为没有人阻止你在几个罐子上分发一个包装 - 并且在几个团队中使用它。所以这是另一个没有充分考虑的好主意。 Java充满了一些东西。

在Java 1.0中,有第五个访问修饰符:private protected。这是protected没有默认访问权限。显然它从来没有真正正常工作,并在1.1中被删除。因此看起来声称protected被定义为总排序的方式似乎是虚假的。 (编辑:看来,在1.1中删除第五个访问修饰符的原因中至少有一个原因是缺少总排序干扰了重载选择规则。)Java 7中的module访问修饰符有一些设计问题在这方面。

鉴于认为成员的默认访问修饰符为"包私有"是个好主意,protected应该至少具有这种访问级别似乎是合理的。对于我的钱,protected根本不会用语言付费。

我从来没有听说过那个,但我在1.1中进入Java ...谢谢!

并且由于没有人阻止您在不同的jar文件中向包中添加更多类,因此"package private"也不是那么私有。原样:除了私人和公共之外的任何东西或多或少都是对程序员的暗示,但没有真正的保护。

一个非常晚的问题,但你有一个来源吗?我现在想更详细地了解当时失败的原因和原因。

@PieterDeBie那是来自记忆。 22年前,我将我正在进行的内部项目从1.0升级到1.1。 bugs.sun.com只给我"私有保护"被删除以简化规范的其他部分 - 例如,有关覆盖的规则要求访问保护是可比较的(即严格地比较弱或强。)

@Martin你可以在清单中将罐子标记为"密封",这可以防止任何添加。当然可以修改jar本身 - 包括类文件。除非您对jar进行签名,否则您无法将任何类添加到具有不同签名的相同运行时包中(假设签名已经过验证)。此外,来自不同类加载器的任何类都将位于不同的运行时包中。

基本上它与包作为api控制单元的视图有关(因此建议使用您的域名启动您的包 - 保证全局唯一性),因此可见性从私有 - > package-private - > protected - > public 。如果受保护不是增加包私有,而是增加不同类型的可见性,则必须有某种方法在需要时组合两种类型的可见性。

但是没有人阻止你在已经退出的包中添加新类。因此,"私有包"和"受保护"只是对程序员的推荐。两者都没有为想要/需要调用该方法的恶意/绝望程序员提供任何真正的保护。 - 像C ++中的"protected"至少会强制使用子类 - 但在Java中你甚至不需要这样做。

鉴于渐进级别的访问,私有,包,受保护和公共,如果它受到保护然后打包将会不必要地限制,因为这将迫使我允许子类访问以便授予同一包的其他成员。然而,直观地说,应该是同一个包中的其他类比"那里"的其他类更值得信赖。所以在包和公共之间受到保护,因为它允许更广泛的访问。

我认为基本原因依赖于直觉,即同一个包中的类之间存在基本的"信任"级别;你可以合理地期望他们彼此做正确的事 - 在大多数情况下,包将由一个工程师或团队负责,所以应该有一致的设计和谐。

这就是理论。但是在实践中,只有当一个包需要在一个编译单元中编译而无法在外部增强时才会出现这种情况。但情况并非如此,因此,在一个苗条的代表类的帮助下,任何"包私有"方法都可以公之于众。对程序员的暗示,但不是真正的保护。

@martin:只有在没有密封的情况下发布包,才能解决这个特殊问题。

"密封包装" - 从来没有听说过,但听起来很有趣。告诉我更多! (几句话帮我google细节就够了)

我自己找到了:docs.oracle.com/javase/tutorial/deployment/jar/sealman.html - 非常有趣。应该默认;-)。

Java确实遵循其设计原则。当您尝试减少/缩小子类中公共方法的范围时会发生什么?一个人得到一个错误。

Java范围修饰符级别如下:private

包中的所有类都应该是友好的,因为它们一起工作。要使成员在包中可用,它将在默认范围内定义。

子类可以驻留在包外部,再次遵循范围级别:private

请不要将修饰符限制为仅可见性,但继承,结构也同时工作并将它们添加到图片中。如果是这样的话:private

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java打印已经被加载的类_使用URLClassLoader加载类,不会报错,但被加载类中的内容也没有打印出来...

被加载类和加载类的程序在一个文件夹下;运行没有任何结果:D:java_exercise>javac URLTest.javaD:java_exercise>java URLTestD:java_exercise>加载类:import java.net.*;import java.io.File;import java.net.URLClassLoader ;publi…

python反序列化总结_单例模式的反序列化总结

最近观看effective in java ,提到单例模式创建过程中,如果是要保证该对象是可序列化的,需要考虑两点:1、继承Serializable接口2、增加readResolve方法比较疑惑的是为什么需要增加这个方法,在以往的使用中需要被序列化的…

ipv6+ssh+java_IPv6的本地联网地址计算方法详解

IPv6的世界里,如果DHCP6和SLACC这两位大佬都为没有为可怜的网卡分配IP地址,也没有人为网卡设置静态的IP地址,系统就会为网卡计算一个IPv6的网址来。这样的网址只能在本地使用,不得路由,所以,被称为“link-l…

java gzipoutputstream_java – GZIPInputStream逐行读取

我有一个.gz格式的文件。用于读取此文件的java类是GZIPInputStream。但是,此类不会扩展BufferedReader类的java。因此,我无法逐行读取文件。我需要这样的东西reader new MyGZInputStream( some constructor of GZInputStream)reader.readLine()...我虽然…

java互斥锁的实现原理_java-深入分析synchronized原理

互斥锁互斥锁futex,全拼fast userspace mutexes,直翻为快速用户空间互斥器,它是我们上层应用实现锁的最常用方法。futex是一块所有进程都可以访问的内存,是通过cpu的原子操作修改内存中的值来尝试获取琐,如果没有竞争&…

php 自定义加密算法,php自定义加密函数、解密

“/*加密*/function addcoder($str){$yuan abA!c1dB#ef2Cg$h%iD_3jkl^E:m}4n.o{&F*p)5q(G-r[sH]6tuIv7wJxy8z9K0;$jia zAy%0Bx1C$wDv^Eu2-t3(F{sr&G4q_pH5*on6I)m:l7.Jk]j8K}ihgf9#ed!cb[a;if ( strlen($str) 0) return false;for($i 0;$i{for($j 0;$j{if($str[$i…

京东开普勒php接口,IOS菜鸟初学第十五篇:接入京东开普勒sdk,呼起京东app打开任意京东的链接-Go语言中文社区...

我之前写了一篇关于接入京东联盟sdk的文章,但是最近,由于这个原因,如下图导致需要重新集成京东的sdk,但是由于某种原因,因为android和ios端不统一,android接入的是京东开普勒的SDK,这次为了统一…

php用不了for循环吗,php中的这两个for循环有什么区别吗?

如下两个for循环,执行的结果不一样的。for($i 0,$j 0;$i dump($i . - . $j);}echo ;for($i 0;$i dump($i . * . $j);}}结果打印:string(3) "0-0"string(3) "1-1"string(3) "2-2"string(3) "3-3"string(3) &q…

php输出楼层号,ZBlog开发中实现评论楼层号正确输出的具体方法代码

在官方的wiki中,针对评论部分的标签调用是集成了评论楼号的,即标签{$comment.FloorID}。这个标签是不计算子评论的,所以并不是采用key直接计算出的楼号。经过测试,我们会发现,这个楼号存在一定BUG!具体表现…

php 一键登录插件,FastAdmin一键管理插件

FastAdmin中的插件可以通过命令行快速的进行安装、卸载、禁用和启用。准备工作请确保你的FastAdmin已经能正常登录后台请确保php所在的目录已经加入到系统环境变量,否则会提示找不到该命令打开命令行控制台进入到FastAdmin根目录,也就是think文件所在的目…

java代码复数包括虚部和实部,Java中编写Applet程序验证复数类(在问题补充中)实现接收用户输入的复数的实部和虚部,计算复数与复数,复数与实数的加减,乘除操作...

2008-11-16 回答我把方法给你写出来,测试程序的主函数你就自己写把/*** Cigarette ash Inc.* author 烟灰* version 1.00 2008/6/7*///编写一个类ComplexNumber实现复数的运算:public class ComplexNumber {double m_dRealPart;double m_dImaginPart;public Complex…

matlab怎么重新打开新的代码,方程求解程序代码求助-程序代码修改或新的代码...

很简单的方程求解程序,调用mulDNewton函数求解,之前在Matlab 2011b版本上运行成功,现在在Matlab 2018a版本上总是出错,程序代码和出错的提示如下,mulDNewton函数代码也如下。请教大神该程序应该如何修改,请…

matlab实验函数编写与程序设计,matlab实验四函数编写与程序设计.doc

实验四:函数编写与程序设计一、实验目的1 . 掌握M文件的创建。2.掌握函数的编写规则。3.掌握函数的调用。4 . 掌握基本的输入输出函数以及显示函数的用法。5.会用Matlab程序设计实现一些工程算法问题。二、实验内容1 . 设计程序&a…

php静态数组变量初始化,为什么数组初始化时,赋值不能是常量?

刚刚发现的一个很奇怪的现象下面这个数组我设置为类的属性,其中SYSTEM_LIB为我定义的常量final class Application { public static $_libarray( route > SYSTEM_LIB./lib_route.php, mysql > SYSTEM_LIB./lib_mysql.php, );}但最终运行时报错为Parse error: …

php比例算法,图片比例转换算法

项目要求将图片上传的任意图片按固定比例进行转换,没办法自己就写了一个,代码如下:public function cropImage($imagePath, $savePath, $scale){$imgHandler $this->model(Picture_Model_Image);$imgHandler->setSrcImg($imagePath);$…

oracle安装过程掉电,Oracle数据库掉电后ORA-01172磁盘坏块解决方法

由于服务器突然掉电,重启机器后发现数据库无法启动。数据库版本 Oracle10201,OS REDHAT 5.4数据库无归档,无备份 [oraclehuna由于服务器突然掉电,重启机器后发现数据库无法启动。数据库版本 Oracle10201,,O…

php sqlite id自增,Android sqlite设置主键自增长的方法教程

今天在APP中增加一个添加项目的功能,项目的主键为整数,要让它自增长。既然要自增长,那么在代码里面就不用给id字段赋值。但是调试的时候发现不行,提示主键重复,观察了输出,不赋值的话,id默认为0…

oracle flashback 深入研究,oracle 之flashback 深入研究。

oracle 之flashback 深入研究。今天是2013-08-24,开始进行oracle flashback 内部原理研究,记录一下笔记。SQL> startupORACLE instance started.Total System Global Area 405020672 bytesFixed Size 2213816 bytesVariable Size …

linux删除了mount目录,Linux记录-分区(df/fdisk/mount/umount/fuser)

1.查看磁盘挂载(df -TH)2.卸载umount /dev/vdb13.查杀用户进程(fuser -m -v -i -k /dev/vdb1)4.再次卸载umount /dev/vdb1,并查看挂载信息df -TH5.删除分区(fdisk /dev/vdb m d 1 d w)6.查看分区(fdisk -l,没有Start-End磁盘分区表示可用)7.添加分区(fdi…

linux中pak命令,如何在Linux系统中安装Flatpak

选择你的Linux发行版快速安装Flatpak及使用Flatpak。支持Ubuntu、Fedora、Red Hat Enterprise Linux、Deepin、Endless OS、Linux Mint、openSUSE、Arch、Debian、CentOS、Gentoo、Solus、Alpine、Mageia、Pop!_OS、elementary OS、Raspbian。以下为你逐一介绍如何在这些Linux版…