java题 为啥//@Override才不报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java题 为啥//@Override才不报错相关的知识,希望对你有一定的参考价值。

但是在别人的那里运行正常 我用的是my eclipse 6.0.m1

对JDK 1.5的兼容级别,@Override不得用于继承Interface的子类方法指示,只能用于继承Class的子类方法指示
对JDK1.6的兼容级别,任意继承方法均可使用@Override

注意: Tomcat 6.0及以后版本,才能提供 JDK 6.0的兼容性支持

@Override

指示子类的某个方法是override父类的某个方法,假如这个父类相应的那个方法签名没有找到,那么编译器会提示错误信息。

这个注释仅仅用于子类和父类,而不能用于类和接口

作用:确保子类的方法签名和父类的一致,以保证双方的方法签名一致
参考技术A 这就由于jdk版本的问题,@Override是JDK5就已经有了,但是不支持对接口的实现,认为这不是Override而报错。JDK6修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Override。

jvm啥时候在对象头中分配hashcode值

【中文标题】jvm啥时候在对象头中分配hashcode值【英文标题】:When does the jvm assign hashcode value in the object headerjvm什么时候在对象头中分配hashcode值 【发布时间】:2017-02-23 10:59:50 【问题描述】:

了解到java的object header包含hashcode、gc year、biased lock等信息。然后一个谜题出现在我面前,为了明确地表达我的问题。我举个例子。 代码如下:

public class Demo
    @Override
    public int hashCode()
        System.out.println("the hashCode method was called");
        return super.hashCode();
    

    public static void main(String[] args)
        Demo demo = new Demo();
        System.out.println("after generate an object");
        //
        Set<Demo> set = new HashSet<Demo>();
        set.add(demo);
    

还有输出:

after generate an object
the hashCode method was called

我猜当我们新建一个对象时,jvm 会在对象头中设置 hashcode。但是如果为了生成 hashCode 它应该调用这个对象的 hashCode 方法然而根据输出似乎它没有调用 hashCode 方法 当新的对象。并将值添加到 hashSet 中,调用 hashCode 方法,这正如预期的那样。

所以我的问题是:jvm 什么时候在对象头中分配哈希码值?发生在新建对象的阶段?

如果是。为什么它没有调用hashcode方法,没有这个怎么计算这个对象的hashcode。 如果不是。呃……每次调用 invoke hashCode 方法时更新 object header 中的 hashcode 是没有意义的。

【问题讨论】:

【参考方案1】: JVM不需要调用hashCode方法来初始化对象的标识hashCode。反之亦然:Object.hashCodeSystem.identityHashCode 调用 JVM 来计算或提取之前计算的身份 hashCode。 未指定 JVM 如何生成和存储身​​份 hashCode。不同的 JVM 实现可能会有所不同。 HotSpot JVM 在第一次调用 Object.hashCodeSystem.identityHashCode 时计算身份 hashCode 并将其存储在对象头中。随后的调用只是从标头中提取先前计算的值。

【讨论】:

在对象创建过程中,身份哈希码不是计算并保存在对象头中吗? @Sher10ck 不会。这会显着降低对象分配的性能。【参考方案2】:

我认为您混淆了哈希码和身份哈希码。

对象的哈希码不会存储在对象头中,而是根据需要通过调用哈希码方法计算得出。在您的示例中调用哈希码是因为您将对象添加到 HashSet

标识哈希码由 JVM 在创建对象时计算,并作为对象哈希码值的后备服务(除其他外)。即Object.hashcode() 将返回您的对象的身份哈希码。此值在对象的生命周期内不会发生变化。

更多详情请参阅this question。

【讨论】:

以上是关于java题 为啥//@Override才不报错的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu下为啥每次重启都要source一下/etc/profile才能显示java的版本?

Eclipse、Maven:为啥自动生成的Source Folder是src/main/java

为啥每次进入命令都要重新source /etc/profile 才能生效

为啥用maven时,eclipse自动生成的src/main/java等source folder missing

精选力扣500题 第47题 LeetCode 113. 路径总和 IIc++/java详细题解

jdk和tomcat都配置安装好了,为啥在浏览器上输入http://localhost:8090,还是不能正常访问