为什么通过实例调用静态方法不会给 Java 编译器带来错误?

2023-12-22

我相信你们都知道我的意思 - 代码例如:

Thread thread = new Thread();
int activeCount = thread.activeCount();

引发编译器警告。为什么不是错误呢?

EDIT:

需要明确的是:问题与线程无关。我意识到在讨论这个问题时经常会给出线程的例子,因为它们可能会把事情搞砸。但真正的问题是这样的用法是always胡言乱语,你不能(有能力)写出这样的电话并认真执行。这种类型的方法调用的任何例子都是愚蠢的。这是另一个:

String hello = "hello";
String number123AsString = hello.valueOf(123);

这使得每个 String 实例看起来都带有一个“String valueOf(int i)”方法。


基本上我相信Java设计者在设计该语言时犯了一个错误,并且由于涉及兼容性问题而修复它为时已晚。是的,它可能会导致非常具有误导性的代码。是的,你应该避免它。是的,您应该确保您的 IDE 配置为将其视为错误,IMO。如果您自己设计一种语言,请记住它作为要避免的事情的示例:)

为了回应 DJClayworth 的观点,以下是 C# 中允许的内容:

public class Foo
{
    public static void Bar()
    {
    }
}

public class Abc
{
    public void Test()
    {
        // Static methods in the same class and base classes
        // (and outer classes) are available, with no
        // qualification
        Def();

        // Static methods in other classes are available via
        // the class name
        Foo.Bar();

        Abc abc = new Abc();

        // This would *not* be legal. It being legal has no benefit,
        // and just allows misleading code
        // abc.Def();
    }

    public static void Def()
    {
    }
}

为什么我觉得它有误导性?因为如果我看代码someVariable.SomeMethod()我希望它能使用的值someVariable. If SomeMethod()是静态方法,该期望无效;代码在欺骗我。这怎么可能是一个good thing?

奇怪的是,Java 不允许您使用可能未初始化的变量来调用静态方法,尽管事实上它将使用的唯一信息是变量的声明类型。这是一个不一致且无益的混乱。为什么允许呢?

编辑:此编辑是对 Clayton 答案的回应,该答案声称它允许静态方法的继承。事实并非如此。静态方法不是多态的。这是一个简短但完整的程序来证明这一点:

class Base
{
    static void foo()
    {
        System.out.println("Base.foo()");
    }
}

class Derived extends Base
{
    static void foo()
    {
        System.out.println("Derived.foo()");
    }
}

public class Test
{
    public static void main(String[] args)
    {
        Base b = new Derived();
        b.foo(); // Prints "Base.foo()"
        b = null;
        b.foo(); // Still prints "Base.foo()"
    }
}

如您所见,执行时间值b被完全忽略。

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

为什么通过实例调用静态方法不会给 Java 编译器带来错误? 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • g++ -std=c++0x 出现意外编译问题

    使用 g std c 0x 编译时 我遇到一些编译问题 将 T 类型的元素推回向量 这是一个最小的例子 include
  • Shell 脚本 If [ -f ./file ]

    我正在自学 shell 脚本 我正在研究如何执行 If 但我不明白一个例子 if f NAME tar then do something else something else 现在我做了一些实验 我给 NAME 提供了我目录中的一个文件
  • 使用 SimpleXMLElement 从对象获取数组

    我在获取这些对象中的数组时遇到一些问题 当我 print r 时 会打印以下代码 message object 是对象的名称 SimpleXMLElement Object header gt SimpleXMLElement Object
  • 在 iOS 中绘制多点路线

    我正在尝试在提供的地图应用程序中显示具有多个点的路线 我已经弄清楚如何显示以下两点之间的路线这个帖子 https stackoverflow com q 4609340 620197 我正在建立以下多个点的列表这些方向 http mapki
  • 从旋转的 UIImageView 创建 UIImage

    我有一个 UIImageView 里面有一张图片 我在显示之前通过将 UIImageView 的变换属性设置为 CGAffineTransformMakeRotation angle 来旋转图像 其中 angle 是以弧度为单位的角度 我希
  • 从 LAN 网络中的另一台 PC 访问 Wamp 2.5 phpmyadmin

    我可以从另一台电脑访问 wamp localhost 但是从这台电脑访问 phpmyadmin 时我无法访问如下图 在 WAMPServer 上 配置了 phpMyAdmin 工具 以便除了运行 WAMPServer 的 IP 之外 无法从
  • 如何使用 Angular 的 ngFor 实现项目重新排序/随机播放动画?

    Vue 用户很容易实现这样的 item shuffle 动画 请参阅他们的官方文档 我搜索了很多 但找不到适合 Angular 用户的解决方案 ngFor似乎在洗牌时切换项目内容而不是移动项目 这是我的演示 http embed plnkr
  • 在 PHP 中获取给定一周的开始天和结束天

    我正在尝试使用星期日作为开始日期和参考日期来获取周范围 例如 date 但我似乎无法弄清楚 例如 如果 date 为 2009 05 01 我将得到 2009 04 26 和 2009 05 02 2009 05 10 将产生 2009 0
  • ember 中具有多个步骤的手风琴向导

    我正在使用 ember 构建一个 巫师手风琴 基本上我想要的是 始终显示的手风琴 手风琴包含所有步骤 一个步骤处于活动状态 但也可能更改先前步骤的标题 每个步骤都有自己的模型 例如 第一步从国家 地区中选择 第二步从产品中选择 应该可以在步
  • UIView autoresizingMask问题

    在 iPad 中 我有一个 UIViewController 里面有另一个 UIview 位于底部 UIView Controller X UIView 是 X 我在 UIViewController 的 viewDidLoad 上为其定义
  • 数据库设计中的多对多关系

    我目前有一个数据库 其中有两个表 分别称为 Articles 和 Tags 为了允许文章属于多个类别 我有多对多的关系 这样的设计从性能上来说是不是一个错误呢 或者我应该删除这两个表之间的关系并添加第三个表作为桥梁 articlesTags
  • 如何在单击按钮时通过动画显示视图?

    我是编码新手 我正在制作一个应用程序 我需要在单击按钮时显示一个视图 并且该视图应该看起来像是来自按钮本身 再次单击该按钮时 视图应返回到按钮 动画 我有翻转 卷曲等动画 但我不知道该怎么做 这是一个简单的例子 放showView 作为按钮
  • 如何访问django项目之外的目录文件?

    我的 Django 项目在 RHEL 7 操作系统上运行 项目在路径中 root project 项目托管在 httpd 服务器上 现在我正在尝试访问目录之外的文件 例如 root data info test txt 我应该如何访问vie
  • 如何在 JSF 2 中创建自定义转换器?

    我有一个名为 操作 的实体 Entity Table name operation public class Operation implements Serializable private static final long seria
  • 如何获得值的二进制表示形式[重复]

    这个问题在这里已经有答案了 可能的重复 C 中十进制到二进制的转换 https stackoverflow com questions 2954962 decimal to binary conversion in c 我有 3 432 1
  • site.css 不适用于我的示例网站

    这里是新手 我在 VS2010 中创建了一个空的 MVC 项目 并且正在尝试格式化我的视图以进行身份 验证 所以 我将其添加到 site css 中 rez color Olive 我的看法是 using Html BeginForm di
  • Django 静态文件(css)不起作用

    由于某种原因 我似乎无法包含我的引导 css 文件 我对 Python 和 Django 特别陌生 所以我肯定做错了什么 姜戈 1 9 2 读完后Django 官方解释 https docs djangoproject com en 1 9
  • Bootstrap:如何将按钮放置在输入组旁边

    我无法弄清楚 符合 正确的引导 如何让按钮位于 div 内的输入组旁边 它们需要居中对齐 这就是我想要的样子 这就是正在发生的事情 这是我当前的代码 div div div div
  • Boost变体apply_visitor编译错误

    这个简单的 boost variant 和 boost apply visitor 示例代码 include
  • 为什么通过实例调用静态方法不会给 Java 编译器带来错误?

    我相信你们都知道我的意思 代码例如 Thread thread new Thread int activeCount thread activeCount 引发编译器警告 为什么不是错误呢 EDIT 需要明确的是 问题与线程无关 我意识到在