0

我有一个作为类参数的方法dummyA但我需要将子类的实例传递 B给该方法。我知道: Java 转换是否会引入开销?为什么? java中的向下转换有开销。我的大部分代码都处理子类B,所以我不为此目的使用向下转换。cc相反,我为此目的使用时间实例变量。但这不是对 subclass 的对象进行更改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
4

4 回答 4

3

在您的特定示例中,父类和子类都声明了一个带有 name 的字段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

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

在你的方法中

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

的静态类型tA这样你将修改父类变量的值。

于 2013-09-13T02:54:06.327 回答
1

强制转换告诉编译器引用变量Type在运行时是特定的

于 2013-09-13T02:45:21.253 回答
1

因为 B 正在扩展 A 你不想重新定义变量 a

在回答您的评论时,您的代码应类似于:

class B extends A {

   public int b;

   public B(int a, int b) {
    super(a);
    this.b = b;
   }
}
于 2013-09-13T02:50:51.853 回答
0

IMO,您的示例代码不是完美的继承实现。继承使您能够重用代码。换句话说,您不需要int a在 class 中再次声明B

我也需要更改可用的变量 cc,例如变量 m:

但是,如果您也想更改变量,请在和中将变量cc声明a, b为私有/受保护。并在这两个类中提供 setter 和 getter。在课堂上打电话如下。ABBsuper.setA(a)

class B extends A {

    private int a;
    private int b;

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

    public setA(int a) {
        super.setA(a);
        this.a = a;
    }
}
于 2013-09-13T03:19:24.063 回答