每天一道Java面试题——JavaSE基础(二)

4.两个对象值相同(x.equals(y) == true)但却可有不同的 hashCode这句话对不对?

不对,如果两个对象x 和 y 满足 x.equals(y) == true ,它们的哈希码 hash C ode )应当相 同。Java对于 eqauls 方法和 hashCode 方法是这样规定的: :( 如果两个对象相同( equals 方法返回 true ),那么它们的 hashCode 值一定要相同; ;( 如果两个对象的 hashCode 相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在 Set 集合中,同时增加新元素
的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。关于 equals 和 hashCode 方法,很多 J ava 程序 员 都知道,但很多人也就是仅仅知道而已,在 Joshua Bloch的大作《Effective Java 》(很多软件公司,《Effective Java 》、《 Java 编程思想》以及《重构:改善既有代码质量》是 Java 程序员必看书籍,如果你还没看过,那就赶紧去买一本吧)中是这样介绍 equals 方法的 。首先equals 方法必须满足自反性( x.equals(x) 必须返回 true )、对称性 x.equals(y) 返回 true 时, y.equals(x)也必须返回 true )、传递性 x .equals( 和 y.equals(z) 都返回 true 时, x.equals(z) 也必须返回 true )和一致性(当x 和 y 引用的对象信息没有被修改时,多次调用 x.equals(y) 应该得到同样的返回值),而且对于任何非 null 值的引用 xx.equals(null) 必须返回 false 。实现高质量的 equals 方法的诀窍包括: 1. 使用 操作符检查 参数是否为这个对象的引用 2. 使用 instanceof 操作符检查 参数是否为正确的类型 3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配; 4. 编写完 equals 方法后,问自己它是否满足对称性、传递性、一致性; 5. 重写 equals 时总是要重写 hashCode 6. 不要将 equals 方法参数中的 Object 对象替换为其他的类型,在重写时不忘掉@Override 注解。

5. 是否可以继承 String ?

String是final类,不可以被继承
继承String本身就是一个错误的行为,对String类型最好用的重用方式就是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。

6. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

是值传递。 Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。 C++和 C# 中可以通过传引用或传输出参数来改变传入的参数的值 。说明: Java 中没有传引用实在是非常的不方便,这一点在 Java 8 中仍然没有得到改进,正是如此在 Java 编写的代码中才会出现大量的 Wrapper 类(将需要通过方法调用修改的引用置于一个 Wrapper 类中,再将 Wrapper 对象传入方法),这样的做法只会让代码变得臃肿,尤其是让从 C 和 C++ 转型为 Java 程序员的开发者无法容忍。

7. 重载(overload)和重写(override)的区别 重载的方法能否根据返回类型进行区分?

方法的重载和重写都是事先多态的方式,区别在于前者(重载)实现的是编译时的多态性,而后者(重写)实现的是运行时的多态性。重载发生在一个类中,同名的方法如何有不同的参数列表(参数类型、个数不同)则视为重载;
重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回值类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多异常(里氏代换原则)。重载对返回类型没有特殊要求。

方法重载的规则:

  1. 方法名一致,参数列表中参数的顺序、类型、个数不同。
  2. 重载与方法的返回值无关,存在于父类和子类、同类中。
  3. 可以抛出不同异常,可以有不同修饰符。

方法重写的规则:

  1. 列表参数必须完全与被重写的方法一致,返回类型必须完全与被重写的方法一致。
  2. 构造方法不能被重写,声明为final的方法不能被重写,声明为static的方法不能被传送线,但是能够被再次声明。
  3. 访问权限不能比父类中被重写方法的访问权限更低。
  4. 重写的方法能够抛出任何非强制异常(UncheckedException,也叫非运行时异常),无论被重写的方法是否抛出异常。但是重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值