将子类转换为具有高性能的真正超类

时间:2014-04-03 05:54:14

标签: java performance superclass

有两个类BaseA

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不需要序列化。

3 个答案:

答案 0 :(得分:1)

首先,回答你的问题...

  

有没有快速的方法来获得没有新的超级实例?

实际上没有简单的方法可以在没有new关键字的情况下创建任何实例。期。 (例外情况有所改进:有一个反序列化机制和一个克隆机制。但是暂时忘掉它们。)

其次,我猜你有一些误解。您描述了一个示例,您在其中创建了A实例:

A a = new A();

new A()部分创建实例,A a部分声明类型为A的变量。然后赋值(=)将对新创建的实例的引用存储在变量中。

声明

Base b = a;

不会创建新实例。实际上,它只是声明一个新变量(在运行时将在堆栈上分配一些内存),为变量a包含相同的引用。结果是,变量ab都将引用相同的实例。

您是对的,在运行时,此实例将是A实例。变量ab之间的唯一区别是编译时:编译器只允许对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();
}