java高性能地将子类转换为真正的超类
有两个类Base
和A
class Base{
protected int f1;
}
class A extends Base{
private int f2;
}
我有一个例子:
A a = new A();
现在,我想要一个Base
的a
实例,因此:
Base b = a;
但是b
在运行时不是一个简单的Base
,它是a
因此,我必须这样做:
Base b = new Base();
b.f1 = this.f1;
这种做法太糟糕了!它又是一个新的基地
我知道在初始化类A之前,超类基类必须初始化
所以我的问题是:有没有一种快速的方法可以在没有新实例的情况下获得超级实例强>
就这样,
class A extends Base{
private int f2;
public Base toSuper(){
return super.this;// or return super
}
}
编辑:我只想从一个实例中获取一个用于序列化的基,而不需要序列化bucasue f2
# 1 楼答案
如果不希望f2被序列化,请使用transient关键字
f2将不再被序列化
# 2 楼答案
我也不确定你的要求。如果要访问基类方法或变量,则需要使用super关键字从类A方法调用它。。像
}
}
公共类基类包{
# 3 楼答案
首先,回答你的问题
事实上,没有
new
关键字,就没有简单的方法来创建任何实例。时期(例外情况有点高级:有反序列化机制和克隆机制。但现在就忘了它们。)第二,我想你有一些误解。您描述了一个示例,其中创建了一个
A
实例:new A()
部分创建实例,A a
部分声明类型为A
的变量。赋值(=)然后将对新创建实例的引用存储在变量中声明
不创建新实例。事实上,它只是声明了一个新变量(在运行时将在堆栈上分配一些内存),将变量
a
包含的引用分配给它。结果将是,变量a
和b
都将引用同一个实例您是对的,在运行时这个实例将是一个
A
实例。变量a
和b
之间的唯一区别在于编译时:编译器只允许对Base
类型中声明的变量b
进行方法调用和字段访问