有两个类Base
和A
。
class Base{
protected int f1;
}
class A extends Base{
private int f2;
}
我有一个A的实例:
A a = new A();
现在,我想要Base
的{{1}}个实例,所以:
a
但Base b = a;
在运行时不是简单b
,而是Base
!
所以,我必须这样做:
a
练习太糟糕了!它再次成为新的基地。
我知道比在init类A之前,超类Base必须参与。
所以我的问题是:是否有一种快速获取超级实例的方法?
就像这样:
Base b = new Base();
b.f1 = this.f1;
编辑:我只想要一个来自A实例的Base进行序列化,bucasue f2不需要序列化。
答案 0 :(得分:1)
首先,回答你的问题...
有没有快速的方法来获得没有新的超级实例?
实际上没有简单的方法可以在没有new
关键字的情况下创建任何实例。期。 (例外情况有所改进:有一个反序列化机制和一个克隆机制。但是暂时忘掉它们。)
其次,我猜你有一些误解。您描述了一个示例,您在其中创建了A
实例:
A a = new A();
new A()
部分创建实例,A a
部分声明类型为A
的变量。然后赋值(=)将对新创建的实例的引用存储在变量中。
声明
Base b = a;
不会创建新实例。实际上,它只是声明一个新变量(在运行时将在堆栈上分配一些内存),为变量a
包含相同的引用。结果是,变量a
和b
都将引用相同的实例。
您是对的,在运行时,此实例将是A
实例。变量a
和b
之间的唯一区别是编译时:编译器只允许对b
类型中声明的变量Base
进行方法调用和字段访问
答案 1 :(得分:1)
如果您不希望序列化f2,请使用transient关键字。
class A extends Base{
private transient int f2;
}
f2将不再被序列化。
答案 2 :(得分:0)
我也不确定你的要求。如果你想访问基类方法或变量,那么你需要使用super keyword..like
从你的A类方法中调用它。class Base{
protected int f1;
public void methodBase()
{
System.out.println("hello from Base");
}
}
class A extends Base{
private int f2;
public void methodA()
{
f2 =super.f1;
System.out.println("Hello from SubClass "+ f2);
super.methodBase();
}
}
公共类BasePackage {
/**
* @param args
*/
public static void main(String[] args) {
A ob = new A();
ob.methodA();
System.out.println();
}