gpt4 book ai didi

Java:集合中的对象

转载 作者:行者123 更新时间:2023-11-30 06:11:04 24 4
gpt4 key购买 nike

Vector v = new Vector();
String a = "element";
String b = "element";
v.add(a);
v.contains(b) // true

所以我的问题是:如果 vector 中元素的类型是Object比如何contains比较 Object里面有 String外面如果equals()未被覆盖为 Object我想知道表面下发生了什么。

最佳答案

参见 here :

Returns true if this vector contains the specified element. More formally, returns true if and only if this vector contains at least one element e such that (o==null ? e==null : o.equals(e)).

.equals最终被调用的是被覆盖的 .equals .事实上,方法参数是用 Object 键入的并不意味着 vector 将使用 .equals Object 的方法类(class);它将使用重写的 .equals方法(如果存在)(否则使用从 Object 继承的方法)。正在键入的参数 Object只是意味着你可以传入任何 Object 类型的东西(String 是,因为所有 Java 类都继承自 Object)。

您的困惑源于这样一个事实,即在运行时 调用的方法取决于调用其方法的对象的实际类型。查看 runtime evalution of method invocations 上的 JLS 部分更多细节。你可以看到它提到了一个“目标引用”,它是你正在调用其方法的对象。

考虑否则会发生什么:行为会根据方法参数 的类型而改变,而不是实例 的类型。这将彻底击败多态!考虑经常使用的 Animal示例:假设有一个名为 makeNoise() 的方法返回字符串 "Noise!" .现在你有两个子类 DogCat覆盖了返回 "Woof!" 的方法和 "Meow!"分别。现在假设您有这种方法:

public void animalNoiseMaker(Animal animal) {
System.out.println(animal.makeNoise());
}

按照您的预期进行,无论您是否通过了 DogCat例如,它会调用 makeNoiseAnimal每次打印Noise!因为参数类型是Animal .这不是很有用的行为。

关于Java:集合中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34729411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com