有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java高性能地将子类转换为真正的超类

有两个类BaseA

class Base{
    protected int f1;
}
class  A extends Base{
    private int f2;
}

我有一个例子:

A a = new A();

现在,我想要一个Basea实例,因此:

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


共 (3) 个答案

  1. # 1 楼答案

    如果不希望f2被序列化,请使用transient关键字

    class  A extends Base{
        private transient int f2;
    }
    

    f2将不再被序列化

  2. # 2 楼答案

    我也不确定你的要求。如果要访问基类方法或变量,则需要使用super关键字从类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();
    }
    

    }

    公共类基类包{

    /**
     * @param args
     */
    public static void main(String[] args) {
        A ob = new A();
        ob.methodA();
        System.out.println();
    }
    
  3. # 3 楼答案

    首先,回答你的问题

    Is there a quick way to get super instance without new?

    事实上,没有new关键字,就没有简单的方法来创建任何实例。时期(例外情况有点高级:有反序列化机制和克隆机制。但现在就忘了它们。)

    第二,我想你有一些误解。您描述了一个示例,其中创建了一个A实例:

    A a = new A();
    

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

    声明

    Base b = a;
    

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

    您是对的,在运行时这个实例将是一个A实例。变量ab之间的唯一区别在于编译时:编译器只允许对Base类型中声明的变量b进行方法调用和字段访问