为什么我们不应该在java中使用受保护的静态

2023-12-29

我正在经历这个问题Java中有没有办法覆盖类变量? https://stackoverflow.com/questions/685300/is-there-a-way-to-override-class-variables-in-java。首先comment https://stackoverflow.com/questions/685300/is-there-a-way-to-override-class-variables-in-java#comment498843_685300获得 122 票赞成的是:

如果你曾经看到过protected static, run.

谁能解释为什么是protected static皱起眉头?


这更多的是一种风格问题,而不是一个直接问题。这表明你没有正确思考课堂上发生的事情。

想一想什么static means:

该变量存在于类级别,它并不单独存在于每个实例中,并且它在扩展我的类中没有独立的存在.

想一想什么protected means:

这个变量可以被这个类看到,同包中的类以及拓展我的课程.

这两个含义并不完全相互排斥,但非常接近。

我能看到的唯一可以将两者一起使用的情况是,如果您有一个旨在扩展的抽象类,并且扩展类可以使用原始类中定义的常量修改行为。但这种安排很可能最终会变得非常混乱,并表明类设计的弱点。

在大多数情况下,最好将常量公开,因为这只会使一切变得更干净,并允许人们进行子类化更加灵活。更不用说,在许多情况下,组合比继承更可取,而抽象类则强制继承。

要查看一个示例来说明这会如何破坏事物并说明我所说的变量不具有独立存在的含义,请尝试以下示例代码:

public class Program {
    public static void main (String[] args) throws java.lang.Exception {
        System.out.println(new Test2().getTest());
        Test.test = "changed";
        System.out.println(new Test2().getTest());
    }
}

abstract class Test {
    protected static String test = "test";
}

class Test2 extends Test {
    public String getTest() {
        return test;
    }
}

您将看到结果:

test
changed

亲自尝试一下:https://ideone.com/KM8u8O https://ideone.com/KM8u8O

班上Test2能够访问静态成员test from Test不需要限定名称 - 但它不会继承或获得自己的副本。它正在查看内存中完全相同的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们不应该在java中使用受保护的静态 的相关文章

  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • Spring安全“记住我”cookie在第一个请求中不可用

    我无法在登录请求后检索 Spring 记住我 cookie 但它在对受保护页面的下一个请求中工作正常 谁能告诉我怎样才能立即得到它 我在登录请求中设置了记住我的 cookie 但在 Spring 重定向回原始 受保护的 url 后无法检索它
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 如果使用的 JVM 是 x86 或 x64,则以不同的方式解决 Maven 依赖关系?

    我设置了一个 Maven 存储库来托管一些 dll 但我需要我的 Maven 项目根据使用的 JVM 是 x86 还是 x64 下载不同的 dll 例如 在运行 x86 版本 JVM 的计算机上 我需要从存储库下载 ABC dll 作为依赖
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • 启动Java项目时发生类冲突:ClassMetadataReadingVisitor将接口org.springframework.asm.ClassVisitor作为超类

    我正在使用最新的Spring框架版本 3 2 2 RELEASE 开发一个Java Web项目 但是现在项目启动时遇到了问题 详细错误是 java lang IncompleteClassChangeError 类 org springfr

随机推荐

  • 从 InnerText 中删除注释行

    我目前正在使用下面的代码来提取 InnerText 但是 发生的情况是我被一堆 html 注释行困住了 lt 如何使用下面的代码删除它们 HtmlWeb hwObject new HtmlWeb HtmlAgilityPack HtmlDo
  • Redmine - Ruby - 寻找自定义字段的值

    我检查了 IRC 的 redmine 但无法获得帮助 我很矛盾 不知道该把这个问题放在 Superuser ServerFault 还是这里 但由于我的问题是面向技术编程的 所以我决定在这里寻求帮助 我们有一个 Mercurial 存储库系
  • 声明类型的 MethodInfo 相等性

    我需要检查两个 MethodInfo 之间的相等性 它们实际上是完全相同的 MethodInfo 除了 ReflectedType 即 DeclaringType 相同 并且方法实际上应该具有相同的主体 有很多方法可以做到这一点 但我正在寻
  • 权限设置为777,文件仍然不可写

    我已将文件权限设置为 777 但无法使用 PHP 写入该文件 我可以在我的 FTP 客户端中清楚地看到该文件具有 0777 权限 当我这样做时 echo true is writable file txt yes no 我得到 不 我也尝试
  • try/catch 块内的 Response.Redirect 异常

    比如说 我有一个 try catch 块 它封装了一大块代码 然后在其中的某个位置我需要这样调用 Response Redirect protected void ButtonGo Click object sender EventArgs
  • java泛型:获取具有泛型参数的类的类

    我很好奇如何进行这项工作 Class
  • R,dplyr:根据条件快速构建互补行列表的函数

    我有一个约 80 000 行 x 26 列的数据集 这些行对应于机器人搭建套件的 SKU 或唯一 ID 这些列对应 26 个不同的机器人部件 一个单元包含了对构建整个机器人的贡献的一部分 行比例的总和可能不会等于 1 0 因为拼搭套装并不总
  • Java (Android) 中的 List 是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 Type 叫什么 https stackoverflow com questions 1286005 what is typetype called List gt 在 java 泛型中意味着什么 h
  • 如何在 MATLAB 中将变量值放入文本字​​符串中?

    我正在尝试编写一个需要两个输入的简单函数 x and y 并将它们传递给其他三个简单的函数 对它们进行加 乘 除操作 然后 主函数应将结果显示为包含以下内容的字符串 x y 以及总数 我认为我对输出参数有些不理解 无论如何 这是我的 可怜的
  • 类存在多个定义

    我正在使用 Kohana 框架 它允许多个类定义 在应用程序和系统子文件夹中 我使用 phpstorm 作为 IDE 它会向我发送消息multiple definitions exist for class 有没有办法告诉 phpStorm
  • 在android中的共享首选项中禁用对话框通知

    我在有铃声的应用程序中有共享偏好 我想禁用通知短信和彩信以及来自应用程序的通知 例如警报通知
  • sql中*是什么意思?

    例如 我知道什么SELECT FROM example table 方法 然而 不知道代码的每一部分的含义 我感到不舒服 SQL 查询的第二部分是您要为所获取的每条记录检索的列的名称 显然 您可以为每个记录检索多个列 并且 仅当您想检索al
  • AngularJS 对许多输入进行数据绑定的方式是什么?

    我正在学习 angularjs 我希望能够让用户输入许多输入 当这些输入被输入list数组元素应该相应改变 我想尝试使用 ngRepeat 指令 但我读到 因为它创建了一个新范围 所以我无法进行数据绑定 div div
  • 如何获取backgroundSession NSURLSessionUploadTask响应

    我已经实现了一个在后台运行的 NSURLSession 因此即使应用程序暂停 它也可以使用系统守护进程继续执行任务 问题是 void URLSession NSURLSession session dataTask NSURLSession
  • 如何以编程方式启用 LAN 唤醒

    有没有办法以编程方式进入 BIOS 并为支持 LAN 唤醒功能的计算机打开该功能 理想情况下 解决方案应该是跨 BIOS 的 但使用单独的解决方案来打击每个主要供应商也是可以的 BIOS 配置是操作系统有意限制的内容 以避免病毒问题 以前有
  • 通过外部“C”链接解决重载问题

    在混合 C C 项目中 我们需要从 C 调用 C 函数 要调用的函数被重载为三个单独的函数 但我们可以从 C 端忽略这一点 我们只需选择最合适的一个并坚持使用该函数 有两种方法可以做到这一点 1 编写一个带有 extern C 函数的小型
  • 升级到 2.4.0 后,Spring Cloud 配置客户端无法从配置服务器获取/加载配置文件

    弹簧云配置客户端无法从中读取配置文件弹簧云配置服务器升级到后2 4 0使用 spring cloud 版本2020 0 0 M6 从 spring boot 2 4 0 版本开始 默认不启用 bootstrapping 需要在你的应用程序中
  • 在 Mac 10.9.2 上安装 WordNet

    我正在尝试在 Mac 操作系统 10 9 2 上安装 WordNet 我尝试过以下方法 配置 make 但期间make我遇到了一些错误 然后我安装了XQuartz 2 7 5 我仍然遇到一些错误make 接下来 我安装了 Xcode 但这仍
  • VHDL-读取HEX文件

    In VHDL 从 HEX 文件初始化 std logic vector 数组 https stackoverflow com questions 20164216 vhdl init std logic vector array from
  • 为什么我们不应该在java中使用受保护的静态

    我正在经历这个问题Java中有没有办法覆盖类变量 https stackoverflow com questions 685300 is there a way to override class variables in java 首先c