gpt4 book ai didi

java - javacast如何工作,是改变对象的状态还是创建新的对象?

转载 作者:行者123 更新时间:2023-12-01 17:21:01 28 4
gpt4 key购买 nike

我有一个方法dummy,其中A作为类参数,但我需要将子类B的实例传递给该方法。我从以下地方知道: Does Java casting introduce overhead? Why?java中的向下转型是有开销的。我的大部分代码都处理子类 B 所以我不使用向下转型来达到这个目的。相反,我使用临时实例变量 cc 来实现此目的。但这并不是对子类m的对象进行更改。我也需要更改可用的变量cc,例如变量m。这是我的代码:

public class TestCast {

public TestCast() {
B m = new B(12, 3);
dummy(m);
A cc = m;
dummy(cc);
System.out.println(m.a);
System.out.println(cc.a);
}

public void dummy(A t) {
t.a = 22222;
}

public static void main(String[] args) {
new TestCast();
}
}

class A {
public int a = 0;

public A(int a) {
this.a = a;
}
}

class B extends A {

public int a;
public int b;

public B(int a, int b) {
super(a);
this.a = a;
this.b = b;
}
}

带输出

12
22222

最佳答案

在您的特定示例中,父类和子类都声明了一个名为 a 的字段。在这种情况下,子变量隐藏了父变量。

此外,变量/字段不是像方法那样的多态实体。它们通过引用的静态类型进行访问。

换句话说,就是字段访问

A var = new A(10);
var.a; // returns 10

以及现场访问

A var = new B(1501, 10); 
var.a; // also returns 10

但是

A var = new B(1501, 10); 
var.a; // returns 10
((B)var).a; // returns 1501

因为您访问静态类型 B 的引用上的 a

在你的方法中

public void dummy(A t) {
t.a = 22222;
}

t 的静态类型是 A,因此您将修改父类变量的值。

关于java - javacast如何工作,是改变对象的状态还是创建新的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18777448/

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