草庐IT

java - Java 是否有 "private protected"访问修饰符?

coder 2023-04-26 原文

我看到一些引用文献提到了 Java 中称为 private protected 的访问修饰符(这两个词放在一起):

private protected someMethod() {

}

我发现其中一个提到这个的页面是 here .我的学校课也提到了这个访问修饰符(并说它存在)。但是,使用它会导致 Java 语言出错。

我尝试了变量和方法,我很确定它不存在,但我想解释发生了什么。考虑过,然后拒绝?还是在较新版本的 Java 中被删除了?

编辑:我不是在寻找有关 protected 关键字的信息。

最佳答案

移除访问修饰符

Java 最初确实有 private protected 修饰符,但在 JDK 1.0.2(第一个 stable 版本,我们今天所知的 Java 1.0)中被删除。一些关于 JDK 1.0.2 的教程(herehere)说:

Note: The 1.0 release of the Java language supported five access levels: the four listed above plus private protected. The private protected access level is not supported in versions of Java higher than 1.0; you should no longer be using it in your Java programs.

另一个 answer on SoftwareEngineering.SE状态:

Java originally had such a modifier. It was written private protected but removed in Java 1.0.

现在看看 Java Version History :

JDK 1.0

The first version was released on January 23, 1996 and called Oak. The first stable version, JDK 1.0.2, is called Java 1.

由此,我们可以得出结论,关于版本 1.0.2 的教程指的是第一个版本 JDK 1.0,其中语言称为 Oak,但 SoftwareEngineering.SE 的版本指的是第一个稳定版本 JDK 1.0。 2 称为 Java 1.0,并在其中被删除。

现在,如果您尝试在 Java 1.0 documentation 中搜索它,你不会找到它,因为如前所述,它在 JDK 1.0.2 中被删除,也称为 Java 1.0。当您查看您发布的链接的“上次修改时间”时,再次证明了这一点。您发布的链接最后一次修改是在 1996 年 2 月。Java 1.0/JDK 1.0.2,当 private protected 被删除时,在 1996 年 2 月之后发布,并且根据规范,1996 年 8 月。

移除原因

一些来源也解释了private protected的原因,例如this一。引用:

What was private protected?

Early on, the Java language allowed for certain combinations of modifiers, one of which was private protected. The meaning of private protected was to limit visibility strictly to subclasses (and remove package access). This was later deemed somewhat inconsistent and overly complex and is no longer supported.[5]

[5] The meaning of the protected modifier changed in the Beta2 release of Java, and the private protected combination appeared at the same time. They patched some potential security holes, but confused many people.

SoftwareEngineering.SE 也支持这一点,表示不值得出现不一致和额外的复杂性,因此很早就将其删除。

解读

我对这一切的解释是,也许早在橡树时代,两者都被允许共存(因此组合)。由于 protected 的含义已经改变1,因此可能需要允许 privateprotected 在同时。介绍变得太复杂,不值得,所以最后被放弃了。在 Java 1.0/JDK 1.0.2 推出时,它已被删除,因此无法在文档中找到。


1Oak Language Specification ,第 4.10 节,访问变量和方法,注意到默认修饰符是 protected:

By default all variables and methods in a class are protected.

这与我们今天的默认包访问完全不同。这可能为 private protected 的需要铺平了道路,因为 private 限制性太强,而 protected 太宽松。

关于java - Java 是否有 "private protected"访问修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41431533/

有关java - Java 是否有 "private protected"访问修饰符?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  7. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  8. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  9. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  10. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

随机推荐